Re: [PATCH v2 3/5] i2c: i2c-stm32f7: add driver
From: Pierre Yves MORDRET <hidden>
Date: 2017-06-29 14:41:44
Also in:
linux-arm-kernel, linux-i2c, lkml
SGVsbG8NCg0KT24gMDYvMjcvMjAxNyAxMDo1MSBQTSwgVXdlIEtsZWluZS1Lw7ZuaWcgd3JvdGU6DQo+IEhlbGxvLA0KPiANCj4ganVzdCBhIHF1aWNrIHJldmlldyBhcyBsYXN0IGFjdCBpbiB0aGUgbmlnaHQuIEkgZG9uJ3QgY2xhaW0gdG8gY2F0Y2gNCj4gZXZlcnl0aGluZyBhdCB0aGlzIHRpbWUgb2YgdGhlIGRheS4gU28gZG9uJ3QgYmUgc3VycHJpc2VkIGlmIEkgc3RpbGwNCj4gZmluZCBzb21ldGhpbmcgdG8gY3JpdGljaXplIGFmdGVyIHlvdSBmaXhlZCBldmVyeXRoaW5nLiBCdXQga2VlcGluZyB0aGlzDQo+IHVudGlsIEkgZmluZCB0aW1lIHRvIGxvb2sgYWdhaW4gc2VlbXMgd3JvbmcgdG8gbWUuDQo+IA0KPiBPbiBUdWUsIEp1biAyMCwgMjAxNyBhdCAwMTo0MToyOFBNICswMjAwLCBQaWVycmUtWXZlcyBNT1JEUkVUIHdyb3RlOg0KPj4gVGhpcyBwYXRjaCBhZGRzIGluaXRpYWwgc3VwcG9ydCBmb3IgdGhlIFNUTTMyRjcgSTJDIGNvbnRyb2xsZXIuDQo+Pg0KPj4gU2lnbmVkLW9mZi1ieTogTSdib3VtYmEgQ2VkcmljIE1hZGlhbmdhIDxjZWRyaWMubWFkaWFuZ2FAZ21haWwuY29tPg0KPj4gU2lnbmVkLW9mZi1ieTogUGllcnJlLVl2ZXMgTU9SRFJFVCA8cGllcnJlLXl2ZXMubW9yZHJldEBzdC5jb20+DQo+PiAtLS0NCj4+IENoYW5nZXMgaW4gVjI6DQo+PiAgICAqIFJlbW92ZSBzdCxpMmMtdGltaW5nIGJpbmRpbmcgdXNhZ2UNCj4+ICAgICogSW1wbGVtZW50IGFuIEkyQyB0aW1pbmdzIGNvbXB1dGF0aW9uIGFsZ29yaXRobSBpbnN0ZWFkIG9mIHN0YXRpYw0KPj4gICAgICB2YWx1ZXMoYmluZGluZ3MpLiBBbGdvcml0aG0gdXNlcyBnZW5lcmljIEkyQyBTQ0wgRmFsbGluZy9SaXNpbmcNCj4+ICAgICAgYmluZGluZ3MgYW5kIFN5c3RlbSBjbG9jayB0byBjb21wdXRlIGl0cyB0aW1pbmdzLg0KPj4gLS0tDQo+PiAgIGRyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnICAgICAgIHwgIDEwICsNCj4+ICAgZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlICAgICAgfCAgIDEgKw0KPj4gICBkcml2ZXJzL2kyYy9idXNzZXMvaTJjLXN0bTMyZjcuYyB8IDk2OCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysNCj4+ICAgMyBmaWxlcyBjaGFuZ2VkLCA5NzkgaW5zZXJ0aW9ucygrKQ0KPj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zdG0zMmY3LmMNCj4+DQo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcgYi9kcml2ZXJzL2kyYy9idXNzZXMvS2NvbmZpZw0KPj4gaW5kZXggZWQ3MTA2ZS4uYTk3Yjk4NyAxMDA2NDQNCj4+IC0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnDQo+PiArKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvS2NvbmZpZw0KPj4gQEAgLTg5OSw2ICs4OTksMTYgQEAgY29uZmlnIEkyQ19TVE0zMkY0DQo+PiAgIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUNCj4+ICAgCSAgd2lsbCBiZSBjYWxsZWQgaTJjLXN0bTMyZjQuDQo+PiAgIA0KPj4gK2NvbmZpZyBJMkNfU1RNMzJGNw0KPj4gKwl0cmlzdGF0ZSAiU1RNaWNyb2VsZWN0cm9uaWNzIFNUTTMyRjcgSTJDIHN1cHBvcnQiDQo+PiArCWRlcGVuZHMgb24gQVJDSF9TVE0zMiB8fCBDT01QSUxFX1RFU1QNCj4+ICsJaGVscA0KPj4gKwkgIEVuYWJsZSB0aGlzIG9wdGlvbiB0byBhZGQgc3VwcG9ydCBmb3IgU1RNMzIgSTJDIGNvbnRyb2xsZXIgZW1iZWRkZWQNCj4+ICsJICBpbiBTVE0zMkY3IFNvQ3MuDQo+PiArDQo+PiArCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQ0KPj4gKwkgIHdpbGwgYmUgY2FsbGVkIGkyYy1zdG0zMmY3Lg0KPj4gKw0KPiANCj4gSSB3b25kZXIgaG93IHNpbWlsYXIgSTJDX1NUTTMyRjQgYW5kIEkyQ19TVE0zMkY3IGFyZS4gVGhlcmUgaXMgaGFyZGx5DQo+IGFueSBjb2RlIHNoYXJpbmcgYmV0d2VlbiB0aGVtLiBDYW4gdGhpcyBiZSBpbXByb3ZlZD8NCj4NCg0KVW5mb3J0dW5hdGx5IG5vdC4gRmFjdG9yaXphdGlvbiB3YXMgdHJpZWQgYnV0IElQIGFyZSByYXRoZXIgZGlmZmVyZW50IHRvIA0KYmUgcHV0IGluIGEgc2luZ2xlIHNvdXJjZSBmaWxlLg0KDQo+PiAgIGNvbmZpZyBJMkNfU1RVMzAwDQo+PiAgIAl0cmlzdGF0ZSAiU1QgTWljcm9lbGVjdHJvbmljcyBEREMgSTJDIGludGVyZmFjZSINCj4+ICAgCWRlcGVuZHMgb24gTUFDSF9VMzAwDQo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlIGIvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlDQo+PiBpbmRleCBjODlhNDMxLi44ZWZhM2RkIDEwMDY0NA0KPj4gLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlDQo+PiArKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUNCj4+IEBAIC04Nyw2ICs4Nyw3IEBAIG9iai0kKENPTkZJR19JMkNfU0lNVEVDKQkrPSBpMmMtc2ltdGVjLm8NCj4+ICAgb2JqLSQoQ09ORklHX0kyQ19TSVJGKQkJKz0gaTJjLXNpcmYubw0KPj4gICBvYmotJChDT05GSUdfSTJDX1NUKQkJKz0gaTJjLXN0Lm8NCj4+ICAgb2JqLSQoQ09ORklHX0kyQ19TVE0zMkY0KQkrPSBpMmMtc3RtMzJmNC5vDQo+PiArb2JqLSQoQ09ORklHX0kyQ19TVE0zMkY3KQkrPSBpMmMtc3RtMzJmNy5vDQo+PiAgIG9iai0kKENPTkZJR19JMkNfU1RVMzAwKQkrPSBpMmMtc3R1MzAwLm8NCj4+ICAgb2JqLSQoQ09ORklHX0kyQ19TVU42SV9QMldJKQkrPSBpMmMtc3VuNmktcDJ3aS5vDQo+PiAgIG9iai0kKENPTkZJR19JMkNfVEVHUkEpCQkrPSBpMmMtdGVncmEubw0KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc3RtMzJmNy5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zdG0zMmY3LmMNCj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+PiBpbmRleCAwMDAwMDAwLi45OTQ3YTlkDQo+PiAtLS0gL2Rldi9udWxsDQo+PiArKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXN0bTMyZjcuYw0KPj4gQEAgLTAsMCArMSw5NjggQEANCj4+ICsvKg0KPj4gKyAqIERyaXZlciBmb3IgU1RNaWNyb2VsZWN0cm9uaWNzIFNUTTMyRjcgSTJDIGNvbnRyb2xsZXINCj4+ICsgKg0KPj4gKyAqIFRoaXMgSTJDIGNvbnRyb2xsZXIgaXMgZGVzY3JpYmVkIGluIHRoZSBTVE0zMkY3NXh4eCBhbmQgU1RNMzJGNzR4eHggU29jDQo+PiArICogcmVmZXJlbmNlIG1hbnVhbC4NCj4+ICsgKiBQbGVhc2Ugc2VlIGJlbG93IGEgbGluayB0byB0aGUgZG9jdW1lbnRhdGlvbjoNCj4+ICsgKiBodHRwOi8vd3d3LnN0LmNvbS9yZXNvdXJjZS9lbi9yZWZlcmVuY2VfbWFudWFsL2RtMDAxMjQ4NjUucGRmDQo+PiArICoNCj4+ICsgKiBDb3B5cmlnaHQgKEMpIE0nYm91bWJhIENlZHJpYyBNYWRpYW5nYSAyMDE3DQo+PiArICogQXV0aG9yOiBNJ2JvdW1iYSBDZWRyaWMgTWFkaWFuZ2EgPGNlZHJpYy5tYWRpYW5nYUBnbWFpbC5jb20+DQo+PiArICoNCj4+ICsgKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiBpMmMtc3RtMzJmNC5jDQo+PiArICoNCj4+ICsgKiBMaWNlbnNlIHRlcm1zOiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIHZlcnNpb24gMg0KPj4gKyAqLw0KPj4gKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4NCj4+ICsjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4NCj4+ICsjaW5jbHVkZSA8bGludXgvZXJyLmg+DQo+PiArI2luY2x1ZGUgPGxpbnV4L2kyYy5oPg0KPj4gKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4NCj4+ICsjaW5jbHVkZSA8bGludXgvaW8uaD4NCj4+ICsjaW5jbHVkZSA8bGludXgvaW9wb2xsLmg+DQo+PiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPg0KPj4gKyNpbmNsdWRlIDxsaW51eC9vZi5oPg0KPj4gKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+DQo+PiArI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPg0KPj4gKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPg0KPj4gKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4NCj4+ICsjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4NCj4+ICsjaW5jbHVkZSA8bGludXgvc2xhYi5oPg0KPj4gKw0KPj4gKyNpbmNsdWRlICJpMmMtc3RtMzIuaCINCj4+ICsNCj4+ICsvKiBTVE0zMkY3IEkyQyByZWdpc3RlcnMgKi8NCj4+ICsjZGVmaW5lIFNUTTMyRjdfSTJDX0NSMQkJCQkweDAwDQo+PiArI2RlZmluZSBTVE0zMkY3X0kyQ19DUjIJCQkJMHgwNA0KPj4gKyNkZWZpbmUgU1RNMzJGN19JMkNfVElNSU5HUgkJCTB4MTANCj4+ICsjZGVmaW5lIFNUTTMyRjdfSTJDX0lTUgkJCQkweDE4DQo+PiArI2RlZmluZSBTVE0zMkY3X0kyQ19JQ1IJCQkJMHgxQw0KPj4gKyNkZWZpbmUgU1RNMzJGN19JMkNfUlhEUgkJCTB4MjQNCj4+ICsjZGVmaW5lIFNUTTMyRjdfSTJDX1RYRFIJCQkweDI4DQo+IA0KPiBwdWgsIHRoaXMgaXMgcmVhbGx5IGRpZmZlcmVudCB0aGFuIHRoZSBmNCB2YXJpYW50LiBZZXQgYW5vdGhlciBodw0KPiBlbmdpbmVlciB0aGF0IGxpa2VzIGtlZXBpbmcgdGhlIHN3IGd1eXMgYnVzeSA6LXwNCj4gDQoNCkknbSBidXN5DQoNCj4+ICsvKiBTVE0zMkY3IEkyQyBjb250cm9sIDEgKi8NCj4+ICsjZGVmaW5lIFNUTTMyRjdfSTJDX0NSMV9BTkZPRkYJCQlCSVQoMTIpDQo+PiArI2RlZmluZSBTVE0zMkY3X0kyQ19DUjFfRVJSSUUJCQlCSVQoNykNCj4+ICsjZGVmaW5lIFNUTTMyRjdfSTJDX0NSMV9UQ0lFCQkJQklUKDYpDQo+PiArI2RlZmluZSBTVE0zMkY3X0kyQ19DUjFfU1RPUElFCQkJQklUKDUpDQo+PiArI2RlZmluZSBTVE0zMkY3X0kyQ19DUjFfTkFDS0lFCQkJQklUKDQpDQo+PiArI2RlZmluZSBTVE0zMkY3X0kyQ19DUjFfQUREUklFCQkJQklUKDMpDQo+PiArI2RlZmluZSBTVE0zMkY3X0kyQ19DUjFfUlhJRQkJCUJJVCgyKQ0KPj4gKyNkZWZpbmUgU1RNMzJGN19JMkNfQ1IxX1RYSUUJCQlCSVQoMSkNCj4+ICsjZGVmaW5lIFNUTTMyRjdfSTJDX0NSMV9QRQkJCUJJVCgwKQ0KPj4gKyNkZWZpbmUgU1RNMzJGN19JMkNfQUxMX0lSUV9NQVNLCQkoU1RNMzJGN19JMkNfQ1IxX0VSUklFIFwNCj4+ICsJCQkJCQl8IFNUTTMyRjdfSTJDX0NSMV9UQ0lFIFwNCj4+ICsJCQkJCQl8IFNUTTMyRjdfSTJDX0NSMV9TVE9QSUUgXA0KPj4gKwkJCQkJCXwgU1RNMzJGN19JMkNfQ1IxX05BQ0tJRSBcDQo+PiArCQkJCQkJfCBTVE0zMkY3X0kyQ19DUjFfUlhJRSBcDQo+PiArCQkJCQkJfCBTVE0zMkY3X0kyQ19DUjFfVFhJRSkNCj4+ICsNCj4+ICsvKiBTVE0zMkY3IEkyQyBjb250cm9sIDIgKi8NCj4+ICsjZGVmaW5lIFNUTTMyRjdfSTJDX0NSMl9SRUxPQUQJCQlCSVQoMjQpDQo+PiArI2RlZmluZSBTVE0zMkY3X0kyQ19DUjJfTkJZVEVTX01BU0sJCUdFTk1BU0soMjMsIDE2KQ0KPj4gKyNkZWZpbmUgU1RNMzJGN19JMkNfQ1IyX05CWVRFUyhuKQkJKCgobikgJiAweGZmKSA8PCAxNikNCj4+ICsjZGVmaW5lIFNUTTMyRjdfSTJDX0NSMl9OQUNLCQkJQklUKDE1KQ0KPj4gKyNkZWZpbmUgU1RNMzJGN19JMkNfQ1IyX1NUT1AJCQlCSVQoMTQpDQo+PiArI2RlZmluZSBTVE0zMkY3X0kyQ19DUjJfU1RBUlQJCQlCSVQoMTMpDQo+PiArI2RlZmluZSBTVE0zMkY3X0kyQ19DUjJfUkRfV1JOCQkJQklUKDEwKQ0KPj4gKyNkZWZpbmUgU1RNMzJGN19JMkNfQ1IyX1NBREQ3X01BU0sJCUdFTk1BU0soNywgMSkNCj4+ICsjZGVmaW5lIFNUTTMyRjdfSTJDX0NSMl9TQURENyhuKQkJKCgobikgJiAweDdmKSA8PCAxKQ0KPj4gKw0KPj4gKy8qIFNUTTMyRjcgSTJDIEludGVycnVwdCBTdGF0dXMgKi8NCj4+ICsjZGVmaW5lIFNUTTMyRjdfSTJDX0lTUl9CVVNZCQkJQklUKDE1KQ0KPj4gKyNkZWZpbmUgU1RNMzJGN19JMkNfSVNSX0FSTE8JCQlCSVQoOSkNCj4+ICsjZGVmaW5lIFNUTTMyRjdfSTJDX0lTUl9CRVJSCQkJQklUKDgpDQo+PiArI2RlZmluZSBTVE0zMkY3X0kyQ19JU1JfVENSCQkJQklUKDcpDQo+PiArI2RlZmluZSBTVE0zMkY3X0kyQ19JU1JfVEMJCQlCSVQoNikNCj4+ICsjZGVmaW5lIFNUTTMyRjdfSTJDX0lTUl9TVE9QRgkJCUJJVCg1KQ0KPj4gKyNkZWZpbmUgU1RNMzJGN19JMkNfSVNSX05BQ0tGCQkJQklUKDQpDQo+PiArI2RlZmluZSBTVE0zMkY3X0kyQ19JU1JfUlhORQkJCUJJVCgyKQ0KPj4gKyNkZWZpbmUgU1RNMzJGN19JMkNfSVNSX1RYSVMJCQlCSVQoMSkNCj4+ICsNCj4+ICsvKiBTVE0zMkY3IEkyQyBJbnRlcnJ1cHQgQ2xlYXIgKi8NCj4+ICsjZGVmaW5lIFNUTTMyRjdfSTJDX0lDUl9BUkxPQ0YJCQlCSVQoOSkNCj4+ICsjZGVmaW5lIFNUTTMyRjdfSTJDX0lDUl9CRVJSQ0YJCQlCSVQoOCkNCj4+ICsjZGVmaW5lIFNUTTMyRjdfSTJDX0lDUl9TVE9QQ0YJCQlCSVQoNSkNCj4+ICsjZGVmaW5lIFNUTTMyRjdfSTJDX0lDUl9OQUNLQ0YJCQlCSVQoNCkNCj4+ICsNCj4+ICsvKiBTVE0zMkY3IEkyQyBUaW1pbmcgKi8NCj4+ICsjZGVmaW5lIFNUTTMyRjdfSTJDX1RJTUlOR1JfUFJFU0MobikJCSgoKG4pICYgMHhmKSA8PCAyOCkNCj4+ICsjZGVmaW5lIFNUTTMyRjdfSTJDX1RJTUlOR1JfU0NMREVMKG4pCQkoKChuKSAmIDB4ZikgPDwgMjApDQo+PiArI2RlZmluZSBTVE0zMkY3X0kyQ19USU1JTkdSX1NEQURFTChuKQkJKCgobikgJiAweGYpIDw8IDE2KQ0KPj4gKyNkZWZpbmUgU1RNMzJGN19JMkNfVElNSU5HUl9TQ0xIKG4pCQkoKChuKSAmIDB4ZmYpIDw8IDgpDQo+PiArI2RlZmluZSBTVE0zMkY3X0kyQ19USU1JTkdSX1NDTEwobikJCSgobikgJiAweGZmKQ0KPj4gKw0KPj4gKyNkZWZpbmUgU1RNMzJGN19JMkNfTUFYX0xFTgkJCTB4ZmYNCj4+ICsNCj4+ICsjZGVmaW5lIFNUTTMyRjdfSTJDX0RORl9ERUZBVUxUCQkJMA0KPj4gKyNkZWZpbmUgU1RNMzJGN19JMkNfRE5GX01BWAkJCTE2DQo+PiArDQo+PiArI2RlZmluZSBTVE0zMkY3X0kyQ19BTkFMT0dfRklMVEVSX0VOQUJMRQkxDQo+PiArI2RlZmluZSBTVE0zMkY3X0kyQ19BTkFMT0dfRklMVEVSX0RFTEFZX01JTgk1MAkvKiBucyAqLw0KPj4gKyNkZWZpbmUgU1RNMzJGN19JMkNfQU5BTE9HX0ZJTFRFUl9ERUxBWV9NQVgJMjYwCS8qIG5zICovDQo+PiArDQo+PiArI2RlZmluZSBTVE0zMkY3X0kyQ19SSVNFX1RJTUVfREVGQVVMVAkJMjUJLyogbnMgKi8NCj4+ICsjZGVmaW5lIFNUTTMyRjdfSTJDX0ZBTExfVElNRV9ERUZBVUxUCQkxMAkvKiBucyAqLw0KPj4gKw0KPj4gKyNkZWZpbmUgU1RNMzJGN19QUkVTQ19NQVgJCQlCSVQoNCkNCj4+ICsjZGVmaW5lIFNUTTMyRjdfU0NMREVMX01BWAkJCUJJVCg0KQ0KPj4gKyNkZWZpbmUgU1RNMzJGN19TREFERUxfTUFYCQkJQklUKDQpDQo+PiArI2RlZmluZSBTVE0zMkY3X1NDTEhfTUFYCQkJQklUKDgpDQo+PiArI2RlZmluZSBTVE0zMkY3X1NDTExfTUFYCQkJQklUKDgpDQo+PiArDQo+PiArLyoqDQo+PiArICogc3RydWN0IHN0bTMyZjdfaTJjX3NwZWMgLSBwcml2YXRlIGkyYyBzcGVjaWZpY2F0aW9uIHRpbWluZw0KPj4gKyAqIEByYXRlOiBJMkMgYnVzIHNwZWVkIChIeikNCj4+ICsgKiBAcmF0ZV9taW46IDgwJSBvZiBJMkMgYnVzIHNwZWVkIChIeikNCj4+ICsgKiBAcmF0ZV9tYXg6IDEyMCUgb2YgSTJDIGJ1cyBzcGVlZCAoSHopDQo+PiArICogQGZhbGxfbWF4OiBNYXggZmFsbCB0aW1lIG9mIGJvdGggU0RBIGFuZCBTQ0wgc2lnbmFscyAobnMpDQo+PiArICogQHJpc2VfbWF4OiBNYXggcmlzZSB0aW1lIG9mIGJvdGggU0RBIGFuZCBTQ0wgc2lnbmFscyAobnMpDQo+PiArICogQGhkZGF0X21pbjogTWluIGRhdGEgaG9sZCB0aW1lIChucykNCj4+ICsgKiBAdmRkYXRfbWF4OiBNYXggZGF0YSB2YWxpZCB0aW1lIChucykNCj4+ICsgKiBAc3VkYXRfbWluOiBNaW4gZGF0YSBzZXR1cCB0aW1lIChucykNCj4+ICsgKiBAbF9taW46IE1pbiBsb3cgcGVyaW9kIG9mIHRoZSBTQ0wgY2xvY2sgKG5zKQ0KPj4gKyAqIEBoX21pbjogTWluIGhpZ2ggcGVyaW9kIG9mIHRoZSBTQ0wgY2xvY2sgKG5zKQ0KPj4gKyAqLw0KPj4gKw0KPiANCj4gZHJvcCB0aGlzIGVtcHR5IGxpbmUgcGxlYXNlLg0KPiANCg0Kb2sNCg0KPj4gK3N0cnVjdCBzdG0zMmY3X2kyY19zcGVjIHsNCj4+ICsJdTMyCQkJcmF0ZTsNCj4+ICsJdTMyCQkJcmF0ZV9taW47DQo+PiArCXUzMgkJCXJhdGVfbWF4Ow0KPj4gKwl1MzIJCQlmYWxsX21heDsNCj4+ICsJdTMyCQkJcmlzZV9tYXg7DQo+PiArCXUzMgkJCWhkZGF0X21pbjsNCj4+ICsJdTMyCQkJdmRkYXRfbWF4Ow0KPj4gKwl1MzIJCQlzdWRhdF9taW47DQo+PiArCXUzMgkJCWxfbWluOw0KPj4gKwl1MzIJCQloX21pbjsNCj4+ICt9Ow0KPj4gKw0KPj4gKy8qKg0KPj4gKyAqIHN0cnVjdCBzdG0zMmY3X2kyY19zZXR1cCAtIHByaXZhdGUgSTJDIHRpbWluZyBzZXR1cCBwYXJhbWV0ZXJzDQo+PiArICogQHNwZWVkOiBJMkMgc3BlZWQgbW9kZSAoc3RhbmRhcmQsIEZhc3QgUGx1cykNCj4+ICsgKiBAc3BlZWRfZnJlcTogSTJDIHNwZWVkIGZyZXF1ZW5jeSAgKEh6KQ0KPj4gKyAqIEBjbG9ja19zcmM6IEkyQyBjbG9jayBzb3VyY2UgZnJlcXVlbmN5IChIeikNCj4+ICsgKiBAcmlzZV90aW1lOiBSaXNlIHRpbWUgKG5zKQ0KPj4gKyAqIEBmYWxsX3RpbWU6IEZhbGwgdGltZSAobnMpDQo+PiArICogQGRuZjogRGlnaXRhbCBmaWx0ZXIgY29lZmZpY2llbnQgKDAtMTYpDQo+PiArICogQGFuYWxvZ19maWx0ZXI6IEFuYWxvZyBmaWx0ZXIgZGVsYXkgKE9uL09mZikNCj4+ICsgKi8NCj4+ICtzdHJ1Y3Qgc3RtMzJmN19pMmNfc2V0dXAgew0KPj4gKwllbnVtIHN0bTMyX2kyY19zcGVlZAlzcGVlZDsNCj4+ICsJdTMyCQkJc3BlZWRfZnJlcTsNCj4+ICsJdTMyCQkJY2xvY2tfc3JjOw0KPj4gKwl1MzIJCQlyaXNlX3RpbWU7DQo+PiArCXUzMgkJCWZhbGxfdGltZTsNCj4+ICsJdTgJCQlkbmY7DQo+PiArCWJvb2wJCQlhbmFsb2dfZmlsdGVyOw0KPj4gK307DQo+PiArDQo+PiArLyoqDQo+PiArICogc3RydWN0IHN0bTMyZjdfaTJjX3RpbWluZ3MgLSBwcml2YXRlIEkyQyBvdXRwdXQgcGFyYW1ldGVycw0KPj4gKyAqIEBwcmVjOiBQcmVzY2FsZXIgdmFsdWUNCj4+ICsgKiBAc2NsZGVsOiBEYXRhIHNldHVwIHRpbWUNCj4+ICsgKiBAc2RhZGVsOiBEYXRhIGhvbGQgdGltZQ0KPj4gKyAqIEBzY2xoOiBTQ0wgaGlnaCBwZXJpb2QgKG1hc3RlciBtb2RlKQ0KPj4gKyAqIEBzY2xoOiBTQ0wgbG93IHBlcmlvZCAobWFzdGVyIG1vZGUpDQo+PiArICovDQo+PiArc3RydWN0IHN0bTMyZjdfaTJjX3RpbWluZ3Mgew0KPj4gKwlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7DQo+PiArCXU4CQkJcHJlc2M7DQo+PiArCXU4CQkJc2NsZGVsOw0KPj4gKwl1OAkJCXNkYWRlbDsNCj4+ICsJdTgJCQlzY2xoOw0KPj4gKwl1OAkJCXNjbGw7DQo+PiArfTsNCj4+ICsNCj4+ICsvKioNCj4+ICsgKiBzdHJ1Y3Qgc3RtMzJmN19pMmNfbXNnIC0gY2xpZW50IHNwZWNpZmljIGRhdGENCj4+ICsgKiBAYWRkcjogOC1iaXQgc2xhdmUgYWRkciwgaW5jbHVkaW5nIHIvdyBiaXQNCj4+ICsgKiBAY291bnQ6IG51bWJlciBvZiBieXRlcyB0byBiZSB0cmFuc2ZlcnJlZA0KPj4gKyAqIEBidWY6IGRhdGEgYnVmZmVyDQo+PiArICogQHJlc3VsdDogcmVzdWx0IG9mIHRoZSB0cmFuc2Zlcg0KPj4gKyAqIEBzdG9wOiBsYXN0IEkyQyBtc2cgdG8gYmUgc2VudCwgaS5lLiBTVE9QIHRvIGJlIGdlbmVyYXRlZA0KPj4gKyAqLw0KPj4gK3N0cnVjdCBzdG0zMmY3X2kyY19tc2cgew0KPj4gKwl1OCBhZGRyOw0KPj4gKwl1MzIgY291bnQ7DQo+PiArCXU4ICpidWY7DQo+PiArCWludCByZXN1bHQ7DQo+PiArCWJvb2wgc3RvcDsNCj4+ICt9Ow0KPj4gKw0KPj4gKy8qKg0KPj4gKyAqIHN0cnVjdCBzdG0zMmY3X2kyY19kZXYgLSBwcml2YXRlIGRhdGEgb2YgdGhlIGNvbnRyb2xsZXINCj4+ICsgKiBAYWRhcDogSTJDIGFkYXB0ZXIgZm9yIHRoaXMgY29udHJvbGxlcg0KPj4gKyAqIEBkZXY6IGRldmljZSBmb3IgdGhpcyBjb250cm9sbGVyDQo+PiArICogQGJhc2U6IHZpcnR1YWwgbWVtb3J5IGFyZWENCj4+ICsgKiBAY29tcGxldGU6IGNvbXBsZXRpb24gb2YgSTJDIG1lc3NhZ2UNCj4+ICsgKiBAY2xrOiBodyBpMmMgY2xvY2sNCj4+ICsgKiBAc3BlZWQ6IEkyQyBjbG9jayBmcmVxdWVuY3kgb2YgdGhlIGNvbnRyb2xsZXIuIFN0YW5kYXJkLCBGYXN0IG9yIEZhc3QrDQo+PiArICogQG1zZzogUG9pbnRlciB0byBkYXRhIHRvIGJlIHdyaXR0ZW4NCj4+ICsgKiBAbXNnX251bTogbnVtYmVyIG9mIEkyQyBtZXNzYWdlcyB0byBiZSBleGVjdXRlZA0KPj4gKyAqIEBtc2dfaWQ6IG1lc3NhZ2UgaWRlbnRpZmlhbnQNCj4+ICsgKiBAZjdfbXNnOiBjdXN0b21pemVkIGkyYyBtc2cgZm9yIGRyaXZlciB1c2FnZQ0KPj4gKyAqIEBzZXR1cDogSTJDIHRpbWluZyBpbnB1dCBzZXR1cA0KPj4gKyAqIEB0aW1pbmc6IEkyQyBjb21wdXRlZCB0aW1pbmdzDQo+PiArICovDQo+PiArc3RydWN0IHN0bTMyZjdfaTJjX2RldiB7DQo+PiArCXN0cnVjdCBpMmNfYWRhcHRlciBhZGFwOw0KPj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXY7DQo+PiArCXZvaWQgX19pb21lbSAqYmFzZTsNCj4+ICsJc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGU7DQo+PiArCXN0cnVjdCBjbGsgKmNsazsNCj4+ICsJaW50IHNwZWVkOw0KPj4gKwlzdHJ1Y3QgaTJjX21zZyAqbXNnOw0KPj4gKwl1bnNpZ25lZCBpbnQgbXNnX251bTsNCj4+ICsJdW5zaWduZWQgaW50IG1zZ19pZDsNCj4+ICsJc3RydWN0IHN0bTMyZjdfaTJjX21zZyBmN19tc2c7DQo+PiArCXN0cnVjdCBzdG0zMmY3X2kyY19zZXR1cCAqc2V0dXA7DQo+PiArCXN0cnVjdCBzdG0zMmY3X2kyY190aW1pbmdzIHRpbWluZzsNCj4+ICt9Ow0KPj4gKw0KPj4gK3N0YXRpYyBzdHJ1Y3Qgc3RtMzJmN19pMmNfc3BlYyBpMmNfc3BlY3NbXSA9IHsNCj4+ICsJW1NUTTMyX0kyQ19TUEVFRF9TVEFOREFSRF0gPSB7DQo+PiArCQkucmF0ZQkJPSAxMDAwMDAsDQo+PiArCQkucmF0ZV9taW4JPSA4MDAwLA0KPj4gKwkJLnJhdGVfbWF4CT0gMTIwMDAwLA0KPj4gKwkJLmZhbGxfbWF4CT0gMzAwLA0KPj4gKwkJLnJpc2VfbWF4CT0gMTAwMCwNCj4+ICsJCS5oZGRhdF9taW4JPSAwLA0KPj4gKwkJLnZkZGF0X21heAk9IDM0NTAsDQo+PiArCQkuc3VkYXRfbWluCT0gMjUwLA0KPj4gKwkJLmxfbWluCQk9IDQ3MDAsDQo+PiArCQkuaF9taW4JCT0gNDAwMCwNCj4+ICsJfSwNCj4+ICsJW1NUTTMyX0kyQ19TUEVFRF9GQVNUXSA9IHsNCj4+ICsJCS5yYXRlCQk9IDQwMDAwMCwNCj4+ICsJCS5yYXRlX21pbgk9IDMyMDAwMCwNCj4+ICsJCS5yYXRlX21heAk9IDQ4MDAwMCwNCj4+ICsJCS5mYWxsX21heAk9IDMwMCwNCj4+ICsJCS5yaXNlX21heAk9IDMwMCwNCj4+ICsJCS5oZGRhdF9taW4JPSAwLA0KPj4gKwkJLnZkZGF0X21heAk9IDkwMCwNCj4+ICsJCS5zdWRhdF9taW4JPSAxMDAsDQo+PiArCQkubF9taW4JCT0gMTMwMCwNCj4+ICsJCS5oX21pbgkJPSA2MDAsDQo+PiArCX0sDQo+PiArCVtTVE0zMl9JMkNfU1BFRURfRkFTVF9QTFVTXSA9IHsNCj4+ICsJCS5yYXRlCQk9IDEwMDAwMDAsDQo+PiArCQkucmF0ZV9taW4JPSA4MDAwMDAsDQo+PiArCQkucmF0ZV9tYXgJPSAxMjAwMDAwLA0KPj4gKwkJLmZhbGxfbWF4CT0gMTAwLA0KPj4gKwkJLnJpc2VfbWF4CT0gMTIwLA0KPj4gKwkJLmhkZGF0X21pbgk9IDAsDQo+PiArCQkudmRkYXRfbWF4CT0gNDUwLA0KPj4gKwkJLnN1ZGF0X21pbgk9IDUwLA0KPj4gKwkJLmxfbWluCQk9IDUwMCwNCj4+ICsJCS5oX21pbgkJPSAyNjAsDQo+PiArCX0sDQo+PiArfTsNCj4gDQo+IFdoYXQgaXMgdGhlIHNvdXJjZSBvZiB0aGUgYWJvdmUgdGFibGU/IE1heWJlIG1lbnRpb24gaXQgaW4gYSBjb21tZW50Pw0KPiBJIGRvbid0IGxpa2UgYWRkaW5nIHdoaXRlIHNwYWNlIHRvIGFsaWduIHRoZSA9LiBUaGUgbmV4dCBwZXJzb24gdG91Y2hpbmcNCj4gdGhpcyBlaXRoZXIgYnJlYWtzIHRoZSBhbGlnbm1lbnQgb3IgaGFzIHRvIG1vZGlmeSBtb3JlIHRoYW4NCj4gc3ludGFjdGljYWxseSBuZWNlc3NhcnkuID4NCg0KQWxsIHZhbHVlcyBjb21lIGRpcmVjdGx5IG91dCBvZiBJMkMgU3BlY2lmaWNhdGlvbnMuIEkgY2FuIG1lbnRpb24gaXQgDQpub25ldGhlbGVzcy4NCkFncmVlIGZvciBzcGFjZXMuIEkgd2lsbCBzb2x2ZSB0aGlzIGluIG5leHQgcmV2aXNpb24uDQoNCj4+ICtzdHJ1Y3Qgc3RtMzJmN19pMmNfc2V0dXAgc3RtMzJmN19zZXR1cCA9IHsNCj4+ICsJLnJpc2VfdGltZQkJPSBTVE0zMkY3X0kyQ19SSVNFX1RJTUVfREVGQVVMVCwNCj4+ICsJLmZhbGxfdGltZQkJPSBTVE0zMkY3X0kyQ19GQUxMX1RJTUVfREVGQVVMVCwNCj4+ICsJLmRuZgkJCT0gU1RNMzJGN19JMkNfRE5GX0RFRkFVTFQsDQo+PiArCS5hbmFsb2dfZmlsdGVyCQk9IFNUTTMyRjdfSTJDX0FOQUxPR19GSUxURVJfRU5BQkxFLA0KPj4gK307DQo+PiArDQo+PiArc3RhdGljIGlubGluZSB2b2lkIHN0bTMyZjdfaTJjX3NldF9iaXRzKHZvaWQgX19pb21lbSAqcmVnLCB1MzIgbWFzaykNCj4+ICt7DQo+PiArCXdyaXRlbF9yZWxheGVkKHJlYWRsX3JlbGF4ZWQocmVnKSB8IG1hc2ssIHJlZyk7DQo+PiArfQ0KPiANCj4gdGhpcyBpcyB1c2VkIHRocmVlIHRpbWVzIG9ubHkuIEFtb25nIHRoZXNlIHR3byB0aW1lcw0KPiBzdG0zMmY3X2kyY19od19jb25maWcoKS4gSSB3b25kZXIgaWYgaXQgd291bGQgYmUgbW9yZSByb2J1c3QgdG8gYXNzaWduIGENCj4gY29tcGxldGUgdmFsdWUgdG8gdGhlIHJlZ2lzdGVycyB0aGVyZSBhbmQgdGhlbiBkcm9wIHRoaXMgZnVuY3Rpb24gYW5kDQo+IG9wZW4gY29kZSBpdCBmb3IgdGhlIGxhc3QgdXNlci4NCg0KV2VsbCB0aGlzIGlzIHRydWUgd2l0aCB0aGlzIGluaXRpYWwgZHJpdmVyLiBCdXQgbmV3IGZlYXR1cmVzIGNvbWluZyANCmFmdGVyd2FyZHMgYXJlIHVzaW5nIG11Y2ggbW9yZSBjb25zdW1pbmcgc3VjaCBBUElzLiBUaGlzIG1lYW5zIHRoZXkgd2lsbCANCmNvbWUgYmFjayBsYXRlciBvbi4gTW9yZW92ZXIgYXMgaW5saW5lZCBmdW5jdGlvbnMgSSBkb24ndCBzZWUgdGhlIA0KYmVuZWZpY2Ugb2YgaXQuDQoNCj4+ICsNCj4+ICtzdGF0aWMgaW5saW5lIHZvaWQgc3RtMzJmN19pMmNfY2xyX2JpdHModm9pZCBfX2lvbWVtICpyZWcsIHUzMiBtYXNrKQ0KPj4gK3sNCj4+ICsJd3JpdGVsX3JlbGF4ZWQocmVhZGxfcmVsYXhlZChyZWcpICYgfm1hc2ssIHJlZyk7DQo+PiArfQ0KPiANCj4gVHdvIHVzZXJzIG9ubHksIHNhbWUgdGhvdWdodHMgYXMgZm9yIHN0bTMyZjdfaTJjX3NldF9iaXQgPg0KPj4gKw0KPj4gK3N0YXRpYyBpbnQgc3RtMzJmN19pMmNfY29tcHV0ZV90aW1pbmcoc3RydWN0IHN0bTMyZjdfaTJjX2RldiAqaTJjX2RldiwNCj4+ICsJCQkJICAgICAgc3RydWN0IHN0bTMyZjdfaTJjX3NldHVwICpzZXR1cCwNCj4+ICsJCQkJICAgICAgc3RydWN0IHN0bTMyZjdfaTJjX3RpbWluZ3MgKm91dHB1dCkNCj4+ICt7DQo+PiArCXUzMiBwX3ByZXYgPSBTVE0zMkY3X1BSRVNDX01BWDsNCj4+ICsJdTMyIGkyY2NsayA9IERJVl9ST1VORF9DTE9TRVNUKE5TRUNfUEVSX1NFQywNCj4+ICsJCQkJICAgICAgIHNldHVwLT5jbG9ja19zcmMpOw0KPj4gKwl1MzIgaTJjYnVzID0gRElWX1JPVU5EX0NMT1NFU1QoTlNFQ19QRVJfU0VDLA0KPj4gKwkJCQkgICAgICAgc2V0dXAtPnNwZWVkX2ZyZXEpOw0KPj4gKwl1MzIgY2xrX2Vycm9yX3ByZXYgPSBpMmNidXM7DQo+PiArCXUzMiB0c3luYzsNCj4+ICsJdTMyIGFmX2RlbGF5X21pbiwgYWZfZGVsYXlfbWF4Ow0KPj4gKwl1MzIgZG5mX2RlbGF5Ow0KPj4gKwl1MzIgY2xrX21pbiwgY2xrX21heDsNCj4+ICsJaW50IHNkYWRlbF9taW4sIHNkYWRlbF9tYXg7DQo+PiArCWludCBzY2xkZWxfbWluOw0KPj4gKwlzdHJ1Y3Qgc3RtMzJmN19pMmNfdGltaW5ncyAqdiwgKl92LCAqczsNCj4+ICsJc3RydWN0IGxpc3RfaGVhZCBzb2x1dGlvbnM7DQo+PiArCXUxNiBwLCBsLCBhLCBoOw0KPj4gKwlpbnQgcmV0ID0gMDsNCj4+ICsNCj4+ICsJaWYgKHNldHVwLT5zcGVlZCA+PSBTVE0zMl9JMkNfU1BFRURfRU5EKSB7DQo+PiArCQlkZXZfZXJyKGkyY19kZXYtPmRldiwgInNwZWVkIG91dCBvZiBib3VuZCB7JWQvJWR9XG4iLA0KPj4gKwkJCXNldHVwLT5zcGVlZCwgU1RNMzJfSTJDX1NQRUVEX0VORCAtIDEpOw0KPj4gKwkJcmV0dXJuIC1FSU5WQUw7DQo+PiArCX0NCj4+ICsNCj4+ICsJaWYgKChzZXR1cC0+cmlzZV90aW1lID4gaTJjX3NwZWNzW3NldHVwLT5zcGVlZF0ucmlzZV9tYXgpIHx8DQo+PiArCSAgICAoc2V0dXAtPmZhbGxfdGltZSA+IGkyY19zcGVjc1tzZXR1cC0+c3BlZWRdLmZhbGxfbWF4KSkgew0KPj4gKwkJZGV2X2VycihpMmNfZGV2LT5kZXYsDQo+PiArCQkJInRpbWluZ3Mgb3V0IG9mIGJvdW5kIFJpc2V7JWQ+JWR9L0ZhbGx7JWQ+JWR9XG4iLA0KPj4gKwkJCXNldHVwLT5yaXNlX3RpbWUsIGkyY19zcGVjc1tzZXR1cC0+c3BlZWRdLnJpc2VfbWF4LA0KPj4gKwkJCXNldHVwLT5mYWxsX3RpbWUsIGkyY19zcGVjc1tzZXR1cC0+c3BlZWRdLmZhbGxfbWF4KTsNCj4+ICsJCXJldHVybiAtRUlOVkFMOw0KPj4gKwl9DQo+PiArDQo+PiArCWlmIChzZXR1cC0+ZG5mID4gU1RNMzJGN19JMkNfRE5GX01BWCkgew0KPj4gKwkJZGV2X2VycihpMmNfZGV2LT5kZXYsDQo+PiArCQkJIkRORiBvdXQgb2YgYm91bmQgJWQvJWRcbiIsDQo+PiArCQkJc2V0dXAtPmRuZiwgU1RNMzJGN19JMkNfRE5GX01BWCk7DQo+PiArCQlyZXR1cm4gLUVJTlZBTDsNCj4+ICsJfQ0KPj4gKw0KPj4gKwlpZiAoc2V0dXAtPnNwZWVkX2ZyZXEgPiBpMmNfc3BlY3Nbc2V0dXAtPnNwZWVkXS5yYXRlKSB7DQo+PiArCQlkZXZfZXJyKGkyY19kZXYtPmRldiwgIkVSUk9SOiBGcmVxIHslZC8lZH1cbiIsDQo+PiArCQkJc2V0dXAtPnNwZWVkX2ZyZXEsIGkyY19zcGVjc1tzZXR1cC0+c3BlZWRdLnJhdGUpOw0KPj4gKwkJcmV0dXJuIC1FSU5WQUw7DQo+PiArCX0NCj4+ICsNCj4+ICsJLyogIEFuYWxvZyBhbmQgRGlnaXRhbCBGaWx0ZXJzICovDQo+PiArCWFmX2RlbGF5X21pbiA9DQo+PiArCQkoc2V0dXAtPmFuYWxvZ19maWx0ZXIgPw0KPj4gKwkJIFNUTTMyRjdfSTJDX0FOQUxPR19GSUxURVJfREVMQVlfTUlOIDogMCk7DQo+PiArCWFmX2RlbGF5X21heCA9DQo+PiArCQkoc2V0dXAtPmFuYWxvZ19maWx0ZXIgPw0KPj4gKwkJIFNUTTMyRjdfSTJDX0FOQUxPR19GSUxURVJfREVMQVlfTUFYIDogMCk7DQo+PiArCWRuZl9kZWxheSA9IHNldHVwLT5kbmYgKiBpMmNjbGs7DQo+PiArDQo+PiArCXNkYWRlbF9taW4gPSBzZXR1cC0+ZmFsbF90aW1lIC0gaTJjX3NwZWNzW3NldHVwLT5zcGVlZF0uaGRkYXRfbWluIC0NCj4+ICsJCWFmX2RlbGF5X21pbiAtIChzZXR1cC0+ZG5mICsgMykgKiBpMmNjbGs7DQo+PiArDQo+PiArCXNkYWRlbF9tYXggPSBpMmNfc3BlY3Nbc2V0dXAtPnNwZWVkXS52ZGRhdF9tYXggLSBzZXR1cC0+cmlzZV90aW1lIC0NCj4+ICsJCWFmX2RlbGF5X21heCAtIChzZXR1cC0+ZG5mICsgNCkgKiBpMmNjbGs7DQo+PiArDQo+PiArCXNjbGRlbF9taW4gPSBzZXR1cC0+cmlzZV90aW1lICsgaTJjX3NwZWNzW3NldHVwLT5zcGVlZF0uc3VkYXRfbWluOw0KPj4gKw0KPj4gKwlpZiAoc2RhZGVsX21pbiA8IDApDQo+PiArCQlzZGFkZWxfbWluID0gMDsNCj4+ICsJaWYgKHNkYWRlbF9tYXggPCAwKQ0KPj4gKwkJc2RhZGVsX21heCA9IDA7DQo+PiArDQo+PiArCWRldl9kYmcoaTJjX2Rldi0+ZGV2LCAiU0RBREVMKG1pbi9tYXgpOiAlaS8laSwgU0NMREVMKE1pbik6ICVpXG4iLA0KPj4gKwkJc2RhZGVsX21pbiwgc2RhZGVsX21heCwgc2NsZGVsX21pbik7DQo+PiArDQo+PiArCUlOSVRfTElTVF9IRUFEKCZzb2x1dGlvbnMpOw0KPj4gKwkvKiBDb21wdXRlIHBvc3NpYmxlIHZhbHVlcyBmb3IgUFJFU0MsIFNDTERFTCBhbmQgU0RBREVMICovDQo+PiArCWZvciAocCA9IDA7IHAgPCBTVE0zMkY3X1BSRVNDX01BWDsgcCsrKSB7DQo+PiArCQlmb3IgKGwgPSAwOyBsIDwgU1RNMzJGN19TQ0xERUxfTUFYOyBsKyspIHsNCj4+ICsJCQl1MzIgc2NsZGVsID0gKGwgKyAxKSAqIChwICsgMSkgKiBpMmNjbGs7DQo+PiArDQo+PiArCQkJaWYgKHNjbGRlbCA8IHNjbGRlbF9taW4pDQo+PiArCQkJCWNvbnRpbnVlOw0KPj4gKw0KPj4gKwkJCWZvciAoYSA9IDA7IGEgPCBTVE0zMkY3X1NEQURFTF9NQVg7IGErKykgew0KPj4gKwkJCQl1MzIgc2RhZGVsID0gKGEgKiAocCArIDEpICsgMSkgKiBpMmNjbGs7DQo+PiArDQo+PiArCQkJCWlmICgoKHNkYWRlbCA+PSBzZGFkZWxfbWluKSAmJg0KPj4gKwkJCQkgICAgIChzZGFkZWwgPD0gc2RhZGVsX21heCkpICYmDQo+PiArCQkJCSAgICAocCAhPSBwX3ByZXYpKSB7DQo+PiArCQkJCQl2ID0ga21hbGxvYyhzaXplb2YoKnYpLCBHRlBfS0VSTkVMKTsNCj4+ICsJCQkJCWlmICghdikgew0KPj4gKwkJCQkJCXJldCA9IC1FTk9NRU07DQo+PiArCQkJCQkJZ290byBleGl0Ow0KPj4gKwkJCQkJfQ0KPj4gKw0KPj4gKwkJCQkJdi0+cHJlc2MgPSBwOw0KPj4gKwkJCQkJdi0+c2NsZGVsID0gbDsNCj4+ICsJCQkJCXYtPnNkYWRlbCA9IGE7DQo+PiArCQkJCQlwX3ByZXYgPSBwOw0KPj4gKw0KPj4gKwkJCQkJbGlzdF9hZGRfdGFpbCgmdi0+bm9kZSwNCj4+ICsJCQkJCQkgICAgICAmc29sdXRpb25zKTsNCj4+ICsJCQkJfQ0KPj4gKwkJCX0NCj4+ICsJCX0NCj4+ICsJfQ0KPj4gKw0KPj4gKwlpZiAobGlzdF9lbXB0eSgmc29sdXRpb25zKSkgew0KPj4gKwkJZGV2X2VycihpMmNfZGV2LT5kZXYsICJubyBQcmVzY2FsZXIgc29sdXRpb25cbiIpOw0KPj4gKwkJcmV0ID0gLUVQRVJNOw0KPj4gKwkJZ290byBleGl0Ow0KPj4gKwl9DQo+PiArDQo+PiArCXRzeW5jID0gYWZfZGVsYXlfbWluICsgZG5mX2RlbGF5ICsgKDIgKiBpMmNjbGspOw0KPj4gKwlzID0gTlVMTDsNCj4+ICsJY2xrX21heCA9IE5TRUNfUEVSX1NFQyAvIGkyY19zcGVjc1tzZXR1cC0+c3BlZWRdLnJhdGVfbWluOw0KPj4gKwljbGtfbWluID0gTlNFQ19QRVJfU0VDIC8gaTJjX3NwZWNzW3NldHVwLT5zcGVlZF0ucmF0ZV9tYXg7DQo+PiArDQo+PiArCS8qDQo+PiArCSAqIEFtb25nIFByZXNjYWxlciBwb3NzaWJpbGl0aWVzIGRpc2NvdmVyZWQgYWJvdmUgZmlndXJlcyBvdXQgU0NMIExvdw0KPj4gKwkgKiBhbmQgSGlnaCBQZXJpb2QuIFByb3ZpZGVkOg0KPj4gKwkgKiAtIFNDTCBMb3cgUGVyaW9kIGhhcyB0byBiZSBoaWdoZXIgdGhhbiBMb3cgUGVyaW9kIG9mIHRlaHMgU0NMIENsb2NrDQo+PiArCSAqICAgZGVmaW5lZCBieSBJMkMgU3BlY2lmaWNhdGlvbi4gSTJDIENsb2NrIGhhcyB0byBiZSBsb3dlciB0aGFuDQo+PiArCSAqICAgKFNDTCBMb3cgUGVyaW9kIC0gQW5hbG9nL0RpZ2l0YWwgZmlsdGVycykgLyA0Lg0KPj4gKwkgKiAtIFNDTCBIaWdoIFBlcmlvZCBoYXMgdG8gYmUgbG93ZXIgdGhhbiBIaWdoIFBlcmlvZCBvZiB0aGUgU0NMIENsb2NrDQo+PiArCSAqICAgZGVmaW5lZCBieSBJMkMgU3BlY2lmaWNhdGlvbg0KPj4gKwkgKiAtIEkyQyBDbG9jayBoYXMgdG8gYmUgbG93ZXIgdGhhbiBTQ0wgSGlnaCBQZXJpb2QNCj4+ICsJICovDQo+PiArCWxpc3RfZm9yX2VhY2hfZW50cnkodiwgJnNvbHV0aW9ucywgbm9kZSkgew0KPj4gKwkJdTMyIHByZXNjYWxlciA9ICh2LT5wcmVzYyArIDEpICogaTJjY2xrOw0KPj4gKw0KPj4gKwkJZm9yIChsID0gMDsgbCA8IFNUTTMyRjdfU0NMTF9NQVg7IGwrKykgew0KPj4gKwkJCXUzMiB0c2NsX2wgPSAobCArIDEpICogcHJlc2NhbGVyICsgdHN5bmM7DQo+PiArDQo+PiArCQkJaWYgKCh0c2NsX2wgPCBpMmNfc3BlY3Nbc2V0dXAtPnNwZWVkXS5sX21pbikgfHwNCj4+ICsJCQkgICAgKGkyY2NsayA+PQ0KPj4gKwkJCSAgICAgKCh0c2NsX2wgLSBhZl9kZWxheV9taW4gLSBkbmZfZGVsYXkpIC8gNCkpKSB7DQo+PiArCQkJCWNvbnRpbnVlOw0KPj4gKwkJCX0NCj4+ICsNCj4+ICsJCQlmb3IgKGggPSAwOyBoIDwgU1RNMzJGN19TQ0xIX01BWDsgaCsrKSB7DQo+PiArCQkJCXUzMiB0c2NsX2ggPSAoaCArIDEpICogcHJlc2NhbGVyICsgdHN5bmM7DQo+PiArCQkJCXUzMiB0c2NsID0gdHNjbF9sICsgdHNjbF9oICsNCj4+ICsJCQkJCXNldHVwLT5yaXNlX3RpbWUgKyBzZXR1cC0+ZmFsbF90aW1lOw0KPj4gKw0KPj4gKwkJCQlpZiAoKHRzY2wgPj0gY2xrX21pbikgJiYgKHRzY2wgPD0gY2xrX21heCkgJiYNCj4+ICsJCQkJICAgICh0c2NsX2ggPj0gaTJjX3NwZWNzW3NldHVwLT5zcGVlZF0uaF9taW4pICYmDQo+PiArCQkJCSAgICAoaTJjY2xrIDwgdHNjbF9oKSkgew0KPj4gKwkJCQkJaW50IGNsa19lcnJvciA9IHRzY2wgLSBpMmNidXM7DQo+PiArDQo+PiArCQkJCQlpZiAoY2xrX2Vycm9yIDwgMCkNCj4+ICsJCQkJCQljbGtfZXJyb3IgPSAtY2xrX2Vycm9yOw0KPj4gKw0KPj4gKwkJCQkJaWYgKGNsa19lcnJvciA8IGNsa19lcnJvcl9wcmV2KSB7DQo+PiArCQkJCQkJY2xrX2Vycm9yX3ByZXYgPSBjbGtfZXJyb3I7DQo+PiArCQkJCQkJdi0+c2NsbCA9IGw7DQo+PiArCQkJCQkJdi0+c2NsaCA9IGg7DQo+PiArCQkJCQkJcyA9IHY7DQo+PiArCQkJCQl9DQo+PiArCQkJCX0NCj4+ICsJCQl9DQo+PiArCQl9DQo+PiArCX0NCj4+ICsNCj4+ICsJaWYgKCFzKSB7DQo+PiArCQlkZXZfZXJyKGkyY19kZXYtPmRldiwgIm5vIHNvbHV0aW9uIGF0IGFsbFxuIik7DQo+PiArCQlyZXQgPSAtRVBFUk07DQo+PiArCQlnb3RvIGV4aXQ7DQo+PiArCX0NCj4+ICsNCj4+ICsJb3V0cHV0LT5wcmVzYyA9IHMtPnByZXNjOw0KPj4gKwlvdXRwdXQtPnNjbGRlbCA9IHMtPnNjbGRlbDsNCj4+ICsJb3V0cHV0LT5zZGFkZWwgPSBzLT5zZGFkZWw7DQo+PiArCW91dHB1dC0+c2NsbCA9IHMtPnNjbGw7DQo+PiArCW91dHB1dC0+c2NsaCA9IHMtPnNjbGg7DQo+PiArDQo+PiArCWRldl9kYmcoaTJjX2Rldi0+ZGV2LA0KPj4gKwkJIlByZXNjOiAlaSwgc2NsZGVsOiAlaSwgc2RhZGVsOiAlaSwgc2NsbDogJWksIHNjbGg6ICVpXG4iLA0KPj4gKwkJb3V0cHV0LT5wcmVzYywNCj4+ICsJCW91dHB1dC0+c2NsZGVsLCBvdXRwdXQtPnNkYWRlbCwNCj4+ICsJCW91dHB1dC0+c2NsbCwgb3V0cHV0LT5zY2xoKTsNCj4+ICsNCj4+ICtleGl0Og0KPj4gKwkvKiBSZWxlYXNlIGxpc3QgYW5kIG1lbW9yeSAqLw0KPj4gKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodiwgX3YsICZzb2x1dGlvbnMsIG5vZGUpIHsNCj4+ICsJCWxpc3RfZGVsKCZ2LT5ub2RlKTsNCj4+ICsJCWtmcmVlKHYpOw0KPj4gKwl9DQo+PiArDQo+PiArCXJldHVybiByZXQ7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyBpbnQgc3RtMzJmN19pMmNfc2V0dXBfdGltaW5nKHN0cnVjdCBzdG0zMmY3X2kyY19kZXYgKmkyY19kZXYsDQo+PiArCQkJCSAgICBzdHJ1Y3Qgc3RtMzJmN19pMmNfc2V0dXAgKnNldHVwKQ0KPj4gK3sNCj4+ICsJaW50IHJldCA9IDA7DQo+PiArDQo+PiArCXNldHVwLT5zcGVlZCA9IGkyY19kZXYtPnNwZWVkOw0KPj4gKwlzZXR1cC0+c3BlZWRfZnJlcSA9IGkyY19zcGVjc1tzZXR1cC0+c3BlZWRdLnJhdGU7DQo+PiArCXNldHVwLT5jbG9ja19zcmMgPSBjbGtfZ2V0X3JhdGUoaTJjX2Rldi0+Y2xrKTsNCj4+ICsNCj4+ICsJaWYgKCFzZXR1cC0+Y2xvY2tfc3JjKSB7DQo+PiArCQlkZXZfZXJyKGkyY19kZXYtPmRldiwgImNsb2NrIHJhdGUgaXMgMFxuIik7DQo+PiArCQlyZXR1cm4gLUVJTlZBTDsNCj4+ICsJfQ0KPj4gKw0KPj4gKwlkbyB7DQo+PiArCQlyZXQgPSBzdG0zMmY3X2kyY19jb21wdXRlX3RpbWluZyhpMmNfZGV2LCBzZXR1cCwNCj4+ICsJCQkJCQkgJmkyY19kZXYtPnRpbWluZyk7DQo+PiArCQlpZiAocmV0KSB7DQo+PiArCQkJZGV2X2VycihpMmNfZGV2LT5kZXYsDQo+PiArCQkJCSJmYWlsZWQgdG8gY29tcHV0ZSBJMkMgdGltaW5ncy5cbiIpOw0KPj4gKwkJCWlmIChpMmNfZGV2LT5zcGVlZCA+IFNUTTMyX0kyQ19TUEVFRF9TVEFOREFSRCkgew0KPj4gKwkJCQlpMmNfZGV2LT5zcGVlZC0tOw0KPj4gKwkJCQlzZXR1cC0+c3BlZWQgPSBpMmNfZGV2LT5zcGVlZDsNCj4+ICsJCQkJc2V0dXAtPnNwZWVkX2ZyZXEgPQ0KPj4gKwkJCQkJaTJjX3NwZWNzW3NldHVwLT5zcGVlZF0ucmF0ZTsNCj4+ICsJCQkJZGV2X3dhcm4oaTJjX2Rldi0+ZGV2LA0KPj4gKwkJCQkJICJkb3duZ3JhZGUgSTJDIFNwZWVkIEZyZXEgdG8gKCVpKVxuIiwNCj4+ICsJCQkJCSBpMmNfc3BlY3Nbc2V0dXAtPnNwZWVkXS5yYXRlKTsNCj4+ICsJCQl9IGVsc2Ugew0KPj4gKwkJCQlicmVhazsNCj4+ICsJCQl9DQo+PiArCQl9DQo+PiArCX0gd2hpbGUgKHJldCk7DQo+PiArDQo+PiArCWlmIChyZXQpIHsNCj4+ICsJCWRldl9lcnIoaTJjX2Rldi0+ZGV2LCAiSW1wb3NzaWJsZSB0byBjb21wdXRlIEkyQyB0aW1pbmdzLlxuIik7DQo+PiArCQlyZXR1cm4gcmV0Ow0KPj4gKwl9DQo+PiArDQo+PiArCWRldl9kYmcoaTJjX2Rldi0+ZGV2LCAiSTJDIFNwZWVkKCVpKSwgRnJlcSglaSksIENsayBTb3VyY2UoJWkpXG4iLA0KPj4gKwkJc2V0dXAtPnNwZWVkLCBzZXR1cC0+c3BlZWRfZnJlcSwgc2V0dXAtPmNsb2NrX3NyYyk7DQo+PiArCWRldl9kYmcoaTJjX2Rldi0+ZGV2LCAiSTJDIFJpc2UoJWkpIGFuZCBGYWxsKCVpKSBUaW1lXG4iLA0KPj4gKwkJc2V0dXAtPnJpc2VfdGltZSwgc2V0dXAtPmZhbGxfdGltZSk7DQo+PiArCWRldl9kYmcoaTJjX2Rldi0+ZGV2LCAiSTJDIEFuYWxvZyBGaWx0ZXIoJXMpLCBETkYoJWkpXG4iLA0KPj4gKwkJKHNldHVwLT5hbmFsb2dfZmlsdGVyID8gIk9uIiA6ICJPZmYiKSwgc2V0dXAtPmRuZik7DQo+PiArDQo+PiArCWkyY19kZXYtPnNldHVwID0gc2V0dXA7DQo+PiArDQo+PiArCXJldHVybiAwOw0KPj4gK30NCj4+ICsNCj4+ICtzdGF0aWMgdm9pZCBzdG0zMmY3X2kyY19od19jb25maWcoc3RydWN0IHN0bTMyZjdfaTJjX2RldiAqaTJjX2RldikNCj4+ICt7DQo+PiArCXN0cnVjdCBzdG0zMmY3X2kyY190aW1pbmdzICp0ID0gJmkyY19kZXYtPnRpbWluZzsNCj4+ICsJdTMyIHRpbWluZyA9IDA7DQo+PiArDQo+PiArCS8qIFRpbWluZyBzZXR0aW5ncyAqLw0KPj4gKwl0aW1pbmcgfD0gU1RNMzJGN19JMkNfVElNSU5HUl9QUkVTQyh0LT5wcmVzYyk7DQo+PiArCXRpbWluZyB8PSBTVE0zMkY3X0kyQ19USU1JTkdSX1NDTERFTCh0LT5zY2xkZWwpOw0KPj4gKwl0aW1pbmcgfD0gU1RNMzJGN19JMkNfVElNSU5HUl9TREFERUwodC0+c2RhZGVsKTsNCj4+ICsJdGltaW5nIHw9IFNUTTMyRjdfSTJDX1RJTUlOR1JfU0NMSCh0LT5zY2xoKTsNCj4+ICsJdGltaW5nIHw9IFNUTTMyRjdfSTJDX1RJTUlOR1JfU0NMTCh0LT5zY2xsKTsNCj4+ICsJd3JpdGVsX3JlbGF4ZWQodGltaW5nLCBpMmNfZGV2LT5iYXNlICsgU1RNMzJGN19JMkNfVElNSU5HUik7DQo+PiArDQo+PiArCS8qIEVuYWJsZSBJMkMgKi8NCj4+ICsJaWYgKGkyY19kZXYtPnNldHVwLT5hbmFsb2dfZmlsdGVyKQ0KPj4gKwkJc3RtMzJmN19pMmNfY2xyX2JpdHMoaTJjX2Rldi0+YmFzZSArIFNUTTMyRjdfSTJDX0NSMSwNCj4+ICsJCQkJICAgICBTVE0zMkY3X0kyQ19DUjFfQU5GT0ZGKTsNCj4+ICsJZWxzZQ0KPj4gKwkJc3RtMzJmN19pMmNfc2V0X2JpdHMoaTJjX2Rldi0+YmFzZSArIFNUTTMyRjdfSTJDX0NSMSwNCj4+ICsJCQkJICAgICBTVE0zMkY3X0kyQ19DUjFfQU5GT0ZGKTsNCj4+ICsJc3RtMzJmN19pMmNfc2V0X2JpdHMoaTJjX2Rldi0+YmFzZSArIFNUTTMyRjdfSTJDX0NSMSwNCj4+ICsJCQkgICAgIFNUTTMyRjdfSTJDX0NSMV9QRSk7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyB2b2lkIHN0bTMyZjdfaTJjX3dyaXRlX3R4X2RhdGEoc3RydWN0IHN0bTMyZjdfaTJjX2RldiAqaTJjX2RldikNCj4+ICt7DQo+PiArCXN0cnVjdCBzdG0zMmY3X2kyY19tc2cgKmY3X21zZyA9ICZpMmNfZGV2LT5mN19tc2c7DQo+PiArCXZvaWQgX19pb21lbSAqYmFzZSA9IGkyY19kZXYtPmJhc2U7DQo+PiArDQo+PiArCWlmIChmN19tc2ctPmNvdW50KSB7DQo+PiArCQl3cml0ZWJfcmVsYXhlZCgqZjdfbXNnLT5idWYrKywgYmFzZSArIFNUTTMyRjdfSTJDX1RYRFIpOw0KPj4gKwkJZjdfbXNnLT5jb3VudC0tOw0KPj4gKwl9DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyB2b2lkIHN0bTMyZjdfaTJjX3JlYWRfcnhfZGF0YShzdHJ1Y3Qgc3RtMzJmN19pMmNfZGV2ICppMmNfZGV2KQ0KPj4gK3sNCj4+ICsJc3RydWN0IHN0bTMyZjdfaTJjX21zZyAqZjdfbXNnID0gJmkyY19kZXYtPmY3X21zZzsNCj4+ICsJdm9pZCBfX2lvbWVtICpiYXNlID0gaTJjX2Rldi0+YmFzZTsNCj4+ICsNCj4+ICsJaWYgKGY3X21zZy0+Y291bnQpIHsNCj4+ICsJCSpmN19tc2ctPmJ1ZisrID0gcmVhZGJfcmVsYXhlZChiYXNlICsgU1RNMzJGN19JMkNfUlhEUik7DQo+PiArCQlmN19tc2ctPmNvdW50LS07DQo+PiArCX0NCj4+ICt9DQo+PiArDQo+PiArc3RhdGljIHZvaWQgc3RtMzJmN19pMmNfcmVsb2FkKHN0cnVjdCBzdG0zMmY3X2kyY19kZXYgKmkyY19kZXYpDQo+PiArew0KPj4gKwlzdHJ1Y3Qgc3RtMzJmN19pMmNfbXNnICpmN19tc2cgPSAmaTJjX2Rldi0+ZjdfbXNnOw0KPj4gKwl1MzIgY3IyOw0KPj4gKw0KPj4gKwljcjIgPSByZWFkbF9yZWxheGVkKGkyY19kZXYtPmJhc2UgKyBTVE0zMkY3X0kyQ19DUjIpOw0KPj4gKw0KPj4gKwljcjIgJj0gflNUTTMyRjdfSTJDX0NSMl9OQllURVNfTUFTSzsNCj4+ICsJaWYgKGY3X21zZy0+Y291bnQgPiBTVE0zMkY3X0kyQ19NQVhfTEVOKSB7DQo+PiArCQljcjIgfD0gU1RNMzJGN19JMkNfQ1IyX05CWVRFUyhTVE0zMkY3X0kyQ19NQVhfTEVOKTsNCj4+ICsJfSBlbHNlIHsNCj4+ICsJCWNyMiAmPSB+U1RNMzJGN19JMkNfQ1IyX1JFTE9BRDsNCj4+ICsJCWNyMiB8PSBTVE0zMkY3X0kyQ19DUjJfTkJZVEVTKGY3X21zZy0+Y291bnQpOw0KPj4gKwl9DQo+PiArDQo+PiArCXdyaXRlbF9yZWxheGVkKGNyMiwgaTJjX2Rldi0+YmFzZSArIFNUTTMyRjdfSTJDX0NSMik7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyBpbnQgc3RtMzJmN19pMmNfd2FpdF9mcmVlX2J1cyhzdHJ1Y3Qgc3RtMzJmN19pMmNfZGV2ICppMmNfZGV2KQ0KPj4gK3sNCj4+ICsJdTMyIHN0YXR1czsNCj4+ICsJaW50IHJldDsNCj4+ICsNCj4+ICsJcmV0ID0gcmVhZGxfcmVsYXhlZF9wb2xsX3RpbWVvdXQoaTJjX2Rldi0+YmFzZSArIFNUTTMyRjdfSTJDX0lTUiwNCj4+ICsJCQkJCSBzdGF0dXMsDQo+PiArCQkJCQkgIShzdGF0dXMgJiBTVE0zMkY3X0kyQ19JU1JfQlVTWSksDQo+PiArCQkJCQkgMTAsIDEwMDApOw0KPj4gKwlpZiAocmV0KSB7DQo+PiArCQlkZXZfZGJnKGkyY19kZXYtPmRldiwgImJ1cyBidXN5XG4iKTsNCj4+ICsJCXJldCA9IC1FQlVTWTsNCj4+ICsJfQ0KPj4gKw0KPj4gKwlyZXR1cm4gcmV0Ow0KPj4gK30NCj4+ICsNCj4+ICtzdGF0aWMgdm9pZCBzdG0zMmY3X2kyY194ZmVyX21zZyhzdHJ1Y3Qgc3RtMzJmN19pMmNfZGV2ICppMmNfZGV2LA0KPj4gKwkJCQkgc3RydWN0IGkyY19tc2cgKm1zZykNCj4+ICt7DQo+PiArCXN0cnVjdCBzdG0zMmY3X2kyY19tc2cgKmY3X21zZyA9ICZpMmNfZGV2LT5mN19tc2c7DQo+PiArCXZvaWQgX19pb21lbSAqYmFzZSA9IGkyY19kZXYtPmJhc2U7DQo+PiArCXUzMiBjcjEsIGNyMjsNCj4+ICsNCj4+ICsJZjdfbXNnLT5hZGRyID0gbXNnLT5hZGRyOw0KPj4gKwlmN19tc2ctPmJ1ZiA9IG1zZy0+YnVmOw0KPj4gKwlmN19tc2ctPmNvdW50ID0gbXNnLT5sZW47DQo+PiArCWY3X21zZy0+cmVzdWx0ID0gMDsNCj4+ICsJZjdfbXNnLT5zdG9wID0gKGkyY19kZXYtPm1zZ19pZCA+PSBpMmNfZGV2LT5tc2dfbnVtIC0gMSk7DQo+PiArDQo+PiArCXJlaW5pdF9jb21wbGV0aW9uKCZpMmNfZGV2LT5jb21wbGV0ZSk7DQo+PiArDQo+PiArCWNyMSA9IHJlYWRsX3JlbGF4ZWQoYmFzZSArIFNUTTMyRjdfSTJDX0NSMSk7DQo+PiArCWNyMiA9IHJlYWRsX3JlbGF4ZWQoYmFzZSArIFNUTTMyRjdfSTJDX0NSMik7DQo+IA0KPiBDYW4geW91IGtub3cgdGhlIGNvbnRlbnQgb2YgdGhlc2UgcmVnaXN0ZXJzIGZyb20gdGhlIGNvbnRleHQ/DQo+IA0KDQpOb3QgZW50aXJlbHkgc29tZSBpbmZvcyBhcmUgc3RvcmVkIHdpdGhpbiB0aGUgY29udGV4dCBidXQgc29tZSBvdGhlcnMgDQpsaWtlIElUIG1hc2tpbmcgYXJlbid0LiBXZSBjYW4ndCBndWVzcyB0aGUgY29udGVudCBpZiB0aGlzIGlzIHRoZSBxdWVzdGlvbi4NCg0KPj4gKwkvKiBTZXQgdHJhbnNmZXIgZGlyZWN0aW9uICovDQo+PiArCWNyMiAmPSB+U1RNMzJGN19JMkNfQ1IyX1JEX1dSTjsNCj4+ICsJaWYgKG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkNCj4+ICsJCWNyMiB8PSBTVE0zMkY3X0kyQ19DUjJfUkRfV1JOOw0KPj4gKw0KPj4gKwkvKiBTZXQgc2xhdmUgYWRkcmVzcyAqLw0KPj4gKwljcjIgJj0gflNUTTMyRjdfSTJDX0NSMl9TQUREN19NQVNLOw0KPj4gKwljcjIgfD0gU1RNMzJGN19JMkNfQ1IyX1NBREQ3KGY3X21zZy0+YWRkcik7DQo+PiArDQo+PiArCS8qIFNldCBuYiBieXRlcyB0byB0cmFuc2ZlciBhbmQgcmVsb2FkIGlmIG5lZWRlZCAqLw0KPj4gKwljcjIgJj0gfihTVE0zMkY3X0kyQ19DUjJfTkJZVEVTX01BU0sgfCBTVE0zMkY3X0kyQ19DUjJfUkVMT0FEKTsNCj4+ICsJaWYgKGY3X21zZy0+Y291bnQgPiBTVE0zMkY3X0kyQ19NQVhfTEVOKSB7DQo+PiArCQljcjIgfD0gU1RNMzJGN19JMkNfQ1IyX05CWVRFUyhTVE0zMkY3X0kyQ19NQVhfTEVOKTsNCj4+ICsJCWNyMiB8PSBTVE0zMkY3X0kyQ19DUjJfUkVMT0FEOw0KPj4gKwl9IGVsc2Ugew0KPj4gKwkJY3IyIHw9IFNUTTMyRjdfSTJDX0NSMl9OQllURVMoZjdfbXNnLT5jb3VudCk7DQo+PiArCX0NCj4+ICsNCj4+ICsJLyogRW5hYmxlIE5BQ0ssIFNUT1AsIGVycm9yIGFuZCB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHRzICovDQo+PiArCWNyMSB8PSBTVE0zMkY3X0kyQ19DUjFfRVJSSUUgfCBTVE0zMkY3X0kyQ19DUjFfVENJRSB8DQo+PiArCQlTVE0zMkY3X0kyQ19DUjFfU1RPUElFIHwgU1RNMzJGN19JMkNfQ1IxX05BQ0tJRTsNCj4+ICsNCj4+ICsJLyogQ2xlYXIgVFgvUlggaW50ZXJydXB0ICovDQo+PiArCWNyMSAmPSB+KFNUTTMyRjdfSTJDX0NSMV9SWElFIHwgU1RNMzJGN19JMkNfQ1IxX1RYSUUpOw0KPj4gKw0KPj4gKwkvKiBFbmFibGUgUlgvVFggaW50ZXJydXB0IGFjY29yZGluZyB0byBtc2cgZGlyZWN0aW9uICovDQo+PiArCWlmIChtc2ctPmZsYWdzICYgSTJDX01fUkQpDQo+PiArCQljcjEgfD0gU1RNMzJGN19JMkNfQ1IxX1JYSUU7DQo+PiArCWVsc2UNCj4+ICsJCWNyMSB8PSBTVE0zMkY3X0kyQ19DUjFfVFhJRTsNCj4+ICsNCj4+ICsJLyogQ29uZmlndXJlIFN0YXJ0L1JlcGVhdGVkIFN0YXJ0ICovDQo+PiArCWNyMiB8PSBTVE0zMkY3X0kyQ19DUjJfU1RBUlQ7DQo+PiArDQo+PiArCS8qIFdyaXRlIGNvbmZpZ3VyYXRpb25zIHJlZ2lzdGVycyAqLw0KPj4gKwl3cml0ZWxfcmVsYXhlZChjcjEsIGJhc2UgKyBTVE0zMkY3X0kyQ19DUjEpOw0KPj4gKwl3cml0ZWxfcmVsYXhlZChjcjIsIGJhc2UgKyBTVE0zMkY3X0kyQ19DUjIpOw0KPj4gK30NCj4+ICsNCj4+ICtzdGF0aWMgdm9pZCBzdG0zMmY3X2kyY19kaXNhYmxlX2lycShzdHJ1Y3Qgc3RtMzJmN19pMmNfZGV2ICppMmNfZGV2LCB1MzIgbWFzaykNCj4+ICt7DQo+PiArCXN0bTMyZjdfaTJjX2Nscl9iaXRzKGkyY19kZXYtPmJhc2UgKyBTVE0zMkY3X0kyQ19DUjEsIG1hc2spOw0KPj4gK30NCj4gDQo+IG1hc2sgaXMgYWx3YXlzIFNUTTMyRjdfSTJDX0FMTF9JUlFfTUFTSy4gTWF5YmUgdXNlIHRoaXMgdG8gc2ltcGxpZnk/DQo+IA0KDQpZZXMgcmlnaHQuIEhvd2V2ZXIgc2FtZSBhbnN3ZXIgYXMgc2V0L2Nscl9iaXRzIEFQSXM6IFNvbWUgZmVhdHVyZXMgd2lsbCANCnJlcXVpcmUgZGlmZmVyZW50IG1hc2tpbmcgYW5kIEkgd2lsbCBjb21lIGJhY2sgd2l0aCB0aGUgc2FtZSBBUElzIGxhdGVyIG9uLg0KDQo+PiArc3RhdGljIGlycXJldHVybl90IHN0bTMyZjdfaTJjX2lzcl9ldmVudChpbnQgaXJxLCB2b2lkICpkYXRhKQ0KPj4gK3sNCj4+ICsJc3RydWN0IHN0bTMyZjdfaTJjX2RldiAqaTJjX2RldiA9IGRhdGE7DQo+PiArCXN0cnVjdCBzdG0zMmY3X2kyY19tc2cgKmY3X21zZyA9ICZpMmNfZGV2LT5mN19tc2c7DQo+PiArCXZvaWQgX19pb21lbSAqYmFzZSA9IGkyY19kZXYtPmJhc2U7DQo+PiArCXUzMiBzdGF0dXMsIG1hc2s7DQo+PiArDQo+PiArCXN0YXR1cyA9IHJlYWRsX3JlbGF4ZWQoaTJjX2Rldi0+YmFzZSArIFNUTTMyRjdfSTJDX0lTUik7DQo+PiArDQo+PiArCS8qIFR4IGVtcHR5ICovDQo+PiArCWlmIChzdGF0dXMgJiBTVE0zMkY3X0kyQ19JU1JfVFhJUykNCj4+ICsJCXN0bTMyZjdfaTJjX3dyaXRlX3R4X2RhdGEoaTJjX2Rldik7DQo+PiArDQo+PiArCS8qIFJYIG5vdCBlbXB0eSAqLw0KPj4gKwlpZiAoc3RhdHVzICYgU1RNMzJGN19JMkNfSVNSX1JYTkUpDQo+PiArCQlzdG0zMmY3X2kyY19yZWFkX3J4X2RhdGEoaTJjX2Rldik7DQo+PiArDQo+PiArCS8qIE5BQ0sgcmVjZWl2ZWQgKi8NCj4+ICsJaWYgKHN0YXR1cyAmIFNUTTMyRjdfSTJDX0lTUl9OQUNLRikgew0KPj4gKwkJZGV2X2RiZyhpMmNfZGV2LT5kZXYsICI8JXM+OiBSZWNlaXZlIE5BQ0tcbiIsIF9fZnVuY19fKTsNCj4+ICsJCXdyaXRlbF9yZWxheGVkKFNUTTMyRjdfSTJDX0lDUl9OQUNLQ0YsIGJhc2UgKyBTVE0zMkY3X0kyQ19JQ1IpOw0KPj4gKwkJZjdfbXNnLT5yZXN1bHQgPSAtRUJBREU7DQo+PiArCX0NCj4+ICsNCj4+ICsJLyogU1RPUCBkZXRlY3Rpb24gZmxhZyAqLw0KPj4gKwlpZiAoc3RhdHVzICYgU1RNMzJGN19JMkNfSVNSX1NUT1BGKSB7DQo+PiArCQkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8NCj4+ICsJCXN0bTMyZjdfaTJjX2Rpc2FibGVfaXJxKGkyY19kZXYsIFNUTTMyRjdfSTJDX0FMTF9JUlFfTUFTSyk7DQo+PiArDQo+PiArCQkvKiBDbGVhciBTVE9QIGZsYWcgKi8NCj4+ICsJCXdyaXRlbF9yZWxheGVkKFNUTTMyRjdfSTJDX0lDUl9TVE9QQ0YsIGJhc2UgKyBTVE0zMkY3X0kyQ19JQ1IpOw0KPj4gKw0KPj4gKwkJY29tcGxldGUoJmkyY19kZXYtPmNvbXBsZXRlKTsNCj4+ICsJfQ0KPj4gKw0KPj4gKwkvKiBUcmFuc2ZlciBjb21wbGV0ZSAqLw0KPj4gKwlpZiAoc3RhdHVzICYgU1RNMzJGN19JMkNfSVNSX1RDKSB7DQo+PiArCQlpZiAoZjdfbXNnLT5zdG9wKSB7DQo+PiArCQkJbWFzayA9IFNUTTMyRjdfSTJDX0NSMl9TVE9QOw0KPj4gKwkJCXN0bTMyZjdfaTJjX3NldF9iaXRzKGJhc2UgKyBTVE0zMkY3X0kyQ19DUjIsIG1hc2spOw0KPj4gKwkJfSBlbHNlIHsNCj4+ICsJCQlpMmNfZGV2LT5tc2dfaWQrKzsNCj4+ICsJCQlpMmNfZGV2LT5tc2crKzsNCj4+ICsJCQlzdG0zMmY3X2kyY194ZmVyX21zZyhpMmNfZGV2LCBpMmNfZGV2LT5tc2cpOw0KPj4gKwkJfQ0KPj4gKwl9DQo+PiArDQo+PiArCS8qDQo+PiArCSAqIFRyYW5zZmVyIENvbXBsZXRlIFJlbG9hZDogMjU1IGRhdGEgYnl0ZXMgaGF2ZSBiZWVuIHRyYW5zZmVycmVkDQo+PiArCSAqIFdlIGhhdmUgdG8gcHJlcGFyZSB0aGUgSTJDIGNvbnRyb2xsZXIgdG8gdHJhbnNmZXIgdGhlIHJlbWFpbmluZw0KPj4gKwkgKiBkYXRhDQo+IA0KPiBNaXNzaW5nIHB1bmN0dWF0aW9uLg0KPiANCg0KT2sNCg0KPj4gKwkgKi8NCj4+ICsJaWYgKHN0YXR1cyAmIFNUTTMyRjdfSTJDX0lTUl9UQ1IpDQo+PiArCQlzdG0zMmY3X2kyY19yZWxvYWQoaTJjX2Rldik7DQo+PiArDQo+PiArCXJldHVybiBJUlFfSEFORExFRDsNCj4+ICt9DQo+PiArDQo+PiArc3RhdGljIGlycXJldHVybl90IHN0bTMyZjdfaTJjX2lzcl9lcnJvcihpbnQgaXJxLCB2b2lkICpkYXRhKQ0KPj4gK3sNCj4+ICsJc3RydWN0IHN0bTMyZjdfaTJjX2RldiAqaTJjX2RldiA9IGRhdGE7DQo+PiArCXN0cnVjdCBzdG0zMmY3X2kyY19tc2cgKmY3X21zZyA9ICZpMmNfZGV2LT5mN19tc2c7DQo+PiArCXZvaWQgX19pb21lbSAqYmFzZSA9IGkyY19kZXYtPmJhc2U7DQo+PiArCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyY19kZXYtPmRldjsNCj4+ICsJdTMyIHN0YXR1czsNCj4+ICsNCj4+ICsJc3RhdHVzID0gcmVhZGxfcmVsYXhlZChpMmNfZGV2LT5iYXNlICsgU1RNMzJGN19JMkNfSVNSKTsNCj4+ICsNCj4+ICsJLyogQnVzIGVycm9yICovDQo+PiArCWlmIChzdGF0dXMgJiBTVE0zMkY3X0kyQ19JU1JfQkVSUikgew0KPj4gKwkJZGV2X2VycihkZXYsICI8JXM+OiBCdXMgZXJyb3JcbiIsIF9fZnVuY19fKTsNCj4+ICsJCXdyaXRlbF9yZWxheGVkKFNUTTMyRjdfSTJDX0lDUl9CRVJSQ0YsIGJhc2UgKyBTVE0zMkY3X0kyQ19JQ1IpOw0KPj4gKwkJZjdfbXNnLT5yZXN1bHQgPSAtRUlPOw0KPj4gKwl9DQo+PiArDQo+PiArCS8qIEFyYml0cmF0aW9uIGxvc3MgKi8NCj4+ICsJaWYgKHN0YXR1cyAmIFNUTTMyRjdfSTJDX0lTUl9BUkxPKSB7DQo+PiArCQlkZXZfZXJyKGRldiwgIjwlcz46IEFyYml0cmF0aW9uIGxvc3NcbiIsIF9fZnVuY19fKTsNCj4gDQo+IERyb3AgdGhpcy4gQXJiaXRyYXRpb24gbG9zcyBpcyBub3QgYW4gZXJyb3IgYW5kIGl0IHNob3VsZG4ndCBwb2xsdXRlIHRoZQ0KPiBrZXJuZWwgbG9nLg0KPiANCg0KSSB3b3VsZCBsaWtlIHRvIGtlZXAgaXQgYXMgaW5kaWNhdGlvbiB0aG91Z2guDQpBZ3JlZSB3aXRoIGRldl93YXJuID8NCg0KPj4gKwkJd3JpdGVsX3JlbGF4ZWQoU1RNMzJGN19JMkNfSUNSX0FSTE9DRiwgYmFzZSArIFNUTTMyRjdfSTJDX0lDUik7DQo+PiArCQlmN19tc2ctPnJlc3VsdCA9IC1FQUdBSU47DQo+PiArCX0NCj4+ICsNCj4+ICsJc3RtMzJmN19pMmNfZGlzYWJsZV9pcnEoaTJjX2RldiwgU1RNMzJGN19JMkNfQUxMX0lSUV9NQVNLKTsNCj4+ICsNCj4+ICsJY29tcGxldGUoJmkyY19kZXYtPmNvbXBsZXRlKTsNCj4+ICsNCj4+ICsJcmV0dXJuIElSUV9IQU5ETEVEOw0KPj4gK30NCj4+ICsNCj4+ICtzdGF0aWMgaW50IHN0bTMyZjdfaTJjX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwNCj4+ICsJCQkgICAgc3RydWN0IGkyY19tc2cgbXNnc1tdLCBpbnQgbnVtKQ0KPj4gK3sNCj4+ICsJc3RydWN0IHN0bTMyZjdfaTJjX2RldiAqaTJjX2RldiA9IGkyY19nZXRfYWRhcGRhdGEoaTJjX2FkYXApOw0KPj4gKwlzdHJ1Y3Qgc3RtMzJmN19pMmNfbXNnICpmN19tc2cgPSAmaTJjX2Rldi0+ZjdfbXNnOw0KPj4gKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7DQo+PiArCWludCByZXQ7DQo+PiArDQo+PiArCWkyY19kZXYtPm1zZyA9IG1zZ3M7DQo+PiArCWkyY19kZXYtPm1zZ19udW0gPSBudW07DQo+PiArCWkyY19kZXYtPm1zZ19pZCA9IDA7DQo+PiArDQo+PiArCXJldCA9IGNsa19lbmFibGUoaTJjX2Rldi0+Y2xrKTsNCj4+ICsJaWYgKHJldCkgew0KPj4gKwkJZGV2X2VycihpMmNfZGV2LT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIGNsb2NrXG4iKTsNCj4+ICsJCXJldHVybiByZXQ7DQo+PiArCX0NCj4+ICsNCj4+ICsJcmV0ID0gc3RtMzJmN19pMmNfd2FpdF9mcmVlX2J1cyhpMmNfZGV2KTsNCj4+ICsJaWYgKHJldCkNCj4+ICsJCWdvdG8gY2xrX2ZyZWU7DQo+PiArDQo+PiArCXN0bTMyZjdfaTJjX3hmZXJfbXNnKGkyY19kZXYsIG1zZ3MpOw0KPj4gKw0KPj4gKwl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpMmNfZGV2LT5jb21wbGV0ZSwNCj4+ICsJCQkJCSAgICAgIGkyY19kZXYtPmFkYXAudGltZW91dCk7DQo+PiArCXJldCA9IGY3X21zZy0+cmVzdWx0Ow0KPj4gKw0KPj4gKwlpZiAoIXRpbWVvdXQpIHsNCj4+ICsJCWRldl9kYmcoaTJjX2Rldi0+ZGV2LCAiQWNjZXNzIHRvIHNsYXZlIDB4JXggdGltZWQgb3V0XG4iLA0KPj4gKwkJCWkyY19kZXYtPm1zZy0+YWRkcik7DQo+PiArCQlyZXQgPSAtRVRJTUVET1VUOw0KPj4gKwl9DQo+PiArDQo+PiArY2xrX2ZyZWU6DQo+PiArCWNsa19kaXNhYmxlKGkyY19kZXYtPmNsayk7DQo+PiArDQo+PiArCXJldHVybiAocmV0IDwgMCkgPyByZXQgOiBudW07DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyB1MzIgc3RtMzJmN19pMmNfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApDQo+PiArew0KPj4gKwlyZXR1cm4gSTJDX0ZVTkNfSTJDIHwgSTJDX0ZVTkNfU01CVVNfRU1VTDsNCj4+ICt9DQo+PiArDQo+PiArc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIHN0bTMyZjdfaTJjX2FsZ28gPSB7DQo+PiArCS5tYXN0ZXJfeGZlciA9IHN0bTMyZjdfaTJjX3hmZXIsDQo+PiArCS5mdW5jdGlvbmFsaXR5ID0gc3RtMzJmN19pMmNfZnVuYywNCj4+ICt9Ow0KPj4gKw0KPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN0bTMyZjdfaTJjX21hdGNoW10gPSB7DQo+PiArCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RtMzJmNy1pMmMiLCAuZGF0YSA9ICZzdG0zMmY3X3NldHVwfSwNCj4+ICsJe30sDQo+PiArfTsNCj4+ICtNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzdG0zMmY3X2kyY19tYXRjaCk7DQo+IA0KPiBJIHRob3VnaHQgdGhlIG5hbWluZyB0byBiZSB1bmNvbW1vbiBhbmQgd2FudGVkIHRvIHN1Z2dlc3QgX2lkcyBhcw0KPiBzdWZmaXguIEJ1dCBncmVwIHByb3ZlcyBtZSB3cm9uZyBoZXJlLiBJJ2QgbGlrZSB0byBzZWUgdGhpcyBmdXJ0aGVyDQo+IGRvd24sIGp1c3QgYWJvdmUgc3RtMzJmN19pMmNfZHJpdmVyLg0KPiANCg0Kb2sNCg0KPj4gK3N0YXRpYyBpbnQgc3RtMzJmN19pMmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikNCj4+ICt7DQo+PiArCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsNCj4+ICsJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7DQo+PiArCXN0cnVjdCBzdG0zMmY3X2kyY19kZXYgKmkyY19kZXY7DQo+PiArCXN0cnVjdCBzdG0zMmY3X2kyY19zZXR1cCAqc2V0dXA7DQo+PiArCXN0cnVjdCByZXNvdXJjZSAqcmVzOw0KPj4gKwl1MzIgaXJxX2Vycm9yLCBpcnFfZXZlbnQsIGNsa19yYXRlLCByaXNlX3RpbWUsIGZhbGxfdGltZTsNCj4+ICsJc3RydWN0IGkyY19hZGFwdGVyICphZGFwOw0KPj4gKwlzdHJ1Y3QgcmVzZXRfY29udHJvbCAqcnN0Ow0KPj4gKwlpbnQgcmV0Ow0KPj4gKw0KPj4gKwlpMmNfZGV2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqaTJjX2RldiksIEdGUF9LRVJORUwpOw0KPj4gKwlpZiAoIWkyY19kZXYpDQo+PiArCQlyZXR1cm4gLUVOT01FTTsNCj4+ICsNCj4+ICsJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsNCj4+ICsJaTJjX2Rldi0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOw0KPj4gKwlpZiAoSVNfRVJSKGkyY19kZXYtPmJhc2UpKQ0KPj4gKwkJcmV0dXJuIFBUUl9FUlIoaTJjX2Rldi0+YmFzZSk7DQo+PiArDQo+PiArCWlycV9ldmVudCA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsNCj4+ICsJaWYgKCFpcnFfZXZlbnQpIHsNCj4+ICsJCWRldl9lcnIoJnBkZXYtPmRldiwgIklSUSBldmVudCBtaXNzaW5nIG9yIGludmFsaWRcbiIpOw0KPj4gKwkJcmV0dXJuIC1FSU5WQUw7DQo+PiArCX0NCj4+ICsNCj4+ICsJaXJxX2Vycm9yID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDEpOw0KPj4gKwlpZiAoIWlycV9lcnJvcikgew0KPj4gKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiSVJRIGVycm9yIG1pc3Npbmcgb3IgaW52YWxpZFxuIik7DQo+PiArCQlyZXR1cm4gLUVJTlZBTDsNCj4+ICsJfQ0KPj4gKw0KPj4gKwlpMmNfZGV2LT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7DQo+PiArCWlmIChJU19FUlIoaTJjX2Rldi0+Y2xrKSkgew0KPj4gKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRXJyb3I6IE1pc3NpbmcgY29udHJvbGxlciBjbG9ja1xuIik7DQo+PiArCQlyZXR1cm4gUFRSX0VSUihpMmNfZGV2LT5jbGspOw0KPj4gKwl9DQo+PiArCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShpMmNfZGV2LT5jbGspOw0KPj4gKwlpZiAocmV0KSB7DQo+PiArCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcHJlcGFyZV9lbmFibGUgY2xvY2tcbiIpOw0KPj4gKwkJcmV0dXJuIHJldDsNCj4+ICsJfQ0KPj4gKw0KPj4gKwlyc3QgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOw0KPj4gKwlpZiAoSVNfRVJSKHJzdCkpIHsNCj4+ICsJCWRldl9lcnIoJnBkZXYtPmRldiwgIkVycm9yOiBNaXNzaW5nIGNvbnRyb2xsZXIgcmVzZXRcbiIpOw0KPj4gKwkJcmV0ID0gUFRSX0VSUihyc3QpOw0KPj4gKwkJZ290byBjbGtfZnJlZTsNCj4+ICsJfQ0KPj4gKwlyZXNldF9jb250cm9sX2Fzc2VydChyc3QpOw0KPj4gKwl1ZGVsYXkoMik7DQo+PiArCXJlc2V0X2NvbnRyb2xfZGVhc3NlcnQocnN0KTsNCj4+ICsNCj4+ICsJaTJjX2Rldi0+c3BlZWQgPSBTVE0zMl9JMkNfU1BFRURfU1RBTkRBUkQ7DQo+PiArCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiY2xvY2stZnJlcXVlbmN5IiwgJmNsa19yYXRlKTsNCj4+ICsJaWYgKCghcmV0KSAmJiAoY2xrX3JhdGUgPT0gNDAwMDAwKSkNCj4+ICsJCWkyY19kZXYtPnNwZWVkID0gU1RNMzJfSTJDX1NQRUVEX0ZBU1Q7DQo+PiArCWVsc2UgaWYgKCghcmV0KSAmJiAoY2xrX3JhdGUgPT0gMTAwMDAwMCkpDQo+PiArCQlpMmNfZGV2LT5zcGVlZCA9IFNUTTMyX0kyQ19TUEVFRF9GQVNUX1BMVVM7DQo+IA0KPiBEaWQgeW91IHVzZSBhbiBlYXJseSBwYXRjaCBvZiBzdG0zMmY0IGFzIGN1dC1uLXBhc3RlIHNvdXJjZT8gQmV0dGVyIHVzZToNCj4gDQo+IAlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImNsb2NrLWZyZXF1ZW5jeSIsICZjbGtfcmF0ZSk7DQo+IAlpZiAoIXJldCAmJiBjbGtfcmF0ZSA+PSAxMDAwMDAwKSB7DQo+IAkJaTJjX2Rldi0+c3BlZWQgPSBTVE0zMl9JMkNfU1BFRURfRkFTVF9QTFVTOw0KPiAJfSBlbHNlIGlmICghcmV0ICYmIGNsa19yYXRlID49IDQwMDAwMCkgew0KPiAJCWkyY19kZXYtPnNwZWVkID0gU1RNMzJfSTJDX1NQRUVEX0ZBU1Q7DQo+IAl9IGVsc2UgaWYgKCFyZXQgJiYgY2xrX3JhdGUgPj0gMTAwMDAwKQ0KPiAJCWkyY19kZXYtPnNwZWVkID0gU1RNMzJfSTJDX1NQRUVEX1NUQU5EQVJEOw0KPiAJZWxzZSB7DQo+IAkJZGV2X2VyciguLi4sICJVbnN1cHBvcnRlZCBjbG9jayBzcGVlZFxuIik7DQo+IAkJcmV0dXJuIC1FSU5WQUw7DQo+IAl9DQo+IA0KPiBhbmQgSSBzdWdnZXN0IHRvIGRvIHRoaXMgYmVmb3JlIHRvdWNoaW5nIHRoZSBoYXJkd2FyZSwgaS5lLiAoYXQgbGVhc3QpDQo+IGFib3ZlIHJlc2V0X2NvbnRyb2xfYXNzZXJ0KCkuDQo+IA0KDQpBZ3JlZS4NCg0KPj4gKwlpMmNfZGV2LT5kZXYgPSAmcGRldi0+ZGV2Ow0KPj4gKw0KPj4gKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGlycV9ldmVudCwgc3RtMzJmN19pMmNfaXNyX2V2ZW50LCAwLA0KPj4gKwkJCSAgICAgICBwZGV2LT5uYW1lLCBpMmNfZGV2KTsNCj4+ICsJaWYgKHJldCkgew0KPj4gKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgaXJxIGV2ZW50ICVpXG4iLA0KPj4gKwkJCWlycV9ldmVudCk7DQo+PiArCQlnb3RvIGNsa19mcmVlOw0KPj4gKwl9DQo+PiArDQo+PiArCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaXJxX2Vycm9yLCBzdG0zMmY3X2kyY19pc3JfZXJyb3IsIDAsDQo+PiArCQkJICAgICAgIHBkZXYtPm5hbWUsIGkyY19kZXYpOw0KPj4gKwlpZiAocmV0KSB7DQo+PiArCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBpcnEgZXJyb3IgJWlcbiIsDQo+PiArCQkJaXJxX2Vycm9yKTsNCj4+ICsJCWdvdG8gY2xrX2ZyZWU7DQo+PiArCX0NCj4+ICsNCj4+ICsJbWF0Y2ggPSBvZl9tYXRjaF9kZXZpY2Uoc3RtMzJmN19pMmNfbWF0Y2gsICZwZGV2LT5kZXYpOw0KPj4gKwlpZiAobWF0Y2ggJiYgbWF0Y2gtPmRhdGEpDQo+PiArCQlzZXR1cCA9IChzdHJ1Y3Qgc3RtMzJmN19pMmNfc2V0dXAgKiltYXRjaC0+ZGF0YTsNCj4+ICsJZWxzZQ0KPj4gKwkJZ290byBjbGtfZnJlZTsNCj4gDQo+IFdoeSBkbyB5b3UgdXNlIHRoaXMgY29uc3RydWN0IGlmIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgY29tcGF0aWJsZSB0aGF0DQo+IGlzIHN1cHBvcnRlZD8gVGhpcyBpcyBvcGVuIGNvZGluZyBvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEsIGFuDQo+IGFkZGl0aW9uYWwgYmVuZWZpdCBvZiB1c2luZyB0aGlzIG9uZSBpcyB0aGF0IHlvdSBkb24ndCBuZWVkDQo+IHN0bTMyZjdfaTJjX21hdGNoIGhlcmUgd2hpY2ggaXMgYSBwcmVjb25kaXRpb24gdG8gbW92ZSB0aGlzIGRvd24gYXMNCj4gc3VnZ2VzdGVkIGFib3ZlLg0KPiANCg0KT2suIEkgYWdyZWUuDQoNCj4+ICsNCj4+ICsJcmV0ID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKGkyY19kZXYtPmRldiwgImkyYy1zY2wtcmlzaW5nLXRpbWUtbnMiLA0KPj4gKwkJCQkgICAgICAgJnJpc2VfdGltZSk7DQo+PiArCWlmICghcmV0KQ0KPj4gKwkJc2V0dXAtPnJpc2VfdGltZSA9IHJpc2VfdGltZTsNCj4+ICsNCj4+ICsJcmV0ID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKGkyY19kZXYtPmRldiwgImkyYy1zY2wtZmFsbGluZy10aW1lLW5zIiwNCj4+ICsJCQkJICAgICAgICZmYWxsX3RpbWUpOw0KPj4gKwlpZiAoIXJldCkNCj4+ICsJCXNldHVwLT5mYWxsX3RpbWUgPSBmYWxsX3RpbWU7DQo+PiArDQo+PiArCXJldCA9IHN0bTMyZjdfaTJjX3NldHVwX3RpbWluZyhpMmNfZGV2LCBzZXR1cCk7DQo+PiArCWlmIChyZXQpDQo+PiArCQlnb3RvIGNsa19mcmVlOw0KPj4gKw0KPj4gKwlzdG0zMmY3X2kyY19od19jb25maWcoaTJjX2Rldik7DQo+PiArDQo+PiArCWFkYXAgPSAmaTJjX2Rldi0+YWRhcDsNCj4+ICsJaTJjX3NldF9hZGFwZGF0YShhZGFwLCBpMmNfZGV2KTsNCj4+ICsJc25wcmludGYoYWRhcC0+bmFtZSwgc2l6ZW9mKGFkYXAtPm5hbWUpLCAiU1RNMzJGNyBJMkMoJXBhKSIsDQo+PiArCQkgJnJlcy0+c3RhcnQpOw0KPj4gKwlhZGFwLT5vd25lciA9IFRISVNfTU9EVUxFOw0KPj4gKwlhZGFwLT50aW1lb3V0ID0gMiAqIEhaOw0KPj4gKwlhZGFwLT5yZXRyaWVzID0gMDsNCj4+ICsJYWRhcC0+YWxnbyA9ICZzdG0zMmY3X2kyY19hbGdvOw0KPj4gKwlhZGFwLT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsNCj4+ICsJYWRhcC0+ZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsNCj4+ICsNCj4+ICsJaW5pdF9jb21wbGV0aW9uKCZpMmNfZGV2LT5jb21wbGV0ZSk7DQo+PiArDQo+PiArCXJldCA9IGkyY19hZGRfYWRhcHRlcihhZGFwKTsNCj4+ICsJaWYgKHJldCkgew0KPj4gKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFkZCBhZGFwdGVyXG4iKTsNCj4+ICsJCWdvdG8gY2xrX2ZyZWU7DQo+PiArCX0NCj4+ICsNCj4+ICsJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaTJjX2Rldik7DQo+IA0KPiBJJ2QgZG8gdGhpcyBlYXJsaWVyLiBUaGVyZSBpcyBubyByZWFsIHByb2JsZW0gdGhhdCBpcyBmaXhlZCwgYXMgdGhlIG9ubHkNCj4gdXNlciBpcyBzdG0zMmY3X2kyY19yZW1vdmUgdGhhdCBpcyBvbmx5IGNhbGxlZCB3aGVuIHN0bTMyZjdfaTJjX3Byb2JlDQo+IHJldHVybnMgc3VjY2VzcywgYnV0IGl0IHN0aWxsIGZlZWxzIGJldHRlci4gTWlnaHQgYmUgc3ViamVjdGl2ZSwgc28NCj4gaWdub3JlIGF0IHdpbGwuDQo+IA0KDQpvaw0KDQo+PiArCWNsa19kaXNhYmxlKGkyY19kZXYtPmNsayk7DQo+PiArDQo+PiArCWRldl9pbmZvKGkyY19kZXYtPmRldiwgIlNUTTMyRjcgSTJDLSVkIGRyaXZlciByZWdpc3RlcmVkXG4iLCBhZGFwLT5ucik7DQo+IA0KPiBUaGlzIGlzIHdyb25nLiBUaGUgZHJpdmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCB2aWENCj4gDQo+IAltb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHN0bTMyZjdfaTJjX2RyaXZlcik7DQo+IA0KPiBiZWxvdy4gV2hhdCB5b3Ugd2FudCB0byBjbGFpbSBoZXJlIGlzLCB0aGF0IHRoZSBkcml2ZXIgYm91bmQgYSBkZXZpY2UuDQo+IA0KDQpJIHdpbGwgcmVwaHJhc2UgdGhlbi4NCg0KPj4gKw0KPj4gKwlyZXR1cm4gMDsNCj4+ICsNCj4+ICtjbGtfZnJlZToNCj4+ICsJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGkyY19kZXYtPmNsayk7DQo+PiArDQo+PiArCXJldHVybiByZXQ7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyBpbnQgc3RtMzJmN19pMmNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpDQo+PiArew0KPj4gKwlzdHJ1Y3Qgc3RtMzJmN19pMmNfZGV2ICppMmNfZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7DQo+PiArDQo+PiArCWkyY19kZWxfYWRhcHRlcigmaTJjX2Rldi0+YWRhcCk7DQo+PiArDQo+PiArCWNsa191bnByZXBhcmUoaTJjX2Rldi0+Y2xrKTsNCj4+ICsNCj4+ICsJcmV0dXJuIDA7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHN0bTMyZjdfaTJjX2RyaXZlciA9IHsNCj4+ICsJLmRyaXZlciA9IHsNCj4+ICsJCS5uYW1lID0gInN0bTMyZjctaTJjIiwNCj4+ICsJCS5vZl9tYXRjaF90YWJsZSA9IHN0bTMyZjdfaTJjX21hdGNoLA0KPj4gKwl9LA0KPj4gKwkucHJvYmUgPSBzdG0zMmY3X2kyY19wcm9iZSwNCj4+ICsJLnJlbW92ZSA9IHN0bTMyZjdfaTJjX3JlbW92ZSwNCj4+ICt9Ow0KPj4gKw0KPj4gK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3RtMzJmN19pMmNfZHJpdmVyKTsNCj4+ICsNCj4+ICtNT0RVTEVfQVVUSE9SKCJNJ2JvdW1iYSBDZWRyaWMgTWFkaWFuZ2EgPGNlZHJpYy5tYWRpYW5nYUBnbWFpbC5jb20+Iik7DQo+PiArTU9EVUxFX0RFU0NSSVBUSU9OKCJTVE1pY3JvZWxlY3Ryb25pY3MgU1RNMzJGNyBJMkMgZHJpdmVyIik7DQo+PiArTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOw0KPiANCg0KRWFnZXIgdG8gcmVhZCB5b3VyIG5leHQgcmVtYXJrcyA6KQ==--To unsubscribe from this list: send the line "unsubscribe devicetree" inthe body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.orgMore majordomo info at http://vger.kernel.org/majordomo-info.html