I2lmbmRlZiBHSU1fUVVBTlRJWkVEX1NFVF9IX0lOQ0xVREVECiNkZWZpbmUgR0lNX1FVQU5USVpFRF9TRVRfSF9JTkNMVURFRAoKLyohIFxmaWxlIGJ0R0ltcGFjdFF1YW50aXplZEJ2aC5oClxhdXRob3IgRnJhbmNpc2NvIExlf24gTt9qZXJhCiovCi8qClRoaXMgc291cmNlIGZpbGUgaXMgcGFydCBvZiBHSU1QQUNUIExpYnJhcnkuCgpGb3IgdGhlIGxhdGVzdCBpbmZvLCBzZWUgaHR0cDovL2dpbXBhY3Quc291cmNlZm9yZ2UubmV0LwoKQ29weXJpZ2h0IChjKSAyMDA3IEZyYW5jaXNjbyBMZW9uIE5hamVyYS4gQy5DLiA4MDA4NzM3MS4KZW1haWw6IHByb2plY3RpbGVtYW5AeWFob28uY29tCgoKVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCkluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuClBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAppbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0IGZyZWVseSwKc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKCjEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90IGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZSBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgoyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCjMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCiovCgojaW5jbHVkZSAiYnRHSW1wYWN0QnZoLmgiCiNpbmNsdWRlICJidFF1YW50aXphdGlvbi5oIgoKCgoKCi8vL2J0UXVhbnRpemVkQnZoTm9kZSBpcyBhIGNvbXByZXNzZWQgYWFiYiBub2RlLCAxNiBieXRlcy4KLy8vTm9kZSBjYW4gYmUgdXNlZCBmb3IgbGVhZm5vZGUgb3IgaW50ZXJuYWwgbm9kZS4gTGVhZm5vZGVzIGNhbiBwb2ludCB0byAzMi1iaXQgdHJpYW5nbGUgaW5kZXggKG5vbi1uZWdhdGl2ZSByYW5nZSkuCkFUVFJJQlVURV9BTElHTkVEMTYJKHN0cnVjdCkgQlRfUVVBTlRJWkVEX0JWSF9OT0RFCnsKCS8vMTIgYnl0ZXMKCXVuc2lnbmVkIHNob3J0IGludAltX3F1YW50aXplZEFhYmJNaW5bM107Cgl1bnNpZ25lZCBzaG9ydCBpbnQJbV9xdWFudGl6ZWRBYWJiTWF4WzNdOwoJLy80IGJ5dGVzCglpbnQJbV9lc2NhcGVJbmRleE9yRGF0YUluZGV4OwoKCUJUX1FVQU5USVpFRF9CVkhfTk9ERSgpCgl7CgkJbV9lc2NhcGVJbmRleE9yRGF0YUluZGV4ID0gMDsKCX0KCglTSU1EX0ZPUkNFX0lOTElORSBib29sIGlzTGVhZk5vZGUoKSBjb25zdAoJewoJCS8vc2tpcGluZGV4IGlzIG5lZ2F0aXZlIChpbnRlcm5hbCBub2RlKSwgdHJpYW5nbGVpbmRleCA+PTAgKGxlYWZub2RlKQoJCXJldHVybiAobV9lc2NhcGVJbmRleE9yRGF0YUluZGV4Pj0wKTsKCX0KCglTSU1EX0ZPUkNFX0lOTElORSBpbnQgZ2V0RXNjYXBlSW5kZXgoKSBjb25zdAoJewoJCS8vYnRBc3NlcnQobV9lc2NhcGVJbmRleE9yRGF0YUluZGV4IDwgMCk7CgkJcmV0dXJuIC1tX2VzY2FwZUluZGV4T3JEYXRhSW5kZXg7Cgl9CgoJU0lNRF9GT1JDRV9JTkxJTkUgdm9pZCBzZXRFc2NhcGVJbmRleChpbnQgaW5kZXgpCgl7CgkJbV9lc2NhcGVJbmRleE9yRGF0YUluZGV4ID0gLWluZGV4OwoJfQoKCVNJTURfRk9SQ0VfSU5MSU5FIGludCBnZXREYXRhSW5kZXgoKSBjb25zdAoJewoJCS8vYnRBc3NlcnQobV9lc2NhcGVJbmRleE9yRGF0YUluZGV4ID49IDApOwoKCQlyZXR1cm4gbV9lc2NhcGVJbmRleE9yRGF0YUluZGV4OwoJfQoKCVNJTURfRk9SQ0VfSU5MSU5FIHZvaWQgc2V0RGF0YUluZGV4KGludCBpbmRleCkKCXsKCQltX2VzY2FwZUluZGV4T3JEYXRhSW5kZXggPSBpbmRleDsKCX0KCglTSU1EX0ZPUkNFX0lOTElORSBib29sIHRlc3RRdWFudGl6ZWRCb3hPdmVybGFwcCgKCQl1bnNpZ25lZCBzaG9ydCAqIHF1YW50aXplZE1pbix1bnNpZ25lZCBzaG9ydCAqIHF1YW50aXplZE1heCkgY29uc3QKCXsKCQlpZihtX3F1YW50aXplZEFhYmJNaW5bMF0gPiBxdWFudGl6ZWRNYXhbMF0gfHwKCQkgICBtX3F1YW50aXplZEFhYmJNYXhbMF0gPCBxdWFudGl6ZWRNaW5bMF0gfHwKCQkgICBtX3F1YW50aXplZEFhYmJNaW5bMV0gPiBxdWFudGl6ZWRNYXhbMV0gfHwKCQkgICBtX3F1YW50aXplZEFhYmJNYXhbMV0gPCBxdWFudGl6ZWRNaW5bMV0gfHwKCQkgICBtX3F1YW50aXplZEFhYmJNaW5bMl0gPiBxdWFudGl6ZWRNYXhbMl0gfHwKCQkgICBtX3F1YW50aXplZEFhYmJNYXhbMl0gPCBxdWFudGl6ZWRNaW5bMl0pCgkJewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiB0cnVlOwoJfQoKfTsKCgoKY2xhc3MgR0lNX1FVQU5USVpFRF9CVkhfTk9ERV9BUlJBWTpwdWJsaWMgYnRBbGlnbmVkT2JqZWN0QXJyYXk8QlRfUVVBTlRJWkVEX0JWSF9OT0RFPgp7Cn07CgoKCgovLyEgQmFzaWMgQm94IHRyZWUgc3RydWN0dXJlCmNsYXNzIGJ0UXVhbnRpemVkQnZoVHJlZQp7CnByb3RlY3RlZDoKCWludCBtX251bV9ub2RlczsKCUdJTV9RVUFOVElaRURfQlZIX05PREVfQVJSQVkgbV9ub2RlX2FycmF5OwoJYnRBQUJCIG1fZ2xvYmFsX2JvdW5kOwoJYnRWZWN0b3IzIG1fYnZoUXVhbnRpemF0aW9uOwpwcm90ZWN0ZWQ6Cgl2b2lkIGNhbGNfcXVhbnRpemF0aW9uKEdJTV9CVkhfREFUQV9BUlJBWSAmIHByaW1pdGl2ZV9ib3hlcywgYnRTY2FsYXIgYm91bmRNYXJnaW4gPSBidFNjYWxhcigxLjApICk7CgoJaW50IF9zb3J0X2FuZF9jYWxjX3NwbGl0dGluZ19pbmRleCgKCQlHSU1fQlZIX0RBVEFfQVJSQVkgJiBwcmltaXRpdmVfYm94ZXMsCgkJIGludCBzdGFydEluZGV4LCAgaW50IGVuZEluZGV4LCBpbnQgc3BsaXRBeGlzKTsKCglpbnQgX2NhbGNfc3BsaXR0aW5nX2F4aXMoR0lNX0JWSF9EQVRBX0FSUkFZICYgcHJpbWl0aXZlX2JveGVzLCBpbnQgc3RhcnRJbmRleCwgIGludCBlbmRJbmRleCk7CgoJdm9pZCBfYnVpbGRfc3ViX3RyZWUoR0lNX0JWSF9EQVRBX0FSUkFZICYgcHJpbWl0aXZlX2JveGVzLCBpbnQgc3RhcnRJbmRleCwgIGludCBlbmRJbmRleCk7CnB1YmxpYzoKCWJ0UXVhbnRpemVkQnZoVHJlZSgpCgl7CgkJbV9udW1fbm9kZXMgPSAwOwoJfQoKCS8vISBwcm90b3R5cGUgZnVuY3Rpb25zIGZvciBib3ggdHJlZSBtYW5hZ2VtZW50CgkvLyFAewoJdm9pZCBidWlsZF90cmVlKEdJTV9CVkhfREFUQV9BUlJBWSAmIHByaW1pdGl2ZV9ib3hlcyk7CgoJU0lNRF9GT1JDRV9JTkxJTkUgdm9pZCBxdWFudGl6ZVBvaW50KAoJCXVuc2lnbmVkIHNob3J0ICogcXVhbnRpemVkcG9pbnQsIGNvbnN0IGJ0VmVjdG9yMyAmIHBvaW50KSBjb25zdAoJewoJCWJ0X3F1YW50aXplX2NsYW1wKHF1YW50aXplZHBvaW50LHBvaW50LG1fZ2xvYmFsX2JvdW5kLm1fbWluLG1fZ2xvYmFsX2JvdW5kLm1fbWF4LG1fYnZoUXVhbnRpemF0aW9uKTsKCX0KCgoJU0lNRF9GT1JDRV9JTkxJTkUgYm9vbCB0ZXN0UXVhbnRpemVkQm94T3ZlcmxhcHAoCgkJaW50IG5vZGVfaW5kZXgsCgkJdW5zaWduZWQgc2hvcnQgKiBxdWFudGl6ZWRNaW4sdW5zaWduZWQgc2hvcnQgKiBxdWFudGl6ZWRNYXgpIGNvbnN0Cgl7CgkJcmV0dXJuIG1fbm9kZV9hcnJheVtub2RlX2luZGV4XS50ZXN0UXVhbnRpemVkQm94T3ZlcmxhcHAocXVhbnRpemVkTWluLHF1YW50aXplZE1heCk7Cgl9CgoJU0lNRF9GT1JDRV9JTkxJTkUgdm9pZCBjbGVhck5vZGVzKCkKCXsKCQltX25vZGVfYXJyYXkuY2xlYXIoKTsKCQltX251bV9ub2RlcyA9IDA7Cgl9CgoJLy8hIG5vZGUgY291bnQKCVNJTURfRk9SQ0VfSU5MSU5FIGludCBnZXROb2RlQ291bnQoKSBjb25zdAoJewoJCXJldHVybiBtX251bV9ub2RlczsKCX0KCgkvLyEgdGVsbHMgaWYgdGhlIG5vZGUgaXMgYSBsZWFmCglTSU1EX0ZPUkNFX0lOTElORSBib29sIGlzTGVhZk5vZGUoaW50IG5vZGVpbmRleCkgY29uc3QKCXsKCQlyZXR1cm4gbV9ub2RlX2FycmF5W25vZGVpbmRleF0uaXNMZWFmTm9kZSgpOwoJfQoKCVNJTURfRk9SQ0VfSU5MSU5FIGludCBnZXROb2RlRGF0YShpbnQgbm9kZWluZGV4KSBjb25zdAoJewoJCXJldHVybiBtX25vZGVfYXJyYXlbbm9kZWluZGV4XS5nZXREYXRhSW5kZXgoKTsKCX0KCglTSU1EX0ZPUkNFX0lOTElORSB2b2lkIGdldE5vZGVCb3VuZChpbnQgbm9kZWluZGV4LCBidEFBQkIgJiBib3VuZCkgY29uc3QKCXsKCQlib3VuZC5tX21pbiA9IGJ0X3VucXVhbnRpemUoCgkJCW1fbm9kZV9hcnJheVtub2RlaW5kZXhdLm1fcXVhbnRpemVkQWFiYk1pbiwKCQkJbV9nbG9iYWxfYm91bmQubV9taW4sbV9idmhRdWFudGl6YXRpb24pOwoKCQlib3VuZC5tX21heCA9IGJ0X3VucXVhbnRpemUoCgkJCW1fbm9kZV9hcnJheVtub2RlaW5kZXhdLm1fcXVhbnRpemVkQWFiYk1heCwKCQkJbV9nbG9iYWxfYm91bmQubV9taW4sbV9idmhRdWFudGl6YXRpb24pOwoJfQoKCVNJTURfRk9SQ0VfSU5MSU5FIHZvaWQgc2V0Tm9kZUJvdW5kKGludCBub2RlaW5kZXgsIGNvbnN0IGJ0QUFCQiAmIGJvdW5kKQoJewoJCWJ0X3F1YW50aXplX2NsYW1wKAltX25vZGVfYXJyYXlbbm9kZWluZGV4XS5tX3F1YW50aXplZEFhYmJNaW4sCgkJCQkJCQlib3VuZC5tX21pbiwKCQkJCQkJCW1fZ2xvYmFsX2JvdW5kLm1fbWluLAoJCQkJCQkJbV9nbG9iYWxfYm91bmQubV9tYXgsCgkJCQkJCQltX2J2aFF1YW50aXphdGlvbik7CgoJCWJ0X3F1YW50aXplX2NsYW1wKAltX25vZGVfYXJyYXlbbm9kZWluZGV4XS5tX3F1YW50aXplZEFhYmJNYXgsCgkJCQkJCQlib3VuZC5tX21heCwKCQkJCQkJCW1fZ2xvYmFsX2JvdW5kLm1fbWluLAoJCQkJCQkJbV9nbG9iYWxfYm91bmQubV9tYXgsCgkJCQkJCQltX2J2aFF1YW50aXphdGlvbik7Cgl9CgoJU0lNRF9GT1JDRV9JTkxJTkUgaW50IGdldExlZnROb2RlKGludCBub2RlaW5kZXgpIGNvbnN0Cgl7CgkJcmV0dXJuIG5vZGVpbmRleCsxOwoJfQoKCVNJTURfRk9SQ0VfSU5MSU5FIGludCBnZXRSaWdodE5vZGUoaW50IG5vZGVpbmRleCkgY29uc3QKCXsKCQlpZihtX25vZGVfYXJyYXlbbm9kZWluZGV4KzFdLmlzTGVhZk5vZGUoKSkgcmV0dXJuIG5vZGVpbmRleCsyOwoJCXJldHVybiBub2RlaW5kZXgrMSArIG1fbm9kZV9hcnJheVtub2RlaW5kZXgrMV0uZ2V0RXNjYXBlSW5kZXgoKTsKCX0KCglTSU1EX0ZPUkNFX0lOTElORSBpbnQgZ2V0RXNjYXBlTm9kZUluZGV4KGludCBub2RlaW5kZXgpIGNvbnN0Cgl7CgkJcmV0dXJuIG1fbm9kZV9hcnJheVtub2RlaW5kZXhdLmdldEVzY2FwZUluZGV4KCk7Cgl9CgoJU0lNRF9GT1JDRV9JTkxJTkUgY29uc3QgQlRfUVVBTlRJWkVEX0JWSF9OT0RFICogZ2V0X25vZGVfcG9pbnRlcihpbnQgaW5kZXggPSAwKSBjb25zdAoJewoJCXJldHVybiAmbV9ub2RlX2FycmF5W2luZGV4XTsKCX0KCgkvLyFAfQp9OwoKCgovLyEgU3RydWN0dXJlIGZvciBjb250YWluaW5nIEJveGVzCi8qIQpUaGlzIGNsYXNzIG9mZmVycyBhbiBzdHJ1Y3R1cmUgZm9yIG1hbmFnaW5nIGEgYm94IHRyZWUgb2YgcHJpbWl0aXZlcy4KUmVxdWlyZXMgYSBQcmltaXRpdmUgcHJvdG90eXBlIChsaWtlIGJ0UHJpbWl0aXZlTWFuYWdlckJhc2UgKQoqLwpjbGFzcyBidEdJbXBhY3RRdWFudGl6ZWRCdmgKewpwcm90ZWN0ZWQ6CglidFF1YW50aXplZEJ2aFRyZWUgbV9ib3hfdHJlZTsKCWJ0UHJpbWl0aXZlTWFuYWdlckJhc2UgKiBtX3ByaW1pdGl2ZV9tYW5hZ2VyOwoKcHJvdGVjdGVkOgoJLy9zdGFja2xlc3MgcmVmaXQKCXZvaWQgcmVmaXQoKTsKcHVibGljOgoKCS8vISB0aGlzIGNvbnN0cnVjdG9yIGRvZXNuJ3QgYnVpbGQgdGhlIHRyZWUuIHlvdSBtdXN0IGNhbGwJYnVpbGRTZXQKCWJ0R0ltcGFjdFF1YW50aXplZEJ2aCgpCgl7CgkJbV9wcmltaXRpdmVfbWFuYWdlciA9IE5VTEw7Cgl9CgoJLy8hIHRoaXMgY29uc3RydWN0b3IgZG9lc24ndCBidWlsZCB0aGUgdHJlZS4geW91IG11c3QgY2FsbAlidWlsZFNldAoJYnRHSW1wYWN0UXVhbnRpemVkQnZoKGJ0UHJpbWl0aXZlTWFuYWdlckJhc2UgKiBwcmltaXRpdmVfbWFuYWdlcikKCXsKCQltX3ByaW1pdGl2ZV9tYW5hZ2VyID0gcHJpbWl0aXZlX21hbmFnZXI7Cgl9CgoJU0lNRF9GT1JDRV9JTkxJTkUgYnRBQUJCIGdldEdsb2JhbEJveCgpICBjb25zdAoJewoJCWJ0QUFCQiB0b3RhbGJveDsKCQlnZXROb2RlQm91bmQoMCwgdG90YWxib3gpOwoJCXJldHVybiB0b3RhbGJveDsKCX0KCglTSU1EX0ZPUkNFX0lOTElORSB2b2lkIHNldFByaW1pdGl2ZU1hbmFnZXIoYnRQcmltaXRpdmVNYW5hZ2VyQmFzZSAqIHByaW1pdGl2ZV9tYW5hZ2VyKQoJewoJCW1fcHJpbWl0aXZlX21hbmFnZXIgPSBwcmltaXRpdmVfbWFuYWdlcjsKCX0KCglTSU1EX0ZPUkNFX0lOTElORSBidFByaW1pdGl2ZU1hbmFnZXJCYXNlICogZ2V0UHJpbWl0aXZlTWFuYWdlcigpIGNvbnN0Cgl7CgkJcmV0dXJuIG1fcHJpbWl0aXZlX21hbmFnZXI7Cgl9CgoKLy8hIG5vZGUgbWFuYWdlciBwcm90b3R5cGUgZnVuY3Rpb25zCi8vL0B7CgoJLy8hIHRoaXMgYXR0ZW1wcyB0byByZWZpdCB0aGUgYm94IHNldC4KCVNJTURfRk9SQ0VfSU5MSU5FIHZvaWQgdXBkYXRlKCkKCXsKCQlyZWZpdCgpOwoJfQoKCS8vISB0aGlzIHJlYnVpbGQgdGhlIGVudGlyZSBzZXQKCXZvaWQgYnVpbGRTZXQoKTsKCgkvLyEgcmV0dXJucyB0aGUgaW5kaWNlcyBvZiB0aGUgcHJpbWl0aXZlcyBpbiB0aGUgbV9wcmltaXRpdmVfbWFuYWdlcgoJYm9vbCBib3hRdWVyeShjb25zdCBidEFBQkIgJiBib3gsIGJ0QWxpZ25lZE9iamVjdEFycmF5PGludD4gJiBjb2xsaWRlZF9yZXN1bHRzKSBjb25zdDsKCgkvLyEgcmV0dXJucyB0aGUgaW5kaWNlcyBvZiB0aGUgcHJpbWl0aXZlcyBpbiB0aGUgbV9wcmltaXRpdmVfbWFuYWdlcgoJU0lNRF9GT1JDRV9JTkxJTkUgYm9vbCBib3hRdWVyeVRyYW5zKGNvbnN0IGJ0QUFCQiAmIGJveCwKCQkgY29uc3QgYnRUcmFuc2Zvcm0gJiB0cmFuc2Zvcm0sIGJ0QWxpZ25lZE9iamVjdEFycmF5PGludD4gJiBjb2xsaWRlZF9yZXN1bHRzKSBjb25zdAoJewoJCWJ0QUFCQiB0cmFuc2JveD1ib3g7CgkJdHJhbnNib3guYXBweV90cmFuc2Zvcm0odHJhbnNmb3JtKTsKCQlyZXR1cm4gYm94UXVlcnkodHJhbnNib3gsY29sbGlkZWRfcmVzdWx0cyk7Cgl9CgoJLy8hIHJldHVybnMgdGhlIGluZGljZXMgb2YgdGhlIHByaW1pdGl2ZXMgaW4gdGhlIG1fcHJpbWl0aXZlX21hbmFnZXIKCWJvb2wgcmF5UXVlcnkoCgkJY29uc3QgYnRWZWN0b3IzICYgcmF5X2Rpcixjb25zdCBidFZlY3RvcjMgJiByYXlfb3JpZ2luICwKCQlidEFsaWduZWRPYmplY3RBcnJheTxpbnQ+ICYgY29sbGlkZWRfcmVzdWx0cykgY29uc3Q7CgoJLy8hIHRlbGxzIGlmIHRoaXMgc2V0IGhhcyBoaWVyYXJjaHQKCVNJTURfRk9SQ0VfSU5MSU5FIGJvb2wgaGFzSGllcmFyY2h5KCkgY29uc3QKCXsKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvLyEgdGVsbHMgaWYgdGhpcyBzZXQgaXMgYSB0cmltZXNoCglTSU1EX0ZPUkNFX0lOTElORSBib29sIGlzVHJpbWVzaCgpICBjb25zdAoJewoJCXJldHVybiBtX3ByaW1pdGl2ZV9tYW5hZ2VyLT5pc190cmltZXNoKCk7Cgl9CgoJLy8hIG5vZGUgY291bnQKCVNJTURfRk9SQ0VfSU5MSU5FIGludCBnZXROb2RlQ291bnQoKSBjb25zdAoJewoJCXJldHVybiBtX2JveF90cmVlLmdldE5vZGVDb3VudCgpOwoJfQoKCS8vISB0ZWxscyBpZiB0aGUgbm9kZSBpcyBhIGxlYWYKCVNJTURfRk9SQ0VfSU5MSU5FIGJvb2wgaXNMZWFmTm9kZShpbnQgbm9kZWluZGV4KSBjb25zdAoJewoJCXJldHVybiBtX2JveF90cmVlLmlzTGVhZk5vZGUobm9kZWluZGV4KTsKCX0KCglTSU1EX0ZPUkNFX0lOTElORSBpbnQgZ2V0Tm9kZURhdGEoaW50IG5vZGVpbmRleCkgY29uc3QKCXsKCQlyZXR1cm4gbV9ib3hfdHJlZS5nZXROb2RlRGF0YShub2RlaW5kZXgpOwoJfQoKCVNJTURfRk9SQ0VfSU5MSU5FIHZvaWQgZ2V0Tm9kZUJvdW5kKGludCBub2RlaW5kZXgsIGJ0QUFCQiAmIGJvdW5kKSAgY29uc3QKCXsKCQltX2JveF90cmVlLmdldE5vZGVCb3VuZChub2RlaW5kZXgsIGJvdW5kKTsKCX0KCglTSU1EX0ZPUkNFX0lOTElORSB2b2lkIHNldE5vZGVCb3VuZChpbnQgbm9kZWluZGV4LCBjb25zdCBidEFBQkIgJiBib3VuZCkKCXsKCQltX2JveF90cmVlLnNldE5vZGVCb3VuZChub2RlaW5kZXgsIGJvdW5kKTsKCX0KCgoJU0lNRF9GT1JDRV9JTkxJTkUgaW50IGdldExlZnROb2RlKGludCBub2RlaW5kZXgpIGNvbnN0Cgl7CgkJcmV0dXJuIG1fYm94X3RyZWUuZ2V0TGVmdE5vZGUobm9kZWluZGV4KTsKCX0KCglTSU1EX0ZPUkNFX0lOTElORSBpbnQgZ2V0UmlnaHROb2RlKGludCBub2RlaW5kZXgpIGNvbnN0Cgl7CgkJcmV0dXJuIG1fYm94X3RyZWUuZ2V0UmlnaHROb2RlKG5vZGVpbmRleCk7Cgl9CgoJU0lNRF9GT1JDRV9JTkxJTkUgaW50IGdldEVzY2FwZU5vZGVJbmRleChpbnQgbm9kZWluZGV4KSBjb25zdAoJewoJCXJldHVybiBtX2JveF90cmVlLmdldEVzY2FwZU5vZGVJbmRleChub2RlaW5kZXgpOwoJfQoKCVNJTURfRk9SQ0VfSU5MSU5FIHZvaWQgZ2V0Tm9kZVRyaWFuZ2xlKGludCBub2RlaW5kZXgsYnRQcmltaXRpdmVUcmlhbmdsZSAmIHRyaWFuZ2xlKSBjb25zdAoJewoJCW1fcHJpbWl0aXZlX21hbmFnZXItPmdldF9wcmltaXRpdmVfdHJpYW5nbGUoZ2V0Tm9kZURhdGEobm9kZWluZGV4KSx0cmlhbmdsZSk7Cgl9CgoKCVNJTURfRk9SQ0VfSU5MSU5FIGNvbnN0IEJUX1FVQU5USVpFRF9CVkhfTk9ERSAqIGdldF9ub2RlX3BvaW50ZXIoaW50IGluZGV4ID0gMCkgY29uc3QKCXsKCQlyZXR1cm4gbV9ib3hfdHJlZS5nZXRfbm9kZV9wb2ludGVyKGluZGV4KTsKCX0KCgoJc3RhdGljIGZsb2F0IGdldEF2ZXJhZ2VUcmVlQ29sbGlzaW9uVGltZSgpOwoKCglzdGF0aWMgdm9pZCBmaW5kX2NvbGxpc2lvbihidEdJbXBhY3RRdWFudGl6ZWRCdmggKiBib3hzZXQxLCBjb25zdCBidFRyYW5zZm9ybSAmIHRyYW5zMSwKCQlidEdJbXBhY3RRdWFudGl6ZWRCdmggKiBib3hzZXQyLCBjb25zdCBidFRyYW5zZm9ybSAmIHRyYW5zMiwKCQlidFBhaXJTZXQgJiBjb2xsaXNpb25fcGFpcnMpOwp9OwoKCiNlbmRpZiAvLyBHSU1fQk9YUFJVTklOR19IX0lOQ0xVREVECg==