LyoKICogQ29weXJpZ2h0IC0gR2FsaWxlbyB0ZWNobm9sb2d5LgogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCi8qCiAqCiAqIHdyaXR0ZW4gb3IgY29sbGVjdGVkIGFuZCBzb21ldGltZXMgcmV3cml0dGVuIGJ5CiAqIEluZ28gQXNzbXVzIDxpbmdvLmFzc211c0BrZXltaWxlLmNvbT4KICoKICovCgoKI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSAiLi4vaW5jbHVkZS9jb3JlLmgiCiNpbmNsdWRlICIuLi9pbmNsdWRlL21lbW9yeS5oIgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBtZW1vcnlHZXRCYW5rQmFzZUFkZHJlc3MgLSBSZXR1cm5zIHRoZSBiYXNlIGFkZHJlc3Mgb2YgYSBtZW1vcnkgYmFuay4KKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGJhc2UgYWRkcmVzcyBvZiBvbmUgb2YgdGhlIFNEUkFNknMgbWVtb3J5CiogICAgICAgYmFua3MuIFRoZXJlIGFyZSA0IG1lbW9yeSBiYW5rcyBhbmQgZWFjaCBvbmUgcmVwcmVzZW50cyBvbmUgRElNTSBzaWRlLgoqIElOUFVUOgoqICAgICAgIE1FTU9SWV9CQU5LIGJhbmsgLSBTZWxlY3RzIG9uZSBvZiB0aGUgZm91ciBiYW5rcyBhcyBkZWZpbmVkIGluIE1lbW9yeS5oLgoqIE9VVFBVVDoKKiAgICAgICBOb25lLgoqIFJFVFVSTjoKKiAgICAgICAzMiBiaXQgTWVtb3J5IGJhbmsgYmFzZSBhZGRyZXNzLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdW5zaWduZWQgbG9uZyBtZW1vcnlHZXRCYW5rUmVnT2Zmc2V0IChNRU1PUllfQkFOSyBiYW5rKQp7Cglzd2l0Y2ggKGJhbmspIHsKCWNhc2UgQkFOSzA6CgkJcmV0dXJuIFNDU18wX0xPV19ERUNPREVfQUREUkVTUzsKCWNhc2UgQkFOSzE6CgkJcmV0dXJuIFNDU18xX0xPV19ERUNPREVfQUREUkVTUzsKCWNhc2UgQkFOSzI6CgkJcmV0dXJuIFNDU18yX0xPV19ERUNPREVfQUREUkVTUzsKCWNhc2UgQkFOSzM6CgkJcmV0dXJuIFNDU18zX0xPV19ERUNPREVfQUREUkVTUzsKCgl9CglyZXR1cm4gU0NTXzBfTE9XX0RFQ09ERV9BRERSRVNTOwkvKiBkZWZhdWx0IHZhbHVlICovCn0KCnVuc2lnbmVkIGludCBtZW1vcnlHZXRCYW5rQmFzZUFkZHJlc3MgKE1FTU9SWV9CQU5LIGJhbmspCnsKCXVuc2lnbmVkIGludCBiYXNlOwoJdW5zaWduZWQgaW50IHJlZ09mZnNldCA9IG1lbW9yeUdldEJhbmtSZWdPZmZzZXQgKGJhbmspOwoKCUdUX1JFR19SRUFEIChyZWdPZmZzZXQsICZiYXNlKTsKCWJhc2UgPSBiYXNlIDw8IDE2OwkvKiBNVjY0MzZ4ICovCglyZXR1cm4gYmFzZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBtZW1vcnlHZXREZXZpY2VCYXNlQWRkcmVzcyAtIFJldHVybnMgdGhlIGJhc2UgYWRkcmVzcyBvZiBhIGRldmljZS4KKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGJhc2UgYWRkcmVzcyBvZiBhIGRldmljZSBvbiB0aGUgc3lzdGVtLiBUaGVyZQoqICAgICAgIGFyZSA1IHBvc3NpYmxlIGRldmljZXMgKDAgLSA0IGFuZCBvbmUgYm9vdCBkZXZpY2UpIGFzIGRlZmluZWQgaW4KKiAgICAgICBndE1lbW9yeS5oLiBFYWNoIG9mIHRoZSBkZXZpY2UgcGFyYW1ldGVycyBpcyBtYXBlZCB0byBvbmUgb2YgdGhlIENTCiogICAgICAgKERldmljZXMgY2hpcCBzZWxlY3RzKSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIuCiogSU5QVVQ6CiogICAgICAgZGV2aWNlIC0gU2VsZWN0cyBvbmUgb2YgdGhlIGZpdmUgZGV2aWNlcyBhcyBkZWZpbmVkIGluIE1lbW9yeS5oLgoqIE9VVFBVVDoKKiAgICAgICBOb25lLgoqIFJFVFVSTjoKKiAgICAgICAzMiBiaXQgRGV2aWNlIGJhc2UgYWRkcmVzcy4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdW5zaWduZWQgaW50IG1lbW9yeUdldERldmljZVJlZ09mZnNldCAoREVWSUNFIGRldmljZSkKewoJc3dpdGNoIChkZXZpY2UpIHsKCWNhc2UgREVWSUNFMDoKCQlyZXR1cm4gQ1NfMF9MT1dfREVDT0RFX0FERFJFU1M7CgljYXNlIERFVklDRTE6CgkJcmV0dXJuIENTXzFfTE9XX0RFQ09ERV9BRERSRVNTOwoJY2FzZSBERVZJQ0UyOgoJCXJldHVybiBDU18yX0xPV19ERUNPREVfQUREUkVTUzsKCWNhc2UgREVWSUNFMzoKCQlyZXR1cm4gQ1NfM19MT1dfREVDT0RFX0FERFJFU1M7CgljYXNlIEJPT1RfREVWSUNFOgoJCXJldHVybiBCT09UQ1NfTE9XX0RFQ09ERV9BRERSRVNTOwoJfQoJcmV0dXJuIENTXzBfTE9XX0RFQ09ERV9BRERSRVNTOwkvKiBkZWZhdWx0IHZhbHVlICovCn0KCnVuc2lnbmVkIGludCBtZW1vcnlHZXREZXZpY2VCYXNlQWRkcmVzcyAoREVWSUNFIGRldmljZSkKewoJdW5zaWduZWQgaW50IHJlZ0Jhc2U7Cgl1bnNpZ25lZCBpbnQgcmVnT2Zmc2V0ID0gbWVtb3J5R2V0RGV2aWNlUmVnT2Zmc2V0IChkZXZpY2UpOwoKCUdUX1JFR19SRUFEIChyZWdPZmZzZXQsICZyZWdCYXNlKTsKCglyZWdCYXNlID0gcmVnQmFzZSA8PCAxNjsJLyogTVY2NDM2eCAqLwoJcmV0dXJuIHJlZ0Jhc2U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogTWVtb3J5R2V0UGNpQmFzZUFkZHIgLSBSZXR1cm5zIHRoZSBiYXNlIGFkZHJlc3Mgb2YgYSBQQ0kgd2luZG93LgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYmFzZSBhZGRyZXNzIG9mIGEgUENJIHdpbmRvdy4gVGhlcmUgYXJlIDUKKiAgICAgICBwb3NzaWJsZSBQQ0kgd2luZG93cyAobWVtb3J5IDAgLSAzIGFuZCBvbmUgZm9yIEkvTykgZm9yIGVhY2ggUENJCiogICAgICAgaW50ZXJmYWNlIGFzIGRlZmluZWQgaW4gZ3RNZW1vcnkuaCwgdXNlZCBieSB0aGUgQ1BVJ3MgYWRkcmVzcyBkZWNvZGluZwoqICAgICAgIG1lY2hhbmlzbS4KKglOZXcgaW4gTVY2NDM2eAoqIElOUFVUOgoqICAgICAgIHBjaVdpbmRvdyAtIFNlbGVjdHMgb25lIG9mIHRoZSBQQ0kgd2luZG93cyBhcyBkZWZpbmVkIGluIE1lbW9yeS5oLgoqIE9VVFBVVDoKKiAgICAgICBOb25lLgoqIFJFVFVSTjoKKiAgICAgICAzMiBiaXQgUENJIHdpbmRvdyBiYXNlIGFkZHJlc3MuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnVuc2lnbmVkIGludCBNZW1vcnlHZXRQY2lCYXNlQWRkciAoUENJX01FTV9XSU5ET1cgcGNpV2luZG93KQp7Cgl1bnNpZ25lZCBpbnQgYmFzZUFkZHJSZWcsIGJhc2U7CgoJc3dpdGNoIChwY2lXaW5kb3cpIHsKCWNhc2UgUENJXzBfSU86CgkJYmFzZUFkZHJSZWcgPSBQQ0lfMElfT19MT1dfREVDT0RFX0FERFJFU1M7CS8qUENJXzBfSU9fQkFTRV9BRERSOyAgKi8KCQlicmVhazsKCWNhc2UgUENJXzBfTUVNMDoKCQliYXNlQWRkclJlZyA9IFBDSV8wTUVNT1JZMF9MT1dfREVDT0RFX0FERFJFU1M7CS8qUENJXzBfTUVNT1JZMF9CQVNFX0FERFI7ICovCgkJYnJlYWs7CgljYXNlIFBDSV8wX01FTTE6CgkJYmFzZUFkZHJSZWcgPSBQQ0lfME1FTU9SWTFfTE9XX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8wX01FTU9SWTFfQkFTRV9BRERSOyAqLwoJCWJyZWFrOwoJY2FzZSBQQ0lfMF9NRU0yOgoJCWJhc2VBZGRyUmVnID0gUENJXzBNRU1PUlkyX0xPV19ERUNPREVfQUREUkVTUzsJLypQQ0lfMF9NRU1PUlkyX0JBU0VfQUREUjsgICovCgkJYnJlYWs7CgljYXNlIFBDSV8wX01FTTM6CgkJYmFzZUFkZHJSZWcgPSBQQ0lfME1FTU9SWTNfTE9XX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8wX01FTU9SWTNfQkFTRV9BRERSOyAgKi8KCQlicmVhazsKI2lmZGVmIElOQ0xVREVfUENJXzEKCWNhc2UgUENJXzFfSU86CgkJYmFzZUFkZHJSZWcgPSBQQ0lfMUlfT19MT1dfREVDT0RFX0FERFJFU1M7CS8qUENJXzFfSU9fQkFTRV9BRERSOyAgKi8KCQlicmVhazsKCWNhc2UgUENJXzFfTUVNMDoKCQliYXNlQWRkclJlZyA9IFBDSV8xTUVNT1JZMF9MT1dfREVDT0RFX0FERFJFU1M7CS8qUENJXzFfTUVNT1JZMF9CQVNFX0FERFI7ICovCgkJYnJlYWs7CgljYXNlIFBDSV8xX01FTTE6CgkJYmFzZUFkZHJSZWcgPSBQQ0lfMU1FTU9SWTFfTE9XX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8xX01FTU9SWTFfQkFTRV9BRERSOyAgKi8KCQlicmVhazsKCWNhc2UgUENJXzFfTUVNMjoKCQliYXNlQWRkclJlZyA9IFBDSV8xTUVNT1JZMl9MT1dfREVDT0RFX0FERFJFU1M7CS8qUENJXzFfTUVNT1JZMl9CQVNFX0FERFI7ICAqLwoJCWJyZWFrOwoJY2FzZSBQQ0lfMV9NRU0zOgoJCWJhc2VBZGRyUmVnID0gUENJXzFNRU1PUlkzX0xPV19ERUNPREVfQUREUkVTUzsJLypQQ0lfMV9NRU1PUlkzX0JBU0VfQUREUjsgKi8KCQlicmVhazsKI2VuZGlmIC8qIElOQ0xVREVfUENJXzEgKi8KCWRlZmF1bHQ6CgkJcmV0dXJuIDB4ZmZmZmZmZmY7Cgl9CglHVF9SRUdfUkVBRCAoYmFzZUFkZHJSZWcsICZiYXNlKTsKCXJldHVybiAoYmFzZSA8PCAxNik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogbWVtb3J5R2V0QmFua1NpemUgLSBSZXR1cm5zIHRoZSBzaXplIG9mIGEgbWVtb3J5IGJhbmsuCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzaXplIG9mIG1lbW9yeSBiYW5rIGFzIGRlc2NyaWJlZCBpbgoqICAgICAgICdndE1lbW9yeUdldEJhbmtCYXNlQWRkcmVzcycgZnVuY3Rpb24uCiogSU5QVVQ6CiogICAgICAgYmFuayAtIFNlbGVjdHMgb25lIG9mIHRoZSBmb3VyIGJhbmtzIGFzIGRlZmluZWQgaW4gTWVtb3J5LmguCiogT1VUUFVUOgoqICAgICAgIE5vbmUuCiogUkVUVVJOOgoqICAgICAgIDMyIGJpdCBzaXplIG1lbW9yeSBiYW5rIHNpemUgb3IgMCBmb3IgYSBjbG9zZWQgb3Igbm9uIHBvcHVsYXRlZCBiYW5rLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnVuc2lnbmVkIGludCBtZW1vcnlHZXRCYW5rU2l6ZSAoTUVNT1JZX0JBTksgYmFuaykKewoJdW5zaWduZWQgaW50IHNpemVSZWcsIHNpemU7CglNRU1PUllfV0lORE9XIHdpbmRvdzsKCglzd2l0Y2ggKGJhbmspIHsKCWNhc2UgQkFOSzA6CgkJc2l6ZVJlZyA9IFNDU18wX0hJR0hfREVDT0RFX0FERFJFU1M7CS8qIENTXzBfU0laRTsgKi8KCQl3aW5kb3cgPSBDU18wX1dJTkRPVzsKCQlicmVhazsKCWNhc2UgQkFOSzE6CgkJc2l6ZVJlZyA9IFNDU18xX0hJR0hfREVDT0RFX0FERFJFU1M7CS8qIENTXzFfU0laRTsgKi8KCQl3aW5kb3cgPSBDU18xX1dJTkRPVzsKCQlicmVhazsKCWNhc2UgQkFOSzI6CgkJc2l6ZVJlZyA9IFNDU18yX0hJR0hfREVDT0RFX0FERFJFU1M7CS8qIENTXzJfU0laRTsgKi8KCQl3aW5kb3cgPSBDU18yX1dJTkRPVzsKCQlicmVhazsKCWNhc2UgQkFOSzM6CgkJc2l6ZVJlZyA9IFNDU18zX0hJR0hfREVDT0RFX0FERFJFU1M7CS8qIENTXzNfU0laRTsgKi8KCQl3aW5kb3cgPSBDU18zX1dJTkRPVzsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIDA7CgkJYnJlYWs7Cgl9CgkvKiBJZiB0aGUgd2luZG93IGlzIGNsb3NlZCwgYSBzaXplIG9mIDAgaXMgcmV0dXJuZWQgKi8KCWlmIChNZW1vcnlHZXRNZW1XaW5kb3dTdGF0dXMgKHdpbmRvdykgIT0gTUVNX1dJTkRPV19FTkFCTEVEKQoJCXJldHVybiAwOwoJR1RfUkVHX1JFQUQgKHNpemVSZWcsICZzaXplKTsKCXNpemUgPSAoKHNpemUgPDwgMTYpIHwgMHhmZmZmKSArIDE7CglyZXR1cm4gc2l6ZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBtZW1vcnlHZXREZXZpY2VTaXplIC0gUmV0dXJucyB0aGUgc2l6ZSBvZiBhIGRldmljZSBtZW1vcnkgc3BhY2UuCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBtZW1vcnkgc3BhY2Ugc2l6ZSBvZiBhIGdpdmVuIGRldmljZS4KKiBJTlBVVDoKKiAgICAgICBkZXZpY2UgLSBTZWxlY3RzIG9uZSBvZiB0aGUgZml2ZSBkZXZpY2VzIGFzIGRlZmluZWQgaW4gTWVtb3J5LmguCiogT1VUUFVUOgoqICAgICAgIE5vbmUuCiogUkVUVVJOOgoqICAgICAgIDMyIGJpdCBzaXplIG9mIGEgZGV2aWNlIG1lbW9yeSBzcGFjZS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdW5zaWduZWQgaW50IG1lbW9yeUdldERldmljZVNpemUgKERFVklDRSBkZXZpY2UpCnsKCXVuc2lnbmVkIGludCBzaXplUmVnLCBzaXplOwoJTUVNT1JZX1dJTkRPVyB3aW5kb3c7CgoJc3dpdGNoIChkZXZpY2UpIHsKCWNhc2UgREVWSUNFMDoKCQlzaXplUmVnID0gQ1NfMF9ISUdIX0RFQ09ERV9BRERSRVNTOwkvKkRFVl9DUzBfU0laRTsgKi8KCQl3aW5kb3cgPSBERVZDU18wX1dJTkRPVzsKCQlicmVhazsKCWNhc2UgREVWSUNFMToKCQlzaXplUmVnID0gQ1NfMV9ISUdIX0RFQ09ERV9BRERSRVNTOwkvKkRFVl9DUzFfU0laRTsgKi8KCQl3aW5kb3cgPSBERVZDU18xX1dJTkRPVzsKCQlicmVhazsKCWNhc2UgREVWSUNFMjoKCQlzaXplUmVnID0gQ1NfMl9ISUdIX0RFQ09ERV9BRERSRVNTOwkvKkRFVl9DUzJfU0laRTsgKi8KCQl3aW5kb3cgPSBERVZDU18yX1dJTkRPVzsKCQlicmVhazsKCWNhc2UgREVWSUNFMzoKCQlzaXplUmVnID0gQ1NfM19ISUdIX0RFQ09ERV9BRERSRVNTOwkvKkRFVl9DUzNfU0laRTsgKi8KCQl3aW5kb3cgPSBERVZDU18zX1dJTkRPVzsKCQlicmVhazsKCWNhc2UgQk9PVF9ERVZJQ0U6CgkJc2l6ZVJlZyA9IEJPT1RDU19ISUdIX0RFQ09ERV9BRERSRVNTOwkvKkJPT1RDU19TSVpFOyAqLwoJCXdpbmRvdyA9IEJPT1RfQ1NfV0lORE9XOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR1cm4gMDsKCQlicmVhazsKCX0KCS8qIElmIHRoZSB3aW5kb3cgaXMgY2xvc2VkLCBhIHNpemUgb2YgMCBpcyByZXR1cm5lZCAqLwoJaWYgKE1lbW9yeUdldE1lbVdpbmRvd1N0YXR1cyAod2luZG93KSAhPSBNRU1fV0lORE9XX0VOQUJMRUQpCgkJcmV0dXJuIDA7CglHVF9SRUdfUkVBRCAoc2l6ZVJlZywgJnNpemUpOwoJc2l6ZSA9ICgoc2l6ZSA8PCAxNikgfCAweGZmZmYpICsgMTsKCXJldHVybiBzaXplOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIE1lbW9yeUdldFBjaVdpbmRvd1NpemUgLSBSZXR1cm5zIHRoZSBzaXplIG9mIGEgUENJIG1lbW9yeSB3aW5kb3cuCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzaXplIG9mIGEgUENJIHdpbmRvdy4KKiBJTlBVVDoKKiAgICAgICBwY2lXaW5kb3cgLSBTZWxlY3RzIG9uZSBvZiB0aGUgUENJIG1lbW9yeSB3aW5kb3dzIGFzIGRlZmluZWQgaW4KKiAgICAgICBNZW1vcnkuaC4KKiBPVVRQVVQ6CiogICAgICAgTm9uZS4KKiBSRVRVUk46CiogICAgICAgMzIgYml0IHNpemUgb2YgYSBQQ0kgbWVtb3J5IHdpbmRvdy4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdW5zaWduZWQgaW50IE1lbW9yeUdldFBjaVdpbmRvd1NpemUgKFBDSV9NRU1fV0lORE9XIHBjaVdpbmRvdykKewoJdW5zaWduZWQgaW50IHNpemVSZWcsIHNpemU7CgoJc3dpdGNoIChwY2lXaW5kb3cpIHsKCWNhc2UgUENJXzBfSU86CgkJc2l6ZVJlZyA9IFBDSV8wSV9PX0hJR0hfREVDT0RFX0FERFJFU1M7CS8qUENJXzBfSU9fU0laRTsgKi8KCQlicmVhazsKCWNhc2UgUENJXzBfTUVNMDoKCQlzaXplUmVnID0gUENJXzBNRU1PUlkwX0hJR0hfREVDT0RFX0FERFJFU1M7CS8qUENJXzBfTUVNT1JZMF9TSVpFOyAqLwoJCWJyZWFrOwoJY2FzZSBQQ0lfMF9NRU0xOgoJCXNpemVSZWcgPSBQQ0lfME1FTU9SWTFfSElHSF9ERUNPREVfQUREUkVTUzsJLypQQ0lfMF9NRU1PUlkxX1NJWkU7ICovCgkJYnJlYWs7CgljYXNlIFBDSV8wX01FTTI6CgkJc2l6ZVJlZyA9IFBDSV8wTUVNT1JZMl9ISUdIX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8wX01FTU9SWTJfU0laRTsgKi8KCQlicmVhazsKCWNhc2UgUENJXzBfTUVNMzoKCQlzaXplUmVnID0gUENJXzBNRU1PUlkzX0hJR0hfREVDT0RFX0FERFJFU1M7CS8qUENJXzBfTUVNT1JZM19TSVpFOyAqLwoJCWJyZWFrOwojaWZkZWYgSU5DTFVERV9QQ0lfMQoJY2FzZSBQQ0lfMV9JTzoKCQlzaXplUmVnID0gUENJXzFJX09fSElHSF9ERUNPREVfQUREUkVTUzsJLypQQ0lfMV9JT19TSVpFOyAqLwoJCWJyZWFrOwoJY2FzZSBQQ0lfMV9NRU0wOgoJCXNpemVSZWcgPSBQQ0lfMU1FTU9SWTBfSElHSF9ERUNPREVfQUREUkVTUzsJLypQQ0lfMV9NRU1PUlkwX1NJWkU7ICovCgkJYnJlYWs7CgljYXNlIFBDSV8xX01FTTE6CgkJc2l6ZVJlZyA9IFBDSV8xTUVNT1JZMV9ISUdIX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8xX01FTU9SWTFfU0laRTsgICovCgkJYnJlYWs7CgljYXNlIFBDSV8xX01FTTI6CgkJc2l6ZVJlZyA9IFBDSV8xTUVNT1JZMl9ISUdIX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8xX01FTU9SWTJfU0laRTsgICovCgkJYnJlYWs7CgljYXNlIFBDSV8xX01FTTM6CgkJc2l6ZVJlZyA9IFBDSV8xTUVNT1JZM19ISUdIX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8xX01FTU9SWTNfU0laRTsgKi8KCQlicmVhazsKI2VuZGlmIC8qIElOQ0xVREVfUENJXzEgKi8KCWRlZmF1bHQ6CgkJcmV0dXJuIDB4MDsKCX0KCS8qIElmIHRoZSBtZW1vcnkgd2luZG93IGlzIGRpc2FibGVkLCByZXRydW4gc2l6ZSA9IDAgKi8KCWlmIChNZW1vcnlHZXRNZW1XaW5kb3dTdGF0dXMgKFBDSV8wX0lPX1dJTkRPVyA8PCBwY2lXaW5kb3cpCgkgICAgPT0gTUVNX1dJTkRPV19ESVNBQkxFRCkKCQlyZXR1cm4gMDsKCUdUX1JFR19SRUFEIChzaXplUmVnLCAmc2l6ZSk7CglzaXplID0gKChzaXplIDw8IDE2KSB8IDB4ZmZmZikgKyAxOwoJcmV0dXJuIHNpemU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogbWVtb3J5R2V0RGV2aWNlV2lkdGggLSBSZXR1cm5zIHRoZSB3aWR0aCBvZiBhIGdpdmVuIGRldmljZS4KKiBERVNDUklQVElPTjoKKiAgICAgICBUaGUgTVYncyBkZXZpY2UgaW50ZXJmYWNlIHN1cHBvcnRzIHVwIHRvIDMyIEJpdCB3aWRlIGRldmljZXMuIEEgZGV2aWNlCiogICAgICAgY2FuIGhhdmUgYSAgMSwgMiwgNCBvciA4IEJ5dGVzIGRhdGEgd2lkdGguIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUKKiAgICAgICB3aWR0aCBvZiBhIGRldmljZSBhcyBkZWZpbmVkIGJ5IHRoZSB1c2VyIG9yIHRoZSBvcGVyYXRpbmcgc3lzdGVtLgoqIElOUFVUOgoqICAgICAgIGRldmljZSAtIFNlbGVjdHMgb25lIG9mIHRoZSBmaXZlIGRldmljZXMgYXMgZGVmaW5lZCBpbiBNZW1vcnkuaC4KKiBPVVRQVVQ6CiogICAgICAgTm9uZS4KKiBSRVRVUk46CiogICAgICAgRGV2aWNlIHdpZHRoIGluIEJ5dGVzICgxLDIsNCBvciA4KSwgMCBpZiBlcnJvciBoYWQgb2NjdXJyZWQuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnVuc2lnbmVkIGludCBtZW1vcnlHZXREZXZpY2VXaWR0aCAoREVWSUNFIGRldmljZSkKewoJdW5zaWduZWQgaW50IHdpZHRoOwoJdW5zaWduZWQgaW50IHJlZ1ZhbHVlOwoKCUdUX1JFR19SRUFEIChERVZJQ0VfQkFOSzBQQVJBTUVURVJTICsgZGV2aWNlICogNCwgJnJlZ1ZhbHVlKTsKCXdpZHRoID0gKHJlZ1ZhbHVlICYgKEJJVDIwIHwgQklUMjEpKSA+PiAyMDsKCXJldHVybiAoQklUMCA8PCB3aWR0aCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogbWVtb3J5TWFwQmFuayAtIFNldCBuZXcgYmFzZSBhZGRyZXNzIGFuZCBzaXplIGZvciBvbmUgb2YgdGhlIG1lbW9yeQoqICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmtzLgoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhlIENQVSBpbnRlcmZhY2UgYWRkcmVzcyBkZWNvZGluZyBtYXAgY29uc2lzdHMgb2YgMjEgYWRkcmVzcyB3aW5kb3dzCiogICAgICAgZm9yIHRoZSBkaWZmZXJlbnQgZGV2aWNlcyAoZS5nLiBDU1szOjBdICxQQ0kwIE1lbSAwLzEvMi8zLi4uKS4gRWFjaAoqICAgICAgIHdpbmRvdyBjYW4gaGF2ZSBhIG1pbmltdW0gb2YgMU1ieXRlcyBvZiBhZGRyZXNzIHNwYWNlLCBhbmQgdXAgdG8gNEdieXRlCiogICAgICAgc3BhY2UuIEVhY2ggYWRkcmVzcyB3aW5kb3cgaXMgZGVmaW5lZCBieSB0d28gcmVnaXN0ZXJzIC0gYmFzZSBhbmQgc2l6ZS4KKiAgICAgICBUaGUgQ1BVIGFkZHJlc3MgaXMgY29tcGFyZWQgd2l0aCB0aGUgdmFsdWVzIGluIHRoZSB2YXJpb3VzIENQVSB3aW5kb3dzCiogICAgICAgdW50aWwgYSBtYXRjaCBpcyBmb3VuZCBhbmQgdGhlIGFkZHJlc3MgaXMgdGhhbiB0YXJnZXRlZCB0byB0aGF0IHdpbmRvdy4KKiAgICAgICBUaGlzIGZ1bmN0aW9uIHNldHMgbmV3IGJhc2UgYW5kIHNpemUgZm9yIG9uZSB0aGUgbWVtb3J5IGJhbmtzCiogICAgICAgKENTMCAtIENTMykuIEl0IGlzIHRoZSBwcm9ncmFtbWVyYHMgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHRoYXQKKiAgICAgICB0aGVyZSBhcmUgbm8gY29uZmxpY3RzIHdpdGggb3RoZXIgbWVtb3J5IHNwYWNlcy4gV2hlbiB0d28gbWVtb3J5IHNwYWNlcwoqICAgICAgIG92ZXJsYXAsIHRoZSBNVpJzIGJlaGF2aW9yIGlzIG5vdCBkZWZpbmVkIC5JZiBhIGJhbmsgbmVlZHMgdG8gYmUgY2xvc2VkLAoqICAgICAgIHNldCB0aGUgkmJhbmtMZW5ndGiSIHBhcmFtZXRlciBzaXplIHRvIDB4MC4KKgoqIElOUFVUOgoqICAgICAgIGJhbmsgICAgICAtIE9uZSBvZiB0aGUgbWVtb3J5IGJhbmtzIChDUzAtQ1MzKSBhcyBkZWZpbmVkIGluIGd0TWVtb3J5LmguCiogICAgICAgYmFua0Jhc2UgIC0gVGhlIG1lbW9yeSBiYW5rIGJhc2UgYWRkcmVzcy4KKiAgICAgICBiYW5rTGVuZ3RoICAtIFRoZSBtZW1vcnkgYmFuayBzaXplLiBUaGlzIGZ1bmN0aW9uIHdpbGwgZGVjcmVtZW50IHRoZQoqICAgICAgICAgICAgICAgICAgICdiYW5rTGVuZ3RoJyBwYXJhbWV0ZXIgYnkgb25lIGFuZCB0aGVuIGNoZWNrIGlmIHRoZSBzaXplIGlzCiogICAgICAgICAgICAgICAgICAgdmFsaWQuIEEgdmFsaWQgc2l6ZSBtdXN0IGJlIHByb2dyYW1lZCBmcm9tIExTQiB0byBNU0IgYXMKKiAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSBvZiCRMZJzIGZvbGxvd2VkIGJ5IHNlcXVlbmNlIG9mIJEwknMuCiogICAgICAgICAgICAgICAgICAgVG8gY2xvc2UgYSBtZW1vcnkgd2luZG93IHNpbXBseSBzZXQgdGhlIHNpemUgdG8gMC4KKiAgICAgIE5PVEUhISEKKiAgICAgICBUaGUgc2l6ZSBtdXN0IGJlIGluIDY0S2J5dGUgZ3JhbnVsYXJpdHkuCiogICAgICAgVGhlIGJhc2UgYWRkcmVzcyBtdXN0IGJlIGFsaWduZWQgdG8gdGhlIHNpemUuCiogT1VUUFVUOgoqICAgICAgIE5vbmUuCiogUkVUVVJOOgoqICAgICAgIEZhbHNlIGZvciBpbnZhbGlkIHNpemUsIHRydWUgb3RoZXJ3aXNlLgoqCiogQ0FVVElPTjogUENJX2Z1bmN0aW9ucyBtdXN0IGJlIGltcGxlbWVudGVkIGxhdGVyIFRvX2RvICEhISEhISEhISEhISEhISEhCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCmJvb2wgbWVtb3J5TWFwQmFuayAoTUVNT1JZX0JBTksgYmFuaywgdW5zaWduZWQgaW50IGJhbmtCYXNlLAoJCSAgICB1bnNpZ25lZCBpbnQgYmFua0xlbmd0aCkKewoJdW5zaWduZWQgaW50IG5ld0Jhc2UsIG5ld1NpemUsIGJhc2VSZWcsIHNpemVSZWcsIHRlbXAsIHJTaGlmdDsKCi8qICAgIFBDSV9JTlRFUk5BTF9CQVIgcGNpQkFSOyAqLwoKCXN3aXRjaCAoYmFuaykgewoJY2FzZSBCQU5LMDoKCQliYXNlUmVnID0gU0NTXzBfTE9XX0RFQ09ERV9BRERSRVNTOwkvKkNTXzBfQkFTRV9BRERSOyAqLwoJCXNpemVSZWcgPSBTQ1NfMF9ISUdIX0RFQ09ERV9BRERSRVNTOwkvKkNTXzBfU0laRTsgKi8KLyogICAgICAgIHBjaUJBUiA9IFBDSV9DUzBfQkFSOyAqLwoJCWJyZWFrOwoJY2FzZSBCQU5LMToKCQliYXNlUmVnID0gU0NTXzFfTE9XX0RFQ09ERV9BRERSRVNTOwkvKkNTXzFfQkFTRV9BRERSOyAqLwoJCXNpemVSZWcgPSBTQ1NfMV9ISUdIX0RFQ09ERV9BRERSRVNTOwkvKkNTXzFfU0laRTsgKi8KCQkvKiAgICAgICAgcGNpQkFSID0gU0NTXzBfSElHSF9ERUNPREVfQUREUkVTUzsgKi8gLypQQ0lfQ1MxX0JBUjsgKi8KCQlicmVhazsKCWNhc2UgQkFOSzI6CgkJYmFzZVJlZyA9IFNDU18yX0xPV19ERUNPREVfQUREUkVTUzsJLypDU18yX0JBU0VfQUREUjsgKi8KCQlzaXplUmVnID0gU0NTXzJfSElHSF9ERUNPREVfQUREUkVTUzsJLypDU18yX1NJWkU7ICovCi8qICAgICAgICBwY2lCQVIgPSBQQ0lfQ1MyX0JBUjsqLwoJCWJyZWFrOwoJY2FzZSBCQU5LMzoKCQliYXNlUmVnID0gU0NTXzNfTE9XX0RFQ09ERV9BRERSRVNTOwkvKkNTXzNfQkFTRV9BRERSOyAqLwoJCXNpemVSZWcgPSBTQ1NfM19ISUdIX0RFQ09ERV9BRERSRVNTOwkvKkNTXzNfU0laRTsgKi8KLyogICAgICAgIHBjaUJBUiA9IFBDSV9DUzNfQkFSOyAqLwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR1cm4gZmFsc2U7Cgl9CgkvKiBJZiB0aGUgc2l6ZSBpcyAwLCB0aGUgd2luZG93IHdpbGwgYmUgZGlzYWJsZWQgKi8KCWlmIChiYW5rTGVuZ3RoID09IDApIHsKCQlNZW1vcnlEaXNhYmxlV2luZG93IChDU18wX1dJTkRPVyA8PCBiYW5rKTsKCQkvKiBEaXNhYmxlIHRoZSBCQVIgZnJvbSB0aGUgUENJIHNsYXZlIHNpZGUgKi8KLyogICAgICAgIGd0UGNpMERpc2FibGVJbnRlcm5hbEJBUihwY2lCQVIpOyAqLwovKiAgICAgICAgZ3RQY2kxRGlzYWJsZUludGVybmFsQkFSKHBjaUJBUik7ICovCgkJcmV0dXJuIHRydWU7Cgl9CgkvKiBUaGUgYmFzZSBhZGRyZXNzIG11c3QgYmUgYWxpZ25lZCB0byB0aGUgc2l6ZSAqLwoJaWYgKChiYW5rQmFzZSAlIGJhbmtMZW5ndGgpICE9IDApIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CglpZiAoYmFua0xlbmd0aCA+PSBNSU5JTVVNX01FTV9CQU5LX1NJWkUpIHsKCQluZXdCYXNlID0gYmFua0Jhc2UgPj4gMTY7CgkJbmV3U2l6ZSA9IGJhbmtMZW5ndGggPj4gMTY7CgkJLyogQ2hlY2tpbmcgdGhhdCB0aGUgc2l6ZSBpcyBhIHNlcXVlbmNlIG9mICcxJyBmb2xsb3dlZCBieSBhCgkJICAgc2VxdWVuY2Ugb2YgJzAnIHN0YXJ0aW5nIGZyb20gTFNCIHRvIE1TQi4gKi8KCQl0ZW1wID0gbmV3U2l6ZSAtIDE7CgkJZm9yIChyU2hpZnQgPSAwOyByU2hpZnQgPCAxNjsgclNoaWZ0KyspIHsKCQkJdGVtcCA9IHRlbXAgPj4gclNoaWZ0OwoJCQlpZiAoKHRlbXAgJiAweDEpID09IDApIHsJLyogRWl0aGVyIHdlIGdvdCB0byB0aGUgbGFzdCAnMScgKi8KCQkJCQkJCS8qIG9yIHRoZSBzaXplIGlzIG5vdCB2YWxpZAkgKi8KCQkJCWlmICh0ZW1wID4gMHgwKQoJCQkJCXJldHVybiBmYWxzZTsKCQkJCWVsc2UKCQkJCQlicmVhazsKCQkJfQoJCX0KI2lmZGVmIERFQlVHCgkJewoJCQl1bnNpZ25lZCBpbnQgb2xkQmFzZSwgb2xkU2l6ZTsKCgkJCUdUX1JFR19SRUFEIChiYXNlUmVnLCAmb2xkQmFzZSk7CgkJCUdUX1JFR19SRUFEIChzaXplUmVnICsgOCwgJm9sZFNpemUpOwoKCQkJcHJpbnRmICgiYiVkIEJhc2U6JXggU2l6ZToleCAtPiBCYXNlOiV4IFNpemU6JXhcbiIsCgkJCQliYW5rLCBvbGRCYXNlLCBvbGRTaXplLCBuZXdCYXNlLCBuZXdTaXplKTsKCQl9CiNlbmRpZgoJCS8qIHdyaXRpbmcgdGhlIG5ldyB2YWx1ZXMgKi8KCQlHVF9SRUdfV1JJVEUgKGJhc2VSZWcsIG5ld0Jhc2UpOwoJCUdUX1JFR19XUklURSAoc2l6ZVJlZywgbmV3U2l6ZSAtIDEpOwoJCS8qIEVuYWJsZSBiYWNrIHRoZSB3aW5kb3cgKi8KCQlNZW1vcnlFbmFibGVXaW5kb3cgKENTXzBfV0lORE9XIDw8IGJhbmspOwoJCS8qIEVuYWJsZSB0aGUgQkFSIGZyb20gdGhlIFBDSSBzbGF2ZSBzaWRlICovCi8qICAgICAgICBndFBjaTBFbmFibGVJbnRlcm5hbEJBUihwY2lCQVIpOyAqLwovKiAgICAgICAgZ3RQY2kxRW5hYmxlSW50ZXJuYWxCQVIocGNpQkFSKTsgKi8KCQlyZXR1cm4gdHJ1ZTsKCX0KCXJldHVybiBmYWxzZTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogbWVtb3J5TWFwRGV2aWNlU3BhY2UgLSBTZXQgbmV3IGJhc2UgYWRkcmVzcyBhbmQgc2l6ZSBmb3Igb25lIG9mIHRoZSBkZXZpY2UKKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd3MuCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGUgQ1BVIGludGVyZmFjZSBhZGRyZXNzIGRlY29kaW5nIG1hcCBjb25zaXN0cyBvZiAyMSBhZGRyZXNzIHdpbmRvd3MKKiAgICAgICBmb3IgdGhlIGRpZmZlcmVudCBkZXZpY2VzIChlLmcuIENTWzM6MF0gLFBDSTAgTWVtIDAvMS8yLzMuLi4pLiBFYWNoCiogICAgICAgd2luZG93IGNhbiBoYXZlIGEgbWluaW11bSBvZiAxTWJ5dGVzIG9mIGFkZHJlc3Mgc3BhY2UsIGFuZCB1cCB0byA0R2J5dGUKKiAgICAgICBzcGFjZS4gRWFjaCBhZGRyZXNzIHdpbmRvdyBpcyBkZWZpbmVkIGJ5IHR3byByZWdpc3RlcnMgLSBiYXNlIGFuZCBzaXplLgoqICAgICAgIFRoZSBDUFUgYWRkcmVzcyBpcyBjb21wYXJlZCB3aXRoIHRoZSB2YWx1ZXMgaW4gdGhlIHZhcmlvdXMgQ1BVIHdpbmRvd3MKKiAgICAgICB1bnRpbCBhIG1hdGNoIGlzIGZvdW5kIGFuZCB0aGUgYWRkcmVzcyBpcyB0aGFuIHRhcmdldGVkIHRvIHRoYXQgd2luZG93LgoqICAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyBuZXcgYmFzZSBhbmQgc2l6ZSBmb3Igb25lIHRoZSBkZXZpY2Ugd2luZG93cwoqICAgICAgIChERVZfQ1MwIC0gREVWX0NTMykuIEl0IGlzIHRoZSBwcm9ncmFtbWVyYHMgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlCiogICAgICAgdGhhdCB0aGVyZSBhcmUgbm8gY29uZmxpY3RzIHdpdGggb3RoZXIgbWVtb3J5IHNwYWNlcy4gV2hlbiB0d28gbWVtb3J5CiogICAgICAgc3BhY2VzIG92ZXJsYXAsIHRoZSBNVpJzIGJlaGF2aW9yIGlzIG5vdCBkZWZpbmVkIC5JZiBhIGRldmljZSB3aW5kb3cKKiAgICAgICBuZWVkcyB0byBiZSBjbG9zZWQsIHNldCB0aGUgJ2RldmljZUxlbmd0aCcgcGFyYW1ldGVyIHNpemUgdG8gMHgwLgoqCiogSU5QVVQ6CiogICAgICAgZGV2aWNlICAgICAgICAgICAtIE9uZSBvZiB0aGUgZGV2aWNlIHdpbmRvd3MgKERFVl9DUzAtREVWX0NTMykgYXMKKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCBpbiBndE1lbW9yeS5oLgoqICAgICAgIGRldmljZUJhc2UgLSBUaGUgZGV2aWNlIHdpbmRvdyBiYXNlIGFkZHJlc3MuCiogICAgICAgZGV2aWNlTGVuZ3RoIC0gVGhlIGRldmljZSB3aW5kb3cgc2l6ZS4gVGhpcyBmdW5jdGlvbiB3aWxsIGRlY3JlbWVudAoqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgJ2RldmljZUxlbmd0aCcgcGFyYW1ldGVyIGJ5IG9uZSBhbmQgdGhlbgoqICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjayBpZiB0aGUgc2l6ZSBpcyB2YWxpZC4gQSB2YWxpZCBzaXplIG11c3QgYmUKKiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbWVkIGZyb20gTFNCIHRvIE1TQiBhcyBzZXF1ZW5jZSBvZiCRMZJzCiogICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2VkIGJ5IHNlcXVlbmNlIG9mIJEwknMuCiogICAgICAgICAgICAgICAgICAgICAgICAgIFRvIGNsb3NlIGEgbWVtb3J5IHdpbmRvdyBzaW1wbHkgc2V0IHRoZSBzaXplIHRvIDAuCioKKiAgICAgIE5PVEUhISEKKiAgICAgICBUaGUgc2l6ZSBtdXN0IGJlIGluIDY0S2J5dGUgZ3JhbnVsYXJpdHkuCiogICAgICAgVGhlIGJhc2UgYWRkcmVzcyBtdXN0IGJlIGFsaWduZWQgdG8gdGhlIHNpemUuCioKKiBPVVRQVVQ6CiogICAgICAgTm9uZS4KKgoqIFJFVFVSTjoKKiAgICAgICBGYWxzZSBmb3IgaW52YWxpZCBzaXplLCB0cnVlIG90aGVyd2lzZS4KKgoqIENBVVRJT046IFBDSV9mdW5jdGlvbnMgbXVzdCBiZSBpbXBsZW1lbnRlZCBsYXRlciBUb19kbyAhISEhISEhISEhISEhISEhIQoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpib29sIG1lbW9yeU1hcERldmljZVNwYWNlIChERVZJQ0UgZGV2aWNlLCB1bnNpZ25lZCBpbnQgZGV2aWNlQmFzZSwKCQkJICAgdW5zaWduZWQgaW50IGRldmljZUxlbmd0aCkKewoJdW5zaWduZWQgaW50IG5ld0Jhc2UsIG5ld1NpemUsIGJhc2VSZWcsIHNpemVSZWcsIHRlbXAsIHJTaGlmdDsKCi8qICAgIFBDSV9JTlRFUk5BTF9CQVIgcGNpQkFSOyovCgoJc3dpdGNoIChkZXZpY2UpIHsKCWNhc2UgREVWSUNFMDoKCQliYXNlUmVnID0gQ1NfMF9MT1dfREVDT0RFX0FERFJFU1M7CS8qREVWX0NTMF9CQVNFX0FERFI7ICovCgkJc2l6ZVJlZyA9IENTXzBfSElHSF9ERUNPREVfQUREUkVTUzsJLypERVZfQ1MwX1NJWkU7ICovCi8qICAgICAgICBwY2lCQVIgPSBQQ0lfREVWX0NTMF9CQVI7ICovCgkJYnJlYWs7CgljYXNlIERFVklDRTE6CgkJYmFzZVJlZyA9IENTXzFfTE9XX0RFQ09ERV9BRERSRVNTOwkvKkRFVl9DUzFfQkFTRV9BRERSOyAqLwoJCXNpemVSZWcgPSBDU18xX0hJR0hfREVDT0RFX0FERFJFU1M7CS8qREVWX0NTMV9TSVpFOyAqLwovKiAgICAgICAgcGNpQkFSID0gUENJX0RFVl9DUzFfQkFSOyAqLwoJCWJyZWFrOwoJY2FzZSBERVZJQ0UyOgoJCWJhc2VSZWcgPSBDU18yX0xPV19ERUNPREVfQUREUkVTUzsJLypERVZfQ1MyX0JBU0VfQUREUjsgKi8KCQlzaXplUmVnID0gQ1NfMl9ISUdIX0RFQ09ERV9BRERSRVNTOwkvKkRFVl9DUzJfU0laRTsgKi8KLyogICAgICAgIHBjaUJBUiA9IFBDSV9ERVZfQ1MyX0JBUjsgKi8KCQlicmVhazsKCWNhc2UgREVWSUNFMzoKCQliYXNlUmVnID0gQ1NfM19MT1dfREVDT0RFX0FERFJFU1M7CS8qREVWX0NTM19CQVNFX0FERFI7ICovCgkJc2l6ZVJlZyA9IENTXzNfSElHSF9ERUNPREVfQUREUkVTUzsJLypERVZfQ1MzX1NJWkU7ICovCi8qICAgICAgICBwY2lCQVIgPSBQQ0lfREVWX0NTM19CQVI7ICovCgkJYnJlYWs7CgljYXNlIEJPT1RfREVWSUNFOgoJCWJhc2VSZWcgPSBCT09UQ1NfTE9XX0RFQ09ERV9BRERSRVNTOwkvKkJPT1RDU19CQVNFX0FERFI7ICovCgkJc2l6ZVJlZyA9IEJPT1RDU19ISUdIX0RFQ09ERV9BRERSRVNTOwkvKkJPT1RDU19TSVpFOyAqLwovKiAgICAgICAgcGNpQkFSID0gUENJX0JPT1RfQ1NfQkFSOyAqLwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR1cm4gZmFsc2U7Cgl9CglpZiAoZGV2aWNlTGVuZ3RoID09IDApIHsKCQlNZW1vcnlEaXNhYmxlV2luZG93IChERVZDU18wX1dJTkRPVyA8PCBkZXZpY2UpOwoJCS8qIERpc2FibGUgdGhlIEJBUiBmcm9tIHRoZSBQQ0kgc2xhdmUgc2lkZSAqLwovKiAgICAgICAgZ3RQY2kwRGlzYWJsZUludGVybmFsQkFSKHBjaUJBUik7ICovCi8qICAgICAgICBndFBjaTFEaXNhYmxlSW50ZXJuYWxCQVIocGNpQkFSKTsgKi8KCQlyZXR1cm4gdHJ1ZTsKCX0KCS8qIFRoZSBiYXNlIGFkZHJlc3MgbXVzdCBiZSBhbGlnbmVkIHRvIHRoZSBzaXplICovCglpZiAoKGRldmljZUJhc2UgJSBkZXZpY2VMZW5ndGgpICE9IDApIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CglpZiAoZGV2aWNlTGVuZ3RoID49IE1JTklNVU1fREVWSUNFX1dJTkRPV19TSVpFKSB7CgkJbmV3QmFzZSA9IGRldmljZUJhc2UgPj4gMTY7CgkJbmV3U2l6ZSA9IGRldmljZUxlbmd0aCA+PiAxNjsKCQkvKiBDaGVja2luZyB0aGF0IHRoZSBzaXplIGlzIGEgc2VxdWVuY2Ugb2YgJzEnIGZvbGxvd2VkIGJ5IGEKCQkgICBzZXF1ZW5jZSBvZiAnMCcgc3RhcnRpbmcgZnJvbSBMU0IgdG8gTVNCLiAqLwoJCXRlbXAgPSBuZXdTaXplIC0gMTsKCQlmb3IgKHJTaGlmdCA9IDA7IHJTaGlmdCA8IDE2OyByU2hpZnQrKykgewoJCQl0ZW1wID0gdGVtcCA+PiByU2hpZnQ7CgkJCWlmICgodGVtcCAmIDB4MSkgPT0gMCkgewkvKiBFaXRoZXIgd2UgZ290IHRvIHRoZSBsYXN0ICcxJyAqLwoJCQkJCQkJLyogb3IgdGhlIHNpemUgaXMgbm90IHZhbGlkICAgICAgICovCgkJCQlpZiAodGVtcCA+IDB4MCkKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQllbHNlCgkJCQkJYnJlYWs7CgkJCX0KCQl9CgkJLyogd3JpdGluZyB0aGUgbmV3IHZhbHVlcyAqLwoJCUdUX1JFR19XUklURSAoYmFzZVJlZywgbmV3QmFzZSk7CgkJR1RfUkVHX1dSSVRFIChzaXplUmVnLCBuZXdTaXplIC0gMSk7CgkJTWVtb3J5RW5hYmxlV2luZG93IChERVZDU18wX1dJTkRPVyA8PCBkZXZpY2UpOwoJCS8qIEVuYWJsZSB0aGUgQkFSIGZyb20gdGhlIFBDSSBzbGF2ZSBzaWRlICovCi8qICAgICAgICBndFBjaTBFbmFibGVJbnRlcm5hbEJBUihwY2lCQVIpOyAqLwovKiAgICAgICAgZ3RQY2kxRW5hYmxlSW50ZXJuYWxCQVIocGNpQkFSKTsgKi8KCQlyZXR1cm4gdHJ1ZTsKCX0KCXJldHVybiBmYWxzZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBNZW1vcnlTZXRQY2lXaW5kb3cgLSBTZXQgbmV3IGJhc2UgYWRkcmVzcyBhbmQgc2l6ZSBmb3Igb25lIG9mIHRoZSBQQ0kKKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd3MuCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGUgQ1BVIGludGVyZmFjZSBhZGRyZXNzIGRlY29kaW5nIG1hcCBjb25zaXN0cyBvZiAyMSBhZGRyZXNzIHdpbmRvd3MKKiAgICAgICBmb3IgdGhlIGRpZmZlcmVudCBkZXZpY2VzIChlLmcuIENTWzM6MF0gLFBDSTAgTWVtIDAvMS8yLzMuLi4pLiBFYWNoCiogICAgICAgd2luZG93IGNhbiBoYXZlIGEgbWluaW11bSBvZiAxTWJ5dGVzIG9mIGFkZHJlc3Mgc3BhY2UsIGFuZCB1cCB0byA0R2J5dGUKKiAgICAgICBzcGFjZS4gRWFjaCBhZGRyZXNzIHdpbmRvdyBpcyBkZWZpbmVkIGJ5IHR3byByZWdpc3RlcnMgLSBiYXNlIGFuZCBzaXplLgoqICAgICAgIFRoZSBDUFUgYWRkcmVzcyBpcyBjb21wYXJlZCB3aXRoIHRoZSB2YWx1ZXMgaW4gdGhlIHZhcmlvdXMgQ1BVIHdpbmRvd3MKKiAgICAgICB1bnRpbCBhIG1hdGNoIGlzIGZvdW5kIGFuZCB0aGUgYWRkcmVzcyBpcyB0aGFuIHRhcmdldGVkIHRvIHRoYXQgd2luZG93LgoqICAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyBuZXcgYmFzZSBhbmQgc2l6ZSBmb3Igb25lIHRoZSBQQ0kgd2luZG93cwoqICAgICAgIChQQ0kgbWVtb3J5MC8xLzIuLikuIEl0IGlzIHRoZSBwcm9ncmFtbWVyYHMgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlCiogICAgICAgdGhhdCB0aGVyZSBhcmUgbm8gY29uZmxpY3RzIHdpdGggb3RoZXIgbWVtb3J5IHNwYWNlcy4gV2hlbiB0d28gbWVtb3J5CiogICAgICAgc3BhY2VzIG92ZXJsYXAsIHRoZSBNVpJzIGJlaGF2aW9yIGlzIG5vdCBkZWZpbmVkIC5JZiBhIFBDSSB3aW5kb3cKKiAgICAgICBuZWVkcyB0byBiZSBjbG9zZWQsIHNldCB0aGUgJ3BjaVdpbmRvd1NpemUnIHBhcmFtZXRlciBzaXplIHRvIDB4MC4KKgoqIElOUFVUOgoqICAgICAgIHBjaVdpbmRvdyAgICAgLSBPbmUgb2YgdGhlIFBDSSB3aW5kb3dzIGFzIGRlZmluZWQgaW4gZ3RNZW1vcnkuaC4KKiAgICAgICBwY2lXaW5kb3dCYXNlIC0gVGhlIFBDSSB3aW5kb3cgYmFzZSBhZGRyZXNzLgoqICAgICAgIHBjaVdpbmRvd1NpemUgLSBUaGUgUENJIHdpbmRvdyBzaXplLiBUaGlzIGZ1bmN0aW9uIHdpbGwgZGVjcmVtZW50IHRoZQoqICAgICAgICAgICAgICAgICAgICAgICAncGNpV2luZG93U2l6ZScgcGFyYW1ldGVyIGJ5IG9uZSBhbmQgdGhlbiBjaGVjayBpZiB0aGUKKiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSBpcyB2YWxpZC4gQSB2YWxpZCBzaXplIG11c3QgYmUgcHJvZ3JhbWVkIGZyb20gTFNCCiogICAgICAgICAgICAgICAgICAgICAgIHRvIE1TQiBhcyBzZXF1ZW5jZSBvZiCRMZJzIGZvbGxvd2VkIGJ5IHNlcXVlbmNlIG9mIJEwknMuCiogICAgICAgICAgICAgICAgICAgICAgIFRvIGNsb3NlIGEgbWVtb3J5IHdpbmRvdyBzaW1wbHkgc2V0IHRoZSBzaXplIHRvIDAuCioKKiAgICAgIE5PVEUhISEKKiAgICAgICBUaGUgc2l6ZSBtdXN0IGJlIGluIDY0S2J5dGUgZ3JhbnVsYXJpdHkuCiogICAgICAgVGhlIGJhc2UgYWRkcmVzcyBtdXN0IGJlIGFsaWduZWQgdG8gdGhlIHNpemUuCioKKiBPVVRQVVQ6CiogICAgICAgTm9uZS4KKgoqIFJFVFVSTjoKKiAgICAgICBGYWxzZSBmb3IgaW52YWxpZCBzaXplLCB0cnVlIG90aGVyd2lzZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpib29sIG1lbW9yeVNldFBjaVdpbmRvdyAoUENJX01FTV9XSU5ET1cgcGNpV2luZG93LCB1bnNpZ25lZCBpbnQgcGNpV2luZG93QmFzZSwKCQkJIHVuc2lnbmVkIGludCBwY2lXaW5kb3dTaXplKQp7Cgl1bnNpZ25lZCBpbnQgY3VycmVudExvdywgYmFzZUFkZHJSZWcsIHNpemVSZWcsIHRlbXAsIHJTaGlmdDsKCglzd2l0Y2ggKHBjaVdpbmRvdykgewoJY2FzZSBQQ0lfMF9JTzoKCQliYXNlQWRkclJlZyA9IFBDSV8xSV9PX0xPV19ERUNPREVfQUREUkVTUzsJLypQQ0lfMF9JT19CQVNFX0FERFI7ICovCgkJc2l6ZVJlZyA9IFBDSV8wSV9PX0hJR0hfREVDT0RFX0FERFJFU1M7CS8qUENJXzBfSU9fU0laRTsgKi8KCQlicmVhazsKCWNhc2UgUENJXzBfTUVNMDoKCQliYXNlQWRkclJlZyA9IFBDSV8wTUVNT1JZMF9MT1dfREVDT0RFX0FERFJFU1M7CS8qUENJXzBfTUVNT1JZMF9CQVNFX0FERFI7ICovCgkJc2l6ZVJlZyA9IFBDSV8wTUVNT1JZMF9ISUdIX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8wX01FTU9SWTBfU0laRTsgKi8KCQlicmVhazsKCWNhc2UgUENJXzBfTUVNMToKCQliYXNlQWRkclJlZyA9IFBDSV8wTUVNT1JZMV9MT1dfREVDT0RFX0FERFJFU1M7CS8qUENJXzBfTUVNT1JZMV9CQVNFX0FERFI7ICovCgkJc2l6ZVJlZyA9IFBDSV8wTUVNT1JZMV9ISUdIX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8wX01FTU9SWTFfU0laRTsgKi8KCQlicmVhazsKCWNhc2UgUENJXzBfTUVNMjoKCQliYXNlQWRkclJlZyA9IFBDSV8wTUVNT1JZMl9MT1dfREVDT0RFX0FERFJFU1M7CS8qUENJXzBfTUVNT1JZMl9CQVNFX0FERFI7ICovCgkJc2l6ZVJlZyA9IFBDSV8wTUVNT1JZMl9ISUdIX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8wX01FTU9SWTJfU0laRTsgKi8KCQlicmVhazsKCWNhc2UgUENJXzBfTUVNMzoKCQliYXNlQWRkclJlZyA9IFBDSV8wTUVNT1JZM19MT1dfREVDT0RFX0FERFJFU1M7CS8qUENJXzBfTUVNT1JZM19CQVNFX0FERFI7ICovCgkJc2l6ZVJlZyA9IFBDSV8wTUVNT1JZM19ISUdIX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8wX01FTU9SWTNfU0laRTsgKi8KCQlicmVhazsKI2lmZGVmIElOQ0xVREVfUENJXzEKCWNhc2UgUENJXzFfSU86CgkJYmFzZUFkZHJSZWcgPSBQQ0lfMUlfT19MT1dfREVDT0RFX0FERFJFU1M7CS8qUENJXzFfSU9fQkFTRV9BRERSOyAqLwoJCXNpemVSZWcgPSBQQ0lfMUlfT19ISUdIX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8xX0lPX1NJWkU7ICovCgkJYnJlYWs7CgljYXNlIFBDSV8xX01FTTA6CgkJYmFzZUFkZHJSZWcgPSBQQ0lfMU1FTU9SWTBfTE9XX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8xX01FTU9SWTBfQkFTRV9BRERSOyAqLwoJCXNpemVSZWcgPSBQQ0lfMU1FTU9SWTBfSElHSF9ERUNPREVfQUREUkVTUzsJLypQQ0lfMV9NRU1PUlkwX1NJWkU7ICovCgkJYnJlYWs7CgljYXNlIFBDSV8xX01FTTE6CgkJYmFzZUFkZHJSZWcgPSBQQ0lfMU1FTU9SWTFfTE9XX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8xX01FTU9SWTFfQkFTRV9BRERSOyAgKi8KCQlzaXplUmVnID0gUENJXzFNRU1PUlkxX0hJR0hfREVDT0RFX0FERFJFU1M7CS8qUENJXzFfTUVNT1JZMV9TSVpFOyAqLwoJCWJyZWFrOwoJY2FzZSBQQ0lfMV9NRU0yOgoJCWJhc2VBZGRyUmVnID0gUENJXzFNRU1PUlkyX0xPV19ERUNPREVfQUREUkVTUzsJLypQQ0lfMV9NRU1PUlkyX0JBU0VfQUREUjsgICovCgkJc2l6ZVJlZyA9IFBDSV8xTUVNT1JZMl9ISUdIX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8xX01FTU9SWTJfU0laRTsgKi8KCQlicmVhazsKCWNhc2UgUENJXzFfTUVNMzoKCQliYXNlQWRkclJlZyA9IFBDSV8xTUVNT1JZM19MT1dfREVDT0RFX0FERFJFU1M7CS8qUENJXzFfTUVNT1JZM19CQVNFX0FERFI7ICovCgkJc2l6ZVJlZyA9IFBDSV8xTUVNT1JZM19ISUdIX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8xX01FTU9SWTNfU0laRTsgKi8KCQlicmVhazsKI2VuZGlmIC8qIElOQ0xVREVfUENJXzEgKi8KCWRlZmF1bHQ6CgkJcmV0dXJuIGZhbHNlOwoJfQoJaWYgKHBjaVdpbmRvd1NpemUgPT0gMCkgewoJCU1lbW9yeURpc2FibGVXaW5kb3cgKFBDSV8wX0lPX1dJTkRPVyA8PCBwY2lXaW5kb3cpOwoJCXJldHVybiB0cnVlOwoJfQoJLyogVGhlIGJhc2UgYWRkcmVzcyBtdXN0IGJlIGFsaWduZWQgdG8gdGhlIHNpemUgKi8KCWlmICgocGNpV2luZG93QmFzZSAlIHBjaVdpbmRvd1NpemUpICE9IDApIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CglpZiAocGNpV2luZG93U2l6ZSA+PSBNSU5JTVVNX1BDSV9XSU5ET1dfU0laRSkgewoJCXBjaVdpbmRvd0Jhc2UgPj49IDE2OwoJCXBjaVdpbmRvd1NpemUgPj49IDE2OwoJCS8qIENoZWNraW5nIHRoYXQgdGhlIHNpemUgaXMgYSBzZXF1ZW5jZSBvZiAnMScgZm9sbG93ZWQgYnkgYQoJCSAgIHNlcXVlbmNlIG9mICcwJyBzdGFydGluZyBmcm9tIExTQiB0byBNU0IuICovCgkJdGVtcCA9IHBjaVdpbmRvd1NpemUgLSAxOwoJCWZvciAoclNoaWZ0ID0gMDsgclNoaWZ0IDwgMTY7IHJTaGlmdCsrKSB7CgkJCXRlbXAgPSB0ZW1wID4+IHJTaGlmdDsKCQkJaWYgKCh0ZW1wICYgMHgxKSA9PSAwKSB7CS8qIEVpdGhlciB3ZSBnb3QgdG8gdGhlIGxhc3QgJzEnICovCgkJCQkJCQkvKiBvciB0aGUgc2l6ZSBpcyBub3QgdmFsaWQgICAgICAgKi8KCQkJCWlmICh0ZW1wID4gMHgwKQoJCQkJCXJldHVybiBmYWxzZTsKCQkJCWVsc2UKCQkJCQlicmVhazsKCQkJfQoJCX0KCQlHVF9SRUdfV1JJVEUgKHNpemVSZWcsIHBjaVdpbmRvd1NpemUgLSAxKTsKCQlHVF9SRUdfUkVBRCAoYmFzZUFkZHJSZWcsICZjdXJyZW50TG93KTsKCQlwY2lXaW5kb3dCYXNlID0KCQkJKHBjaVdpbmRvd0Jhc2UgJiAweGZmZmZmKSB8IChjdXJyZW50TG93ICYgMHhmZmYwMDAwMCk7CgkJR1RfUkVHX1dSSVRFIChiYXNlQWRkclJlZywgcGNpV2luZG93QmFzZSk7CgkJTWVtb3J5RW5hYmxlV2luZG93IChQQ0lfMF9JT19XSU5ET1cgPDwgcGNpV2luZG93KTsKCQlyZXR1cm4gdHJ1ZTsKCX0KCXJldHVybiBmYWxzZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBtZW1vcnlNYXBJbnRlcm5hbFJlZ2lzdGVyc1NwYWNlIC0gU2V0cyBuZXcgYmFzZSBhZGRyZXNzIGZvciB0aGUgaW50ZXJuYWwKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlcnMgbWVtb3J5IHNwYWNlLgoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyBmdW5jdGlvbiBzZXQgbmV3IGJhc2UgYWRkcmVzcyBmb3IgdGhlIGludGVybmFsIHJlZ2lzdGVyknMgbWVtb3J5CiogICAgICAgc3BhY2UgKHRoZSBzaXplIGlzIGZpeGVkIGFuZCBjYW5ub3QgYmUgbW9kaWZpZWQpLiBUaGUgZnVuY3Rpb24gZG9lcyBub3QKKiAgICAgICBoYW5kbGUgb3ZlcmxhcHBpbmcgd2l0aCBvdGhlciBtZW1vcnkgc3BhY2VzLCBpdCBpcyB0aGUgcHJvZ3JhbWVyJ3MKKiAgICAgICByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCBvdmVybGFwcGluZyBkb2VzIG5vdCBvY2N1ci4KKiAgICAgICBXaGVuIHR3byBtZW1vcnkgc3BhY2VzIG92ZXJsYXAsIHRoZSBNVpJzIGJlaGF2aW9yIGlzIG5vdCBkZWZpbmVkLgoqCiogSU5QVVQ6CiogICAgICAgaW50ZXJuYWxSZWdCYXNlIC0gbmV3IGJhc2UgYWRkcmVzcyBmb3IgdGhlIGludGVybmFsIHJlZ2lzdGVyknMgbWVtb3J5CiogICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2UuCioKKiBPVVRQVVQ6CiogICAgICAgTm9uZS4KKgoqIFJFVFVSTjoKKiAgICAgICAgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogbWVtb3J5TWFwSW50ZXJuYWxSZWdpc3RlcnNTcGFjZSAtIFNldHMgbmV3IGJhc2UgYWRkcmVzcyBmb3IgdGhlIGludGVybmFscwoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlcnMuCioKKiBJTlBVVFM6ICB1bnNpZ25lZCBpbnQgaW50ZXJuYWxSZWdCYXNlIC0gVGhlIG5ldyBiYXNlIGFkZHJlc3MuCiogUkVUVVJOUzogdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KYm9vbCBtZW1vcnlNYXBJbnRlcm5hbFJlZ2lzdGVyc1NwYWNlICh1bnNpZ25lZCBpbnQgaW50ZXJuYWxSZWdCYXNlKQp7Cgl1bnNpZ25lZCBpbnQgY3VycmVudFZhbHVlOwoJdW5zaWduZWQgaW50IGludGVybmFsVmFsdWUgPSBpbnRlcm5hbFJlZ0Jhc2U7CgoJaW50ZXJuYWxSZWdCYXNlID0gKGludGVybmFsUmVnQmFzZSA+PiAxNik7CglHVF9SRUdfUkVBRCAoSU5URVJOQUxfU1BBQ0VfREVDT0RFLCAmY3VycmVudFZhbHVlKTsKCWludGVybmFsUmVnQmFzZSA9IChjdXJyZW50VmFsdWUgJiAweGZmMDAwMDAwKSB8IGludGVybmFsUmVnQmFzZTsKCUdUX1JFR19XUklURSAoSU5URVJOQUxfU1BBQ0VfREVDT0RFLCBpbnRlcm5hbFJlZ0Jhc2UpOwoJLyogaW5pdGlhbGl6aW5nIGFsc28gdGhlIGdsb2JhbCB2YXJpYWJsZSAnaW50ZXJuYWxSZWdCYXNlQWRkcicgKi8KLyogICAgZ3RJbnRlcm5hbFJlZ0Jhc2VBZGRyID0gaW50ZXJuYWxWYWx1ZTsgKi8KCUlOVEVSTkFMX1JFR19CQVNFX0FERFIgPSBpbnRlcm5hbFZhbHVlOwoJcmV0dXJuIHRydWU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogbWVtb3J5R2V0SW50ZXJuYWxSZWdpc3RlcnNTcGFjZSAtIFJldHVybnMgdGhlIGludGVybmFsIHJlZ2lzdGVycyBCYXNlCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy4KKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYmFzZSBhZGRyZXNzIG9mICB0aGUgaW50ZXJuYWwgcmVnaXN0ZXKScwoqICAgICAgIG1lbW9yeSBzcGFjZSAuCioKKiBJTlBVVDoKKiAgICAgICBOb25lLgoqCiogT1VUUFVUOgoqICAgICAgIE5vbmUuCioKKiBSRVRVUk46CiogICAgICAgMzIgYml0IGJhc2UgYWRkcmVzcyBvZiB0aGUgaW50ZXJuYWwgcmVnaXN0ZXKScyBtZW1vcnkgc3BhY2UuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdW5zaWduZWQgaW50IG1lbW9yeUdldEludGVybmFsUmVnaXN0ZXJzU3BhY2UgKHZvaWQpCnsKCXVuc2lnbmVkIGludCBjdXJyZW50VmFsdWUgPSAwOwoKCUdUX1JFR19SRUFEIChJTlRFUk5BTF9TUEFDRV9ERUNPREUsICZjdXJyZW50VmFsdWUpOwoJcmV0dXJuICgoY3VycmVudFZhbHVlICYgMHgwMDBmZmZmZikgPDwgMTYpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGd0TWVtb3J5R2V0SW50ZXJuYWxTcmFtQmFzZUFkZHIgLSBSZXR1cm5zIHRoZSBpbnRlZ3JhdGVkIFNSQU0gYmFzZSBhZGRyZXNzLgoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhlIEF0bGFudGlzIGluY29ycG9yYXRlIGludGVncmF0ZWQgMk1iaXQgU1JBTSBmb3IgZ2VuZXJhbCB1c2UuIFRoaXMKKiAgICAgICBmdW5jbmlvbiByZXR1cm4gdGhlIFNSQU0ncyBiYXNlIGFkZHJlc3MuCiogSU5QVVQ6CiogICAgICAgTm9uZS4KKiBPVVRQVVQ6CiogICAgICAgTm9uZS4KKiBSRVRVUk46CiogICAgICAgMzIgYml0IFNSQU0ncyBiYXNlIGFkZHJlc3MuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdW5zaWduZWQgaW50IG1lbW9yeUdldEludGVybmFsU3JhbUJhc2VBZGRyICh2b2lkKQp7CglyZXR1cm4gKChHVFJFR1JFQUQgKElOVEVHUkFURURfU1JBTV9CQVNFX0FERFIpICYgMHhmZmZmZikgPDwgMTYpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGd0TWVtb3J5U2V0SW50ZXJuYWxTcmFtQmFzZUFkZHIgLSBTZXQgdGhlIGludGVncmF0ZWQgU1JBTSBiYXNlIGFkZHJlc3MuCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGUgQXRsYW50aXMgaW5jb3Jwb3JhdGUgaW50ZWdyYXRlZCAyTWJpdCBTUkFNIGZvciBnZW5lcmFsIHVzZS4gVGhpcwoqICAgICAgIGZ1bmN0aW9uIHNldHMgYSBuZXcgYmFzZSBhZGRyZXNzIHRvIHRoZSBTUkFNIC4KKiBJTlBVVDoKKiAgICAgICBzcmFtQmFzZUFkZHJlc3MgLSBUaGUgU1JBTSdzIGJhc2UgYWRkcmVzcy4KKiBPVVRQVVQ6CiogICAgICAgTm9uZS4KKiBSRVRVUk46CiogICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIGd0TWVtb3J5U2V0SW50ZXJuYWxTcmFtQmFzZUFkZHIgKHVuc2lnbmVkIGludCBzcmFtQmFzZUFkZHJlc3MpCnsKCUdUX1JFR19XUklURSAoSU5URUdSQVRFRF9TUkFNX0JBU0VfQUREUiwgc3JhbUJhc2VBZGRyZXNzID4+IDE2KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBtZW1vcnlTZXRQcm90ZWN0UmVnaW9uIC0gU2V0IHByb3RlY3Rpb24gbW9kZSBmb3Igb25lIG9mIHRoZSA4IHJlZ2lvbnMuCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGUgQ1BVIGludGVyZmFjZSBzdXBwb3J0cyBjb25maWd1cmFibGUgYWNjZXNzIHByb3RlY3Rpb24uIFRoaXMgaW5jbHVkZXMKKiAgICAgICB1cCB0byBlaWdodCBhZGRyZXNzIHJhbmdlcyBkZWZpbmVkIHRvIGEgZGlmZmVyZW50IHByb3RlY3Rpb24gdHlwZSA6CiogICAgICAgd2hldGhlciB0aGUgYWRkcmVzcyByYW5nZSBpcyBjYWNoZWFibGUgb3Igbm90LCB3aGV0aGVyIGl0IGlzIHdyaXRhYmxlIG9yCiogICAgICAgbm90ICwgYW5kIHdoZXRoZXIgaXQgaXMgYWNjZXNzaWJsZSBvciBub3QuIEEgTG93IGFuZCBIaWdoIHJlZ2lzdGVycwoqICAgICAgIGRlZmluZSBlYWNoIHdpbmRvdyB3aGlsZSB0aGUgbWluaW11bSBhZGRyZXNzIHJhbmdlIG9mIGVhY2ggd2luZG93IGlzCiogICAgICAgMU1ieXRlLiBBbiBhZGRyZXNzIGRyaXZlbiBieSB0aGUgQ1BVLCBpbiBhZGRpdGlvbiB0byB0aGUgYWRkcmVzcwoqICAgICAgIGRlY29kaW5nIGFuZCByZW1hcHBpbmcgcHJvY2VzcywgaXMgY29tcGFyZWQgYWdhaW5zdCB0aGUgZWlnaHQgQWNjZXNzCiogICAgICAgUHJvdGVjdGlvbiBMb3cvSGlnaCByZWdpc3RlcnMgLCBpZiBhbiBhZGRyZXNzIG1hdGNoZXMgb25lIG9mIHRoZSB3aW5kb3dzCiogICAgICAgLCB0aGUgTVYgZGV2aWNlIGNoZWNrcyB0aGUgdHJhbnNhY3Rpb24gdHlwZSBhZ2FpbnN0IHRoZSBwcm90ZWN0aW9uIGJpdHMKKiAgICAgICBkZWZpbmVkIGluIENQVSBBY2Nlc3MgUHJvdGVjdGlvbiByZWdpc3RlciwgdG8gZGV0ZXJtaW5lIGlmIHRoZSBhY2Nlc3MgaXMKKiAgICAgICBhbGxvd2VkLiBUaGlzIGZ1bmN0aW9uIHNldCBhIHByb3RlY3Rpb24gbW9kZSB0byBvbmUgb2YgdGhlIDggcG9zc2libGUKKiAgICAgICByZWdpb25zLgoqICAgICAgTk9URToKKiAgICAgICBUaGUgQ1BVIGFkZHJlc3Mgd2luZG93cyBhcmUgcmVzdHJpY3RlZCB0byBhIHNpemUgb2YgIDIgcG93ZXIgbiBhbmQgdGhlCiogICAgICAgc3RhcnQgYWRkcmVzcyBtdXN0IGJlIGFsaWduZWQgdG8gdGhlIHdpbmRvdyBzaXplLiBGb3IgZXhhbXBsZSwgaWYgdXNpbmcKKiAgICAgICBhIDE2IE1CIHdpbmRvdywgdGhlIHN0YXJ0IGFkZHJlc3MgYml0cyBbMjM6MF0gbXVzdCBiZSAwLlRoZSBNVidzCiogICAgICAgaW50ZXJuYWwgcmVnaXN0ZXJzIHNwYWNlIGlzIG5vdCBwcm90ZWN0ZWQsIGV2ZW4gaWYgdGhlIGFjY2VzcyBwcm90ZWN0aW9uCiogICAgICAgd2luZG93cyBjb250YWluIHRoaXMgc3BhY2UuCioKKiBJTlBVVDoKKiAgICAgICByZWdpb24gLSBzZWxlY3RzIHdoaWNoIHJlZ2lvbiB0byBiZSBjb25maWd1cmVkLiBUaGUgdmFsdWVzIGRlZmluZWQgaW4KKiAgICAgICAgICAgICAgICBndE1lbW9yeS5oOgoqCiogICAgICAgICAgICAgICAgIC0gTUVNX1JFR0lPTjAKKiAgICAgICAgICAgICAgICAgLSBNRU1fUkVHSU9OMQoqICAgICAgICAgICAgICAgICAtIGV0Yy4KKgoqICAgICAgIG1lbUFjY2VzcyAtIEFsbG93cyBvciBmb3JiaWRzIGFjY2VzcyAocmVhZCBvciB3cml0ZSApIHRvIHRoZSByZWdpb24uIFRoZQoqICAgICAgICAgICAgICAgICAgIHZhbHVlcyBkZWZpbmVkIGluIGd0TWVtb3J5Lmg6CioKKiAgICAgICAgICAgICAgICAgICAgLSBNRU1fQUNDRVNTX0FMTE9XRUQKKiAgICAgICAgICAgICAgICAgICAgLSBNRU1fQUNDRVNTX0ZPUkJJREVOCioKKiAgICAgICBtZW1Xcml0ZSAtIENQVSB3cml0ZSBwcm90ZWN0aW9uIHRvIHRoZSByZWdpb24uIFRoZSB2YWx1ZXMgZGVmaW5lZCBpbgoqICAgICAgICAgICAgICAgICAgZ3RNZW1vcnkuaDoKKgoqICAgICAgICAgICAgICAgICAgIC0gTUVNX1dSSVRFX0FMTE9XRUQKKiAgICAgICAgICAgICAgICAgICAtIE1FTV9XUklURV9GT1JCSURFTgoqCiogICAgICAgY2FjaGVQcm90ZWN0aW9uIC0gRGVmaW5lcyB3aGV0aGVyIGNhY2hpbmcgdGhlIHJlZ2lvbiBpcyBhbGxvd2VkIG9yIG5vdC4KKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWVzIGRlZmluZWQgaW4gZ3RNZW1vcnkuaDoKKgoqICAgICAgICAgICAgICAgICAgICAgICAgICAtIE1FTV9DQUNIRV9BTExPV0VECiogICAgICAgICAgICAgICAgICAgICAgICAgIC0gTUVNX0NBQ0hFX0ZPUkJJREVOCioKKiAgICAgICBiYXNlQWRkcmVzcyAtIHRoZSByZWdpb24ncyBiYXNlIEFkZHJlc3MuCiogICAgICAgcmVnaW9uU2l6ZSAgLSBUaGUgcmVnaW9uJ3Mgc2l6ZS4gVGhpcyBmdW5jdGlvbiB3aWxsIGRlY3JlbWVudCB0aGUKKiAgICAgICAgICAgICAgICAgICAgICdyZWdpb25TaXplJyBwYXJhbWV0ZXIgYnkgb25lIGFuZCB0aGVuIGNoZWNrIGlmIHRoZSBzaXplCiogICAgICAgICAgICAgICAgICAgICBpcyB2YWxpZC4gQSB2YWxpZCBzaXplIG11c3QgYmUgcHJvZ3JhbWVkIGZyb20gTFNCIHRvIE1TQgoqICAgICAgICAgICAgICAgICAgICAgYXMgc2VxdWVuY2Ugb2YgkTGScyBmb2xsb3dlZCBieSBzZXF1ZW5jZSBvZiCRMJJzLgoqICAgICAgICAgICAgICAgICAgICAgVG8gY2xvc2UgYSBtZW1vcnkgd2luZG93IHNpbXBseSBzZXQgdGhlIHNpemUgdG8gMC4KKgoqICAgICAgTk9URSEhIQoqICAgICAgIFRoZSBzaXplIG11c3QgYmUgaW4gNjRLYnl0ZSBncmFudWxhcml0eS4KKiAgICAgICBUaGUgYmFzZSBhZGRyZXNzIG11c3QgYmUgYWxpZ25lZCB0byB0aGUgc2l6ZS4KKgoqIE9VVFBVVDoKKiAgICAgICBOb25lLgoqCiogUkVUVVJOOgoqICAgICAgIEZhbHNlIGZvciBpbnZhbGlkIHNpemUsIHRydWUgb3RoZXJ3aXNlLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmJvb2wgbWVtb3J5U2V0UHJvdGVjdFJlZ2lvbiAoTUVNT1JZX1BST1RFQ1RfV0lORE9XIHdpbmRvdywKCQkJICAgICBNRU1PUllfQUNDRVNTIG1lbUFjY2VzcywKCQkJICAgICBNRU1PUllfQUNDRVNTX1dSSVRFIG1lbVdyaXRlLAoJCQkgICAgIE1FTU9SWV9DQUNIRV9QUk9URUNUIGNhY2hlUHJvdGVjdGlvbiwKCQkJICAgICB1bnNpZ25lZCBpbnQgYmFzZUFkZHJlc3MsIHVuc2lnbmVkIGludCBzaXplKQp7Cgl1bnNpZ25lZCBpbnQgZGF0YUZvclJlZywgdGVtcCwgclNoaWZ0OwoKCWlmIChzaXplID09IDApIHsKCQlHVF9SRUdfV1JJVEUgKChDUFVfUFJPVEVDVF9XSU5ET1dfMF9TSVpFICsgMHgxMCAqIHdpbmRvdyksCgkJCSAgICAgIDB4MCk7CgkJcmV0dXJuIHRydWU7Cgl9CgkvKiBUaGUgYmFzZSBhZGRyZXNzIG11c3QgYmUgYWxpZ25lZCB0byB0aGUgc2l6ZS4gICovCglpZiAoYmFzZUFkZHJlc3MgJSBzaXplICE9IDApIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CglpZiAoc2l6ZSA+PSBNSU5JTVVNX0FDQ0VTU19XSU5fU0laRSkgewoJCWJhc2VBZGRyZXNzID0gKChiYXNlQWRkcmVzcyA+PiAxNikgJiAweGZmZmZmKTsKCQlkYXRhRm9yUmVnID0gYmFzZUFkZHJlc3MgfCAoKG1lbUFjY2VzcyA8PCAyMCkgJiBCSVQyMCkgfAoJCQkoKG1lbVdyaXRlIDw8IDIxKSAmIEJJVDIxKSB8ICgoY2FjaGVQcm90ZWN0aW9uIDw8IDIyKQoJCQkJCQkgICAgICAmIEJJVDIyKSB8IEJJVDMxOwoJCUdUX1JFR19XUklURSAoQ1BVX1BST1RFQ1RfV0lORE9XXzBfQkFTRV9BRERSICsgMHgxMCAqIHdpbmRvdywKCQkJICAgICAgZGF0YUZvclJlZyk7CgkJc2l6ZSA+Pj0gMTY7CgkJLyogQ2hlY2tpbmcgdGhhdCB0aGUgc2l6ZSBpcyBhIHNlcXVlbmNlIG9mICcxJyBmb2xsb3dlZCBieSBhCgkJICAgc2VxdWVuY2Ugb2YgJzAnIHN0YXJ0aW5nIGZyb20gTFNCIHRvIE1TQi4gKi8KCQl0ZW1wID0gc2l6ZSAtIDE7CgkJZm9yIChyU2hpZnQgPSAwOyByU2hpZnQgPCAxNjsgclNoaWZ0KyspIHsKCQkJdGVtcCA9IHRlbXAgPj4gclNoaWZ0OwoJCQlpZiAoKHRlbXAgJiAweDEpID09IDApIHsJLyogRWl0aGVyIHdlIGdvdCB0byB0aGUgbGFzdCAnMScgKi8KCQkJCQkJCS8qIG9yIHRoZSBzaXplIGlzIG5vdCB2YWxpZCAgICAgICAqLwoJCQkJaWYgKHRlbXAgPiAweDApCgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJZWxzZQoJCQkJCWJyZWFrOwoJCQl9CgkJfQoJCUdUX1JFR19XUklURSAoKENQVV9QUk9URUNUX1dJTkRPV18wX1NJWkUgKyAweDEwICogd2luZG93KSwKCQkJICAgICAgc2l6ZSAtIDEpOwoJCXJldHVybiB0cnVlOwoJfQoJcmV0dXJuIGZhbHNlOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGd0TWVtb3J5RGlzYWJsZVByb3RlY3RSZWdpb24gLSBEaXNhYmxlIGEgcHJvdGVjdGVkIHdpbmRvdy4KKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgZnVuY3Rpb24gZGlzYWJsZSBhIHByb3RlY3RlZCB3aW5kb3cgc2V0IGJ5CiogICAgICAgJ2d0TWVtb3J5U2V0UHJvdGVjdFJlZ2lvbicgZnVuY3Rpb24uCioKKiBJTlBVVDoKKiAgICAgICB3aW5kb3cgLSBvbmUgb2YgdGhlIDQgd2luZG93cyAoIGRlZmluZWQgaW4gZ3RNZW1vcnkuaCApLgoqCiogT1VUUFVUOgoqICAgICAgIE5vbmUuCioKKiBSRVRVUk46CiogICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIG1lbW9yeURpc2FibGVQcm90ZWN0UmVnaW9uIChNRU1PUllfUFJPVEVDVF9XSU5ET1cgd2luZG93KQp7CglSRVNFVF9SRUdfQklUUyAoKChDUFVfUFJPVEVDVF9XSU5ET1dfMF9CQVNFX0FERFIpICsgKDB4MTAgKiB3aW5kb3cpKSwKCQkJQklUMzEpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIG1lbW9yeVNldFBjaVJlbWFwVmFsdWUgLSBTZXQgYSByZW1hcCB2YWx1ZSB0byBhIFBDSSBtZW1vcnkgc3BhY2UgdGFyZ2V0LgoqCiogREVTQ1JJUFRJT046CiogICAgICAgSW4gYWRkaXRpb24gdG8gdGhlIGFkZHJlc3MgZGVjb2RpbmcgbWVjaGFuaXNtLCB0aGUgQ1BVIGhhcyBhbiBhZGRyZXNzCiogICAgICAgcmVtYXBwaW5nIG1lY2hhbmlzbSB0byBiZSB1c2VkIGJ5IGV2ZXJ5IFBDSSBkZWNvZGluZyB3aW5kb3cuIEVhY2ggUENJCiogICAgICAgd2luZG93IGNhbiBiZSByZW1hcGVkIHRvIGEgZGVzaXJlZCBhZGRyZXNzIHRhcmdldCBhY2NvcmRpbmcgdG8gdGhlIHJlbWFwCiogICAgICAgdmFsdWUgd2l0aGluIHRoZSByZW1hcCByZWdpc3Rlci4gVGhlIGFkZHJlc3MgcmVtYXBwaW5nIGlzIHVzZWZ1bCB3aGVuIGEKKiAgICAgICBDUFUgYWRkcmVzcyByYW5nZSBtdXN0IGJlIHJlYWxsb2NhdGVkIHRvIGEgZGlmZmVyZW50IGxvY2F0aW9uIG9uIHRoZQoqICAgICAgIFBDSSBidXMuIEFsc28sIGl0IGVuYWJsZXMgQ1BVIGFjY2VzcyB0byBhIFBDSSBhZ2VudCBsb2NhdGVkIGFib3ZlIHRoZQoqICAgICAgIDRHYnl0ZSBzcGFjZS4gT24gc3lzdGVtIGJvb3QsIGVhY2ggb2YgdGhlIFBDSSBtZW1vcnkgc3BhY2VzIGlzIG1hcGVkIHRvCiogICAgICAgYSBkZWZ1YWx0IHZhbHVlIChzZWUgQ1BVIGludGVyZmFjZSBzZWN0aW9uIGluIHRoZSBNViBzcGVjIGZvciB0aGUKKiAgICAgICBkZWZhdWx0IHZhbHVlcykuIFRoZSByZW1hcCBtZWNoYW5pc20gZG9lcyBub3QgYWx3YXlzIHByb2R1Y2UgdGhlIGRlc2lyZWQKKiAgICAgICBhZGRyZXNzIG9uIHRoZSBQQ0kgYnVzIGJlY2F1c2Ugb2YgdGhlIHJlbWFwIG1lY2hhbmlzbSB3YXkgb2Ygd29ya2luZwoqICAgICAgICh0byBmdWxseSB1bmRlcnN0YW5kIHdoeSwgcGxlYXNlIHNlZSB0aGUgJ0FkZHJlc3MgUmVtYXBwaW5nJyBzZWN0aW9uIGluCiogICAgICAgdGhlIE1WJ3Mgc3BlYykuIFRoZXJlZm9yLCB0aGlzIGZ1bmN0aW9uIHNldHMgYSBkZXNpcmVkIHJlbWFwIHZhbHVlIHRvCiogICAgICAgb25lIG9mIHRoZSBQQ0kgbWVtb3J5IHdpbmRvd3MgYW5kIHJldHVybiB0aGUgZWZmZWN0aXZlIGFkZHJlc3MgdGhhdAoqICAgICAgIHNob3VsZCBiZSB1c2VkIHdoZW4gZXhpdGluZyB0aGUgUENJIG1lbW9yeSB3aW5kb3cuIFlvdSBzaG91bGQgQUxXQVlTIHVzZQoqICAgICAgIHRoZSByZXR1cm5lZCB2YWx1ZSBieSB0aGlzIGZ1bmN0aW9uIHdoZW4gcmVtYXBwaW5nIGEgUENJIHdpbmRvdyBhbmQKKiAgICAgICBleGl0aW5nIGl0LiBJZiBmb3IgZXhhbXBsZSB0aGUgYmFzZSBhZGRyZXNzIG9mIFBDSTAgbWVtb3J5IDAgaXMKKiAgICAgICAweDkwMDAwMDAwLCB0aGUgc2l6ZSBpcyAweDAzZmZmZmZmIGFuZCB0aGUgcmVtYXAgdmFsdWUgaXMgMHgxMTAwMDAwMCwKKiAgICAgICB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9mIDB4OTEwMDAwMDAgdGhhdCBNVVNUCiogICAgICAgYmUgdXNlZCB0byBleGl0IHRoaXMgbWVtb3J5IHdpbmRvdyBpbiBvcmRlciB0byBhY2hpdmUgdGhlIGRlaXNyZWQKKiAgICAgICByZW1hcHBpbmcuCioKKiBJTlBVVDoKKiAgICAgICBtZW1vcnlXaW5kb3cgICAtIE9uZSBvZiB0aGUgUENJIG1lbW9yeSB3aW5kb3dzIGFzIGRlZmluZWQgaW4gTWVtb3J5LmgKKiAgICAgICByZW1hcFZhbHVlTG93ICAtIFRoZSBsb3cgcmVtYXAgdmFsdWUuCiogICAgICAgcmVtYXBWYWx1ZUhpZ2ggLSBUaGUgaGlnaCByZW1hcCB2YWx1ZS4KKiBPVVRQVVQ6CiogICAgICAgTm9uZS4KKgoqIFJFVFVSTjoKKiAgICAgICBUaGUgZWZmZWN0aXZlIGJhc2UgYWRkcmVzcyB0byBleGl0IHRoZSBQQ0ksIG9yIDB4ZmZmZmZmZmYgaWYgb25lIG9mIHRoZQoqICAgICAgIHBhcmFtZXRlcnMgaXMgZXJyb25lb3VzIG9yIHRoZSBlZmZlY3RpdmUgYmFzZSBhZGRyZXNzIGlzIGhpZ2hlciB0aGUgdG9wCiogICAgICAgZGVjb2RlIHZhbHVlLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnVuc2lnbmVkIGludCBtZW1vcnlTZXRQY2lSZW1hcFZhbHVlIChQQ0lfTUVNX1dJTkRPVyBtZW1vcnlXaW5kb3csCgkJCQkgICAgIHVuc2lnbmVkIGludCByZW1hcFZhbHVlSGlnaCwKCQkJCSAgICAgdW5zaWduZWQgaW50IHJlbWFwVmFsdWVMb3cpCnsKCXVuc2lnbmVkIGludCBwY2lNZW1XaW5kb3dCYXNlQWRkclJlZyA9IDAsIGJhc2VBZGRyVmFsdWUgPSAwOwoJdW5zaWduZWQgaW50IHBjaU1lbVdpbmRvd1NpemVSZWcgPSAwLCB3aW5kb3dTaXplVmFsdWUgPSAwOwoJdW5zaWduZWQgaW50IGVmZmVjdGl2ZUJhc2VBZGRyZXNzLCByZW1hcFJlZ0xvdywgcmVtYXBSZWdIaWdoOwoKCS8qIEluaXRpYWxpemluZyB0aGUgYmFzZSBhbmQgc2l6ZSB2YXJpYWJsZXMgb2YgdGhlIFBDSQoJICAgbWVtb3J5IHdpbmRvd3MgKi8KCXN3aXRjaCAobWVtb3J5V2luZG93KSB7CgljYXNlIFBDSV8wX0lPOgoJCXBjaU1lbVdpbmRvd0Jhc2VBZGRyUmVnID0gUENJXzBfSU9fQkFTRV9BRERSOwoJCXBjaU1lbVdpbmRvd1NpemVSZWcgPSBQQ0lfMF9JT19TSVpFOwoJCXJlbWFwUmVnTG93ID0gUENJXzBfSU9fQUREUl9SRU1BUDsKCQlyZW1hcFJlZ0hpZ2ggPSBQQ0lfMF9JT19BRERSX1JFTUFQOwoJCWJyZWFrOwoJY2FzZSBQQ0lfMF9NRU0wOgoJCXBjaU1lbVdpbmRvd0Jhc2VBZGRyUmVnID0gUENJXzBfTUVNT1JZMF9CQVNFX0FERFI7CgkJcGNpTWVtV2luZG93U2l6ZVJlZyA9IFBDSV8wX01FTU9SWTBfU0laRTsKCQlyZW1hcFJlZ0xvdyA9IFBDSV8wX01FTU9SWTBfTE9XX0FERFJfUkVNQVA7CgkJcmVtYXBSZWdIaWdoID0gUENJXzBfTUVNT1JZMF9ISUdIX0FERFJfUkVNQVA7CgkJYnJlYWs7CgljYXNlIFBDSV8wX01FTTE6CgkJcGNpTWVtV2luZG93QmFzZUFkZHJSZWcgPSBQQ0lfMF9NRU1PUlkxX0JBU0VfQUREUjsKCQlwY2lNZW1XaW5kb3dTaXplUmVnID0gUENJXzBfTUVNT1JZMV9TSVpFOwoJCXJlbWFwUmVnTG93ID0gUENJXzBfTUVNT1JZMV9MT1dfQUREUl9SRU1BUDsKCQlyZW1hcFJlZ0hpZ2ggPSBQQ0lfMF9NRU1PUlkxX0hJR0hfQUREUl9SRU1BUDsKCQlicmVhazsKCWNhc2UgUENJXzBfTUVNMjoKCQlwY2lNZW1XaW5kb3dCYXNlQWRkclJlZyA9IFBDSV8wX01FTU9SWTJfQkFTRV9BRERSOwoJCXBjaU1lbVdpbmRvd1NpemVSZWcgPSBQQ0lfMF9NRU1PUlkyX1NJWkU7CgkJcmVtYXBSZWdMb3cgPSBQQ0lfMF9NRU1PUlkyX0xPV19BRERSX1JFTUFQOwoJCXJlbWFwUmVnSGlnaCA9IFBDSV8wX01FTU9SWTJfSElHSF9BRERSX1JFTUFQOwoJCWJyZWFrOwoJY2FzZSBQQ0lfMF9NRU0zOgoJCXBjaU1lbVdpbmRvd0Jhc2VBZGRyUmVnID0gUENJXzBfTUVNT1JZM19CQVNFX0FERFI7CgkJcGNpTWVtV2luZG93U2l6ZVJlZyA9IFBDSV8wX01FTU9SWTNfU0laRTsKCQlyZW1hcFJlZ0xvdyA9IFBDSV8wX01FTU9SWTNfTE9XX0FERFJfUkVNQVA7CgkJcmVtYXBSZWdIaWdoID0gUENJXzBfTUVNT1JZM19ISUdIX0FERFJfUkVNQVA7CgkJYnJlYWs7CiNpZmRlZiBJTkNMVURFX1BDSV8xCgljYXNlIFBDSV8xX0lPOgoJCXBjaU1lbVdpbmRvd0Jhc2VBZGRyUmVnID0gUENJXzFfSU9fQkFTRV9BRERSOwoJCXBjaU1lbVdpbmRvd1NpemVSZWcgPSBQQ0lfMV9JT19TSVpFOwoJCXJlbWFwUmVnTG93ID0gUENJXzFfSU9fQUREUl9SRU1BUDsKCQlyZW1hcFJlZ0hpZ2ggPSBQQ0lfMV9JT19BRERSX1JFTUFQOwoJCWJyZWFrOwoJY2FzZSBQQ0lfMV9NRU0wOgoJCXBjaU1lbVdpbmRvd0Jhc2VBZGRyUmVnID0gUENJXzFfTUVNT1JZMF9CQVNFX0FERFI7CgkJcGNpTWVtV2luZG93U2l6ZVJlZyA9IFBDSV8xX01FTU9SWTBfU0laRTsKCQlyZW1hcFJlZ0xvdyA9IFBDSV8xX01FTU9SWTBfTE9XX0FERFJfUkVNQVA7CgkJcmVtYXBSZWdIaWdoID0gUENJXzFfTUVNT1JZMF9ISUdIX0FERFJfUkVNQVA7CgkJYnJlYWs7CgljYXNlIFBDSV8xX01FTTE6CgkJcGNpTWVtV2luZG93QmFzZUFkZHJSZWcgPSBQQ0lfMV9NRU1PUlkxX0JBU0VfQUREUjsKCQlwY2lNZW1XaW5kb3dTaXplUmVnID0gUENJXzFfTUVNT1JZMV9TSVpFOwoJCXJlbWFwUmVnTG93ID0gUENJXzFfTUVNT1JZMV9MT1dfQUREUl9SRU1BUDsKCQlyZW1hcFJlZ0hpZ2ggPSBQQ0lfMV9NRU1PUlkxX0hJR0hfQUREUl9SRU1BUDsKCQlicmVhazsKCWNhc2UgUENJXzFfTUVNMjoKCQlwY2lNZW1XaW5kb3dCYXNlQWRkclJlZyA9IFBDSV8xX01FTU9SWTFfQkFTRV9BRERSOwoJCXBjaU1lbVdpbmRvd1NpemVSZWcgPSBQQ0lfMV9NRU1PUlkxX1NJWkU7CgkJcmVtYXBSZWdMb3cgPSBQQ0lfMV9NRU1PUlkxX0xPV19BRERSX1JFTUFQOwoJCXJlbWFwUmVnSGlnaCA9IFBDSV8xX01FTU9SWTFfSElHSF9BRERSX1JFTUFQOwoJCWJyZWFrOwoJY2FzZSBQQ0lfMV9NRU0zOgoJCXBjaU1lbVdpbmRvd0Jhc2VBZGRyUmVnID0gUENJXzFfTUVNT1JZM19CQVNFX0FERFI7CgkJcGNpTWVtV2luZG93U2l6ZVJlZyA9IFBDSV8xX01FTU9SWTNfU0laRTsKCQlyZW1hcFJlZ0xvdyA9IFBDSV8xX01FTU9SWTNfTE9XX0FERFJfUkVNQVA7CgkJcmVtYXBSZWdIaWdoID0gUENJXzFfTUVNT1JZM19ISUdIX0FERFJfUkVNQVA7CgkJYnJlYWs7CiNlbmRpZiAvKiBJTkNMVURFX1BDSV8xICovCglkZWZhdWx0OgoJCS8qIFJldHJ1biBhbiBpbnZhbGlkIGVmZmVjdGl2ZSBiYXNlIGFkZHJlc3MgKi8KCQlyZXR1cm4gMHhmZmZmZmZmZjsKCX0KCS8qIFdyaXRpbmcgdGhlIHJlbWFwIHZhbHVlIHRvIHRoZSByZW1hcCByZWdpc2VycyAqLwoJR1RfUkVHX1dSSVRFIChyZW1hcFJlZ0hpZ2gsIHJlbWFwVmFsdWVIaWdoKTsKCUdUX1JFR19XUklURSAocmVtYXBSZWdMb3csIHJlbWFwVmFsdWVMb3cgPj4gMTYpOwoJLyogUmVhZGluZyB0aGUgdmFsdWVzIGZyb20gdGhlIGJhc2UgYWRkcmVzcyBhbmQgc2l6ZSByZWdpc3RlcnMgKi8KCWJhc2VBZGRyVmFsdWUgPSBHVFJFR1JFQUQgKHBjaU1lbVdpbmRvd0Jhc2VBZGRyUmVnKSAmIDB4ZmZmZmY7Cgl3aW5kb3dTaXplVmFsdWUgPSBHVFJFR1JFQUQgKHBjaU1lbVdpbmRvd1NpemVSZWcpICYgMHhmZmZmOwoJLyogU3RhcnQgY2FsY3VsYXRpbmcgdGhlIGVmZmVjdGl2ZSBCYXNlIEFkZHJlc3MgKi8KCWVmZmVjdGl2ZUJhc2VBZGRyZXNzID0gYmFzZUFkZHJWYWx1ZSA8PCAxNjsKCS8qIFRoZSBlZmZlY3RpdmUgYmFzZSBhZGRyZXNzIHdpbGwgYmUgY29tYmluZWQgZnJvbSB0aGUgY2hvcHBlZCAoaWYgYW55KQoJICAgcmVtYXAgdmFsdWUgKGFjY29yZGluZyB0byB0aGUgc2l6ZSB2YWx1ZSBhbmQgcmVtYXAgbWVjaGFuaXNtKSBhbmQgdGhlCgkgICB3aW5kb3cncyBiYXNlIGFkZHJlc3MgKi8KCWVmZmVjdGl2ZUJhc2VBZGRyZXNzIHw9CgkJKCgod2luZG93U2l6ZVZhbHVlIDw8IDE2KSB8IDB4ZmZmZikgJiByZW1hcFZhbHVlTG93KTsKCS8qIElmIHRoZSBlZmZlY3RpdmVCYXNlQWRkcmVzcyBleGNlZWQgdGhlIHdpbmRvdyBib3VuZGFyaWVzIHJldHVybiBhbgoJICAgaW52YWxpZCB2YWx1ZS4gKi8KCWlmIChlZmZlY3RpdmVCYXNlQWRkcmVzcyA+CgkgICAgKChiYXNlQWRkclZhbHVlIDw8IDE2KSArICgod2luZG93U2l6ZVZhbHVlIDw8IDE2KSB8IDB4ZmZmZikpKQoJCXJldHVybiAweGZmZmZmZmZmOwoJcmV0dXJuIGVmZmVjdGl2ZUJhc2VBZGRyZXNzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBtZW1vcnlTZXRSZWdpb25Tbm9vcE1vZGUgLSBUaGlzIGZ1bmN0aW9uIG1vZGlmeXMgb25lIG9mIHRoZSA0IHJlZ2lvbnMgd2hpY2gKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0cyBDYWNoZSBDb2hlcmVuY3kuCioKKgoqIElucHV0czogU05PT1BfUkVHSU9OIHJlZ2lvbiAtIE9uZSBvZiB0aGUgZm91ciByZWdpb25zLgoqICAgICAgICAgU05PT1BfVFlQRSBzbm9vcFR5cGUgLSBUaGVyZSBpcyBmb3VyIG9wdGlvbmFsIFR5cGVzOgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuIE5vIFNub29wLgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuIFNub29wIHRvIFdUIHJlZ2lvbi4KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLiBTbm9vcCB0byBXQiByZWdpb24uCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC4gU25vb3AgJiBJbnZhbGlkYXRlIHRvIFdCIHJlZ2lvbi4KKiAgICAgICAgIHVuc2lnbmVkIGludCBiYXNlQWRkcmVzcyAtIEJhc2UgQWRkcmVzcyBvZiB0aGlzIHJlZ2lvbi4KKiAgICAgICAgIHVuc2lnbmVkIGludCB0b3BBZGRyZXNzIC0gVG9wIEFkZHJlc3Mgb2YgdGhpcyByZWdpb24uCiogUmV0dXJuczogZmFsc2UgaWYgb25lIG9mIHRoZSBwYXJhbWV0ZXJzIGlzIHdyb25nIGFuZCB0cnVlIGVsc2UKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBldmI2MjYwIGNvZGUgKi8KI2lmIDAKYm9vbCBtZW1vcnlTZXRSZWdpb25Tbm9vcE1vZGUoTUVNT1JZX1NOT09QX1JFR0lPTiByZWdpb24sCgkJCSAgICAgIE1FTU9SWV9TTk9PUF9UWVBFIHNub29wVHlwZSwKCQkJICAgICAgdW5zaWduZWQgaW50IGJhc2VBZGRyZXNzLAoJCQkgICAgICB1bnNpZ25lZCBpbnQgcmVnaW9uTGVuZ3RoKQp7CiAgICB1bnNpZ25lZCBpbnQgc25vb3BYYmFzZUFkZHJlc3M7CiAgICB1bnNpZ25lZCBpbnQgc25vb3BYdG9wQWRkcmVzczsKICAgIHVuc2lnbmVkIGludCBkYXRhOwogICAgdW5zaWduZWQgaW50IHNub29wSGlnaCA9IGJhc2VBZGRyZXNzICsgcmVnaW9uTGVuZ3RoOwoKICAgIGlmKCAocmVnaW9uID4gTUVNX1NOT09QX1JFR0lPTjMpIHx8IChzbm9vcFR5cGUgPiBNRU1fU05PT1BfV0IpICkKCXJldHVybiBmYWxzZTsKICAgIHNub29wWGJhc2VBZGRyZXNzID0gU05PT1BfQkFTRV9BRERSRVNTXzAgKyAweDEwICogcmVnaW9uOwogICAgc25vb3BYdG9wQWRkcmVzcyA9IFNOT09QX1RPUF9BRERSRVNTXzAgKyAweDEwICogcmVnaW9uOwoJCQkJIGlmKHJlZ2lvbkxlbmd0aCA9PSAwKSAvKiBjbG9zaW5nIHRoZSByZWdpb24gKi8KICAgIHsKCUdUX1JFR19XUklURShzbm9vcFhiYXNlQWRkcmVzcywweDAwMDBmZmZmKTsKCUdUX1JFR19XUklURShzbm9vcFh0b3BBZGRyZXNzLDApOwoJcmV0dXJuIHRydWU7CiAgICB9CiAgICBiYXNlQWRkcmVzcyA9IGJhc2VBZGRyZXNzICYgMHhmZmZmMDAwMDsKICAgIGRhdGEgPSAoYmFzZUFkZHJlc3MgPj4gMTYpIHwgc25vb3BUeXBlIDw8IDE2OwogICAgR1RfUkVHX1dSSVRFKHNub29wWGJhc2VBZGRyZXNzLGRhdGEpOwogICAgc25vb3BIaWdoID0gKHNub29wSGlnaCAmIDB4ZmZmMDAwMDApID4+IDIwOwogICAgR1RfUkVHX1dSSVRFKHNub29wWHRvcEFkZHJlc3Msc25vb3BIaWdoIC0gMSk7CiAgICByZXR1cm4gdHJ1ZTsKfQojZW5kaWYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIG1lbW9yeVJlbWFwQWRkcmVzcyAtIFRoaXMgZnViY3Rpb24gdXNlZCBmb3IgYWRkcmVzcyByZW1hcHBpbmcuCioKKgoqIElucHV0czogcmVnT2Zmc2V0OiByZW1hcCByZWdpc3RlcgoqICAgICAgICAgcmVtYXBWYWx1ZSA6CiogUmV0dXJuczogZmFsc2UgaWYgb25lIG9mIHRoZSBwYXJhbWV0ZXJzIGlzIGVycm9uZW91cyx0cnVlIG90aGVyd2lzZS4KKgoqIE5vdCBuZWVkZWQgZnVuY3Rpb24gVG9fZG8gISEhIQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmJvb2wgbWVtb3J5UmVtYXBBZGRyZXNzICh1bnNpZ25lZCBpbnQgcmVtYXBSZWcsIHVuc2lnbmVkIGludCByZW1hcFZhbHVlKQp7Cgl1bnNpZ25lZCBpbnQgdmFsdWVGb3JSZWc7CgoJdmFsdWVGb3JSZWcgPSAocmVtYXBWYWx1ZSAmIDB4ZmZmMDAwMDApID4+IDIwOwoJR1RfUkVHX1dSSVRFIChyZW1hcFJlZywgdmFsdWVGb3JSZWcpOwoJcmV0dXJuIHRydWU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogbWVtb3J5R2V0RGV2aWNlUGFyYW0gLSBFeHRyYWN0IHRoZSBkZXZpY2UgcGFyYW1ldGVycyBmcm9tIHRoZSBkZXZpY2UgYmFuawoqICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIHJlZ2lzdGVyLgoqCiogREVTQ1JJUFRJT046CiogICAgICAgVG8gYWxsb3cgaW50ZXJmYWNpbmcgd2l0aCB2ZXJ5IHNsb3cgZGV2aWNlcyBhbmQgZmFzdCBzeW5jaHJvbm91cyBTUkFNcywKKiAgICAgICBlYWNoIGRldmljZSBjYW4gYmUgcHJvZ3JhbWVkIHRvIGRpZmZlcmVudCB0aW1pbmcgcGFyYW1ldGVycy4gRWFjaCBiYW5rCiogICAgICAgaGFzIGl0cyBvd24gcGFyYW1ldGVycyByZWdpc3Rlci4gQmFuayB3aWR0aCBjYW4gYmUgcHJvZ3JhbW1lZCB0byA4LCAxNiwKKiAgICAgICBvciAzMi1iaXRzLiBCYW5rIHRpbWluZyBwYXJhbWV0ZXJzIGNhbiBiZSBwcm9ncmFtbWVkIHRvIHN1cHBvcnQKKiAgICAgICBkaWZmZXJlbnQgZGV2aWNlIHR5cGVzIChlLmcuIFN5bmMgQnVyc3QgU1JBTSwgRmxhc2ggLCBST00sIEkvTwoqICAgICAgIENvbnRyb2xsZXJzKS4gVGhlIE1WIGFsbG93cyB5b3UgdG8gc2V0IHRpbWluZyBwYXJhbWV0ZXJzIGFuZCB3aWR0aCBmb3IKKiAgICAgICBlYWNoIGRldmljZSB0aHJvdWdoIHBhcmFtZXRlcnMgcmVnaXN0ZXIgLgoqICAgICAgIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgdGhlIHBhcmFtZXRlcnMgZGVzY3JpYmVkIGZyb20gdGhlIERldmljZSBCYW5rCiogICAgICAgcGFyYW1ldGVycyByZWdpc3RlciBhbmQgZmlsbHMgdGhlIGdpdmVuICdkZXZpY2VQYXJhbScgKGRlZmluZWQgaW4KKiAgICAgICBndE1lbW9yeS5oKSBzdHJ1Y3R1cmUgd2l0aCB0aGUgcmVhZCBkYXRhLgoqCiogSU5QVVQ6CiogICAgICAgZGV2aWNlUGFyYW0gLSAgcG9pbnRlciB0byBhIHN0cnVjdHVyZSBERVZJQ0VfUEFSQU0gKGRlZmluZWQgaW4KKiAgICAgICAgICAgICAgICAgICAgICBNZW1vcnkuaCkuRm9yIGRldGFpbHMgYWJvdXQgZWFjaCBzdHJ1Y3R1cmUgZmllbGQgcGxlYXNlCiogICAgICAgICAgICAgICAgICAgICAgc2VlIHRoZSBkZXZpY2UgdGltaW5nIHBhcmFtZXRlciBzZWN0aW9uIGluIHRoZSBNVgoqICAgICAgICAgICAgICAgICAgICAgIGRhdGFzaGVldC4KKiAgICAgICBkZXZpY2VOdW0gIC0gICBTZWxlY3Qgb24gb2YgdGhlIGZpdmUgZGV2aWNlIGJhbmtzIChkZWZpbmVkIGluCiogICAgICAgICAgICAgICAgICAgICAgTWVtb3J5LmgpIDoKKgoqICAgICAgICAgICAgICAgICAgICAgICAtIERFVklDRTAKKiAgICAgICAgICAgICAgICAgICAgICAgLSBERVZJQ0UxCiogICAgICAgICAgICAgICAgICAgICAgIC0gREVWSUNFMgoqICAgICAgICAgICAgICAgICAgICAgICAtIGV0Yy4KKgoqIE9VVFBVVDoKKiAgICAgICBOb25lLgoqCiogUkVUVVJOOgoqICAgICAgIGZhbHNlIGlmIG9uZSBvZiB0aGUgcGFyYW1ldGVycyBpcyBlcnJvbmVvdXMsdHJ1ZSBvdGhlcndpc2UuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogbWVtb3J5R2V0RGV2aWNlUGFyYW0gLSBUaGlzIGZ1bmN0aW9uIHVzZWQgZm9yIGdldHRpbmcgZGV2aWNlIHBhcmFtZXRlcnMgZnJvbQoqICAgICAgICAgICAgICAgICAgICAgICAgREVWSUNFIEJBTksgUEFSQU1FVEVSUyBSRUdJU1RFUgoqCioKKiBJbnB1dHM6ICAgICAgICAtIGRldmljZVBhcmFtOiBTVFJVQ1Qgd2l0aCBwYXJhbWl0ZXJzIGZvciBERVZJQ0UgQkFOSwoqICAgICAgICAgICAgICAgICAgUEFSQU1FVEVSUyBSRUdJU1RFUgoqICAgICAgICAgICAgICAgIC0gZGV2aWNlTnVtIDogbnVtYmVyIG9mIGRldmljZQoqIFJldHVybnM6IGZhbHNlIGlmIG9uZSBvZiB0aGUgcGFyYW1ldGVycyBpcyBlcnJvbmVvdXMsdHJ1ZSBvdGhlcndpc2UuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCmJvb2wgbWVtb3J5R2V0RGV2aWNlUGFyYW0gKERFVklDRV9QQVJBTSAqIGRldmljZVBhcmFtLCBERVZJQ0UgZGV2aWNlTnVtKQp7Cgl1bnNpZ25lZCBpbnQgdmFsdWVPZlJlZzsKCXVuc2lnbmVkIGludCBjYWxjRGF0YTsKCglpZiAoZGV2aWNlTnVtID4gNCkKCQlyZXR1cm4gZmFsc2U7CglHVF9SRUdfUkVBRCAoREVWSUNFX0JBTkswUEFSQU1FVEVSUyArIDQgKiBkZXZpY2VOdW0sICZ2YWx1ZU9mUmVnKTsKCWNhbGNEYXRhID0gKDB4NyAmIHZhbHVlT2ZSZWcpICsgKChCSVQyMiAmIHZhbHVlT2ZSZWcpID4+IDE5KTsKCWRldmljZVBhcmFtLT50dXJuT2ZmID0gY2FsY0RhdGE7CS8qIFR1cm4gT2ZmICovCgoJY2FsY0RhdGEgPSAoKDB4NzggJiB2YWx1ZU9mUmVnKSA+PiAzKSArICgoQklUMjMgJiB2YWx1ZU9mUmVnKSA+PiAxOSk7CglkZXZpY2VQYXJhbS0+YWNjMkZpcnN0ID0gY2FsY0RhdGE7CS8qIEFjY2VzcyBUbyBGaXJzdCAqLwoKCWNhbGNEYXRhID0gKCgweDc4MCAmIHZhbHVlT2ZSZWcpID4+IDcpICsgKChCSVQyNCAmIHZhbHVlT2ZSZWcpID4+IDIwKTsKCWRldmljZVBhcmFtLT5hY2MyTmV4dCA9IGNhbGNEYXRhOwkvKiBBY2Nlc3MgVG8gTmV4dCAqLwoKCWNhbGNEYXRhID0KCQkoKDB4MzgwMCAmIHZhbHVlT2ZSZWcpID4+IDExKSArICgoQklUMjUgJiB2YWx1ZU9mUmVnKSA+PiAyMik7CglkZXZpY2VQYXJhbS0+YWxlMldyID0gY2FsY0RhdGE7CS8qIEFsZSBUbyBXcml0ZSAqLwoKCWNhbGNEYXRhID0gKCgweDFjMDAwICYgdmFsdWVPZlJlZykgPj4gMTQpICsKCQkoKEJJVDI2ICYgdmFsdWVPZlJlZykgPj4gMjMpOwoJZGV2aWNlUGFyYW0tPndyTG93ID0gY2FsY0RhdGE7CS8qIFdyaXRlIEFjdGl2ZSAqLwoKCWNhbGNEYXRhID0gKCgweGUwMDAwICYgdmFsdWVPZlJlZykgPj4gMTcpICsKCQkoKEJJVDI3ICYgdmFsdWVPZlJlZykgPj4gMjQpOwoJZGV2aWNlUGFyYW0tPndySGlnaCA9IGNhbGNEYXRhOwkvKiBXcml0ZSBIaWdoICovCgoJY2FsY0RhdGEgPSAoKDB4MzAwMDAwICYgdmFsdWVPZlJlZykgPj4gMjApOwoJZGV2aWNlUGFyYW0tPmRldmljZVdpZHRoID0gKEJJVDAgPDwgY2FsY0RhdGEpOwkvKiBJbiBieXRlcyAqLwoJY2FsY0RhdGEgPSAoKDB4MzAwMDAwMDAgJiB2YWx1ZU9mUmVnKSA+PiAyOCk7CglkZXZpY2VQYXJhbS0+YmFkclNrZXcgPSBjYWxjRGF0YTsJLyogQ3ljbGVzIGdhcCBiZXR3ZWVuIEJBZHIKCQkJCQkJICAgdG9nZ2xlIHRvIHJlYWQgZGF0YSBzYW1wbGUuICovCgljYWxjRGF0YSA9ICgoMHg0MDAwMDAwMCAmIHZhbHVlT2ZSZWcpID4+IDMwKTsKCWRldmljZVBhcmFtLT5EUEVuID0gY2FsY0RhdGE7CS8qICBEYXRhIFBhcml0eSBlbmFibGUgICovCglyZXR1cm4gdHJ1ZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBtZW1vcnlTZXREZXZpY2VQYXJhbSAtIFNldCBuZXcgcGFyYW1ldGVycyBmb3IgYSBkZXZpY2UuCioKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRvIGFsbG93IGludGVyZmFjaW5nIHdpdGggdmVyeSBzbG93IGRldmljZXMgYW5kIGZhc3Qgc3luY2hyb25vdXMgU1JBTXMsCiogICAgICAgZWFjaCBkZXZpY2UgY2FuIGJlIHByb2dyYW1lZCB0byBkaWZmZXJlbnQgdGltaW5nIHBhcmFtZXRlcnMuIEVhY2ggYmFuawoqICAgICAgIGhhcyBpdHMgb3duIHBhcmFtZXRlcnMgcmVnaXN0ZXIuIEJhbmsgd2lkdGggY2FuIGJlIHByb2dyYW1tZWQgdG8gOCwgMTYsCiogICAgICAgb3IgMzItYml0cy4gQmFuayB0aW1pbmcgcGFyYW1ldGVycyBjYW4gYmUgcHJvZ3JhbW1lZCB0byBzdXBwb3J0CiogICAgICAgZGlmZmVyZW50IGRldmljZSB0eXBlcyAoZS5nLiBTeW5jIEJ1cnN0IFNSQU0sIEZsYXNoICwgUk9NLCBJL08KKiAgICAgICBDb250cm9sbGVycykuIFRoZSBNViBhbGxvd3MgeW91IHRvIHNldCB0aW1pbmcgcGFyYW1ldGVycyBhbmQgd2lkdGggZm9yCiogICAgICAgZWFjaCBkZXZpY2UgdGhyb3VnaCBwYXJhbWV0ZXJzIHJlZ2lzdGVyLiBUaGlzIGZ1bmN0aW9uIHNldCBuZXcKKiAgICAgICBwYXJhbWV0ZXJzIHRvIGEgZGV2aWNlIEJhbmsgZnJvbSB0aGUgZGVsaXZlcmVkIHN0cnVjdHVyZSAnZGV2aWNlUGFyYW0nCiogICAgICAgKGRlZmluZWQgaW4gZ3RNZW1vcnkuaCkuIFRoZSBzdHJ1Y3R1cmUgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGRhdGEKKiAgICAgICBwcmlvciB0byB0aGUgdXNlIG9mIHRoZXNlIGZ1bmN0aW9uLgoqCiogSU5QVVQ6CiogICAgICAgZGV2aWNlUGFyYW0gLSAgcG9pbnRlciB0byBhIHN0cnVjdHVyZSBERVZJQ0VfUEFSQU0gKGRlZmluZWQgaW4KKiAgICAgICAgICAgICAgICAgICAgICBNZW1vcnkuaCkuRm9yIGRldGFpbHMgYWJvdXQgZWFjaCBzdHJ1Y3R1cmUgZmllbGQgcGxlYXNlCiogICAgICAgICAgICAgICAgICAgICAgc2VlIHRoZSBkZXZpY2UgdGltaW5nIHBhcmFtZXRlciBzZWN0aW9uIGluIHRoZSBNVgoqICAgICAgICAgICAgICAgICAgICAgIGRhdGFzaGVldC4KKiAgICAgICBkZXZpY2VOdW0gIC0gICBTZWxlY3Qgb24gb2YgdGhlIGZpdmUgZGV2aWNlIGJhbmtzIChkZWZpbmVkIGluCiogICAgICAgICAgICAgICAgICAgICAgTWVtb3J5LmgpIDoKKgoqICAgICAgICAgICAgICAgICAgICAgICAtIERFVklDRTAKKiAgICAgICAgICAgICAgICAgICAgICAgLSBERVZJQ0UxCiogICAgICAgICAgICAgICAgICAgICAgIC0gREVWSUNFMgoqICAgICAgICAgICAgICAgICAgICAgICAtIGV0Yy4KKgoqIE9VVFBVVDoKKiAgICAgICBOb25lLgoqCiogUkVUVVJOOgoqICAgICAgIGZhbHNlIGlmIG9uZSBvZiB0aGUgcGFyYW1ldGVycyBpcyBlcnJvbmVvdXMsdHJ1ZSBvdGhlcndpc2UuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogbWVtb3J5U2V0RGV2aWNlUGFyYW0gLSBUaGlzIGZ1bmN0aW9uIHVzZWQgZm9yIHNldHRpbmcgZGV2aWNlIHBhcmFtZXRlcnMgdG8KKiAgICAgICAgICAgICAgICAgICAgICAgIERFVklDRSBCQU5LIFBBUkFNRVRFUlMgUkVHSVNURVIKKgoqCiogSW5wdXRzOiAgICAgICAgLSBkZXZpY2VQYXJhbTogU1RSVUNUIGZvciBzdG9yZSBwYXJhbWl0ZXJzIGZyb20gREVWSUNFIEJBTksKKiAgICAgICAgICAgICAgICAgIFBBUkFNRVRFUlMgUkVHSVNURVIKKiAgICAgICAgICAgICAgICAtIGRldmljZU51bSA6IG51bWJlciBvZiBkZXZpY2UKKiBSZXR1cm5zOiBmYWxzZSBpZiBvbmUgb2YgdGhlIHBhcmFtZXRlcnMgaXMgZXJyb25lb3VzLHRydWUgb3RoZXJ3aXNlLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmJvb2wgbWVtb3J5U2V0RGV2aWNlUGFyYW0gKERFVklDRV9QQVJBTSAqIGRldmljZVBhcmFtLCBERVZJQ0UgZGV2aWNlTnVtKQp7Cgl1bnNpZ25lZCBpbnQgdmFsdWVGb3JSZWc7CgoJaWYgKChkZXZpY2VQYXJhbS0+dHVybk9mZiA+IDB4NykgfHwgKGRldmljZVBhcmFtLT5hY2MyRmlyc3QgPiAweGYpIHx8CgkgICAgKGRldmljZVBhcmFtLT5hY2MyTmV4dCA+IDB4ZikgfHwgKGRldmljZVBhcmFtLT5hbGUyV3IgPiAweDcpIHx8CgkgICAgKGRldmljZVBhcmFtLT53ckxvdyA+IDB4NykgfHwgKGRldmljZVBhcmFtLT53ckhpZ2ggPiAweDcpIHx8CgkgICAgKGRldmljZVBhcmFtLT5iYWRyU2tldyA+IDB4MikgfHwgKGRldmljZVBhcmFtLT5EUEVuID4gMHgxKSkgewoJCXJldHVybiBmYWxzZTsKCX0KCXZhbHVlRm9yUmVnID0gKCgoZGV2aWNlUGFyYW0tPnR1cm5PZmYpICYgMHg3KSB8CgkJICAgICAgICgoKGRldmljZVBhcmFtLT50dXJuT2ZmKSAmIDB4OCkgPDwgMTkpIHwKCQkgICAgICAgKCgoZGV2aWNlUGFyYW0tPmFjYzJGaXJzdCkgJiAweGYpIDw8IDMpIHwKCQkgICAgICAgKCgoZGV2aWNlUGFyYW0tPmFjYzJGaXJzdCkgJiAweDEwKSA8PCAxOSkgfAoJCSAgICAgICAoKChkZXZpY2VQYXJhbS0+YWNjMk5leHQpICYgMHhmKSA8PCA3KSB8CgkJICAgICAgICgoKGRldmljZVBhcmFtLT5hY2MyTmV4dCkgJiAweDEwKSA8PCAyMCkgfAoJCSAgICAgICAoKChkZXZpY2VQYXJhbS0+YWxlMldyKSAmIDB4NykgPDwgMTEpIHwKCQkgICAgICAgKCgoZGV2aWNlUGFyYW0tPmFsZTJXcikgJiAweGYpIDw8IDIyKSB8CgkJICAgICAgICgoKGRldmljZVBhcmFtLT53ckxvdykgJiAweDcpIDw8IDE0KSB8CgkJICAgICAgICgoKGRldmljZVBhcmFtLT53ckxvdykgJiAweGYpIDw8IDIzKSB8CgkJICAgICAgICgoKGRldmljZVBhcmFtLT53ckhpZ2gpICYgMHg3KSA8PCAxNykgfAoJCSAgICAgICAoKChkZXZpY2VQYXJhbS0+d3JIaWdoKSAmIDB4ZikgPDwgMjQpIHwKCQkgICAgICAgKCgoZGV2aWNlUGFyYW0tPmJhZHJTa2V3KSAmIDB4MykgPDwgMjgpIHwKCQkgICAgICAgKCgoZGV2aWNlUGFyYW0tPkRQRW4pICYgMHgxKSA8PCAzMCkpOwoKCS8qIGluc2VydCB0aGUgZGV2aWNlIHdpZHRoOiAqLwoJc3dpdGNoIChkZXZpY2VQYXJhbS0+ZGV2aWNlV2lkdGgpIHsKCWNhc2UgMToKCQl2YWx1ZUZvclJlZyA9IHZhbHVlRm9yUmVnIHwgXzhCSVQ7CgkJYnJlYWs7CgljYXNlIDI6CgkJdmFsdWVGb3JSZWcgPSB2YWx1ZUZvclJlZyB8IF8xNkJJVDsKCQlicmVhazsKCWNhc2UgNDoKCQl2YWx1ZUZvclJlZyA9IHZhbHVlRm9yUmVnIHwgXzMyQklUOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQl2YWx1ZUZvclJlZyA9IHZhbHVlRm9yUmVnIHwgXzhCSVQ7CgkJYnJlYWs7Cgl9CglHVF9SRUdfV1JJVEUgKERFVklDRV9CQU5LMFBBUkFNRVRFUlMgKyA0ICogZGV2aWNlTnVtLCB2YWx1ZUZvclJlZyk7CglyZXR1cm4gdHJ1ZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBNZW1vcnlEaXNhYmxlV2luZG93IC0gRGlzYWJsZSBhIG1lbW9yeSBzcGFjZSBieSB0aGUgZGlzYWJsZSBiaXQuCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyBmdW5jdGlvbiBkaXNhYmxlcyBvbmUgb2YgdGhlIDIxIGF2YWlsaWFibGUgd2luZG93cyBkZWRpY2F0ZWQgZm9yCiogICAgICAgdGhlIENQVSBkZWNvZGluZyBtZWNoYW5pc20uIEl0cyBwb3NzaWJsZSB0byBjb21iaW5lIHNldmVyYWwgd2luZG93cyB3aXRoCiogICAgICAgdGhlIE9SIGNvbW1hbmQuCiogSU5QVVQ6CiogICAgICAgd2luZG93IC0gT25lIG9yIG1vcmUgb2YgdGhlIG1lbW9yeSB3aW5kb3dzIChkZWZpbmVkIGluIGd0TWVtb3J5LmgpLgoqIE9VVFBVVDoKKiAgICAgICBOb25lLgoqIFJFVFVSTjoKKiAgICAgICBOb25lLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIE1lbW9yeURpc2FibGVXaW5kb3cgKE1FTU9SWV9XSU5ET1cgd2luZG93KQp7CglTRVRfUkVHX0JJVFMgKEJBU0VfQUREUl9FTkFCTEUsIHdpbmRvdyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogTWVtb3J5RW5hYmxlV2luZG93IC0gRW5hYmxlIGEgbWVtb3J5IHNwYWNlIHRoYXQgd2FzIGRpc2FibGVkIGJ5CiogICAgICAgICAgICAgICAgICAgICAgICdNZW1vcnlEaXNhYmxlV2luZG93Jy4KKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgb25lIG9mIHRoZSAyMSBhdmFpbGlhYmxlIHdpbmRvd3MgZGVkaWNhdGVkIGZvciB0aGUKKiAgICAgICBDUFUgZGVjb2RpbmcgbWVjaGFuaXNtLiBJdHMgcG9zc2libGUgdG8gY29tYmluZSBzZXZlcmFsIHdpbmRvd3Mgd2l0aCB0aGUKKiAgICAgICBPUiBjb21tYW5kLgoqIElOUFVUOgoqICAgICAgIHdpbmRvdyAtIE9uZSBvciBtb3JlIG9mIHRoZSBtZW1vcnkgd2luZG93cyAoZGVmaW5lZCBpbiBndE1lbW9yeS5oKS4KKiBPVVRQVVQ6CiogICAgICAgTm9uZS4KKiBSRVRVUk46CiogICAgICAgTm9uZS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBNZW1vcnlFbmFibGVXaW5kb3cgKE1FTU9SWV9XSU5ET1cgd2luZG93KQp7CglSRVNFVF9SRUdfQklUUyAoQkFTRV9BRERSX0VOQUJMRSwgd2luZG93KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBNZW1vcnlHZXRNZW1XaW5kb3dTdGF0dXMgLSBUaGlzIGZ1bmN0aW9uIGNoZWNrIHdoZXRoZXIgdGhlIG1lbW9yeSB3aW5kb3cgaXMKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkIG9yIG5vdC4KKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgZ2l2ZW4gbWVtb3J5IHdpbmRvdyBpcyBjbG9zZWQgLgoqIElOUFVUOgoqICAgICAgIHdpbmRvdyAtIE9uZSBvciBtb3JlIG9mIHRoZSBtZW1vcnkgd2luZG93cyAoZGVmaW5lZCBpbiBndE1lbW9yeS5oKS4KKiBPVVRQVVQ6CiogICAgICAgTm9uZS4KKiBSRVRVUk46CiogICAgICAgVHJ1ZSBmb3IgYSBjbG9zZWQgd2luZG93LCBmYWxzZSBvdGhlcndpc2UgLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpNRU1PUllfV0lORE9XX1NUQVRVUyBNZW1vcnlHZXRNZW1XaW5kb3dTdGF0dXMgKE1FTU9SWV9XSU5ET1cgd2luZG93KQp7CglpZiAoR1RSRUdSRUFEIChCQVNFX0FERFJfRU5BQkxFKSAmIHdpbmRvdykKCQlyZXR1cm4gTUVNX1dJTkRPV19ESVNBQkxFRDsKCXJldHVybiBNRU1fV0lORE9XX0VOQUJMRUQ7Cn0K