I2lmbmRlZiBCVF9RVUFOVElaQVRJT05fSF9JTkNMVURFRAojZGVmaW5lIEJUX1FVQU5USVpBVElPTl9IX0lOQ0xVREVECgovKiEgXGZpbGUgYnRRdWFudGl6YXRpb24uaAoqXGF1dGhvciBGcmFuY2lzY28gTGV/biBO32plcmEKCiovCi8qClRoaXMgc291cmNlIGZpbGUgaXMgcGFydCBvZiBHSU1QQUNUIExpYnJhcnkuCgpGb3IgdGhlIGxhdGVzdCBpbmZvLCBzZWUgaHR0cDovL2dpbXBhY3Quc291cmNlZm9yZ2UubmV0LwoKQ29weXJpZ2h0IChjKSAyMDA3IEZyYW5jaXNjbyBMZW9uIE5hamVyYS4gQy5DLiA4MDA4NzM3MS4KZW1haWw6IHByb2plY3RpbGVtYW5AeWFob28uY29tCgoKVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCkluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuClBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAppbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0IGZyZWVseSwKc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKCjEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90IGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZSBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgoyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCjMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCiovCgojaW5jbHVkZSAiTGluZWFyTWF0aC9idFRyYW5zZm9ybS5oIgoKCgoKCgpTSU1EX0ZPUkNFX0lOTElORSB2b2lkIGJ0X2NhbGNfcXVhbnRpemF0aW9uX3BhcmFtZXRlcnMoCglidFZlY3RvcjMgJiBvdXRNaW5Cb3VuZCwKCWJ0VmVjdG9yMyAmIG91dE1heEJvdW5kLAoJYnRWZWN0b3IzICYgYnZoUXVhbnRpemF0aW9uLAoJY29uc3QgYnRWZWN0b3IzJiBzcmNNaW5Cb3VuZCxjb25zdCBidFZlY3RvcjMmIHNyY01heEJvdW5kLAoJYnRTY2FsYXIgcXVhbnRpemF0aW9uTWFyZ2luKQp7CgkvL2VubGFyZ2UgdGhlIEFBQkIgdG8gYXZvaWQgZGl2aXNpb24gYnkgemVybyB3aGVuIGluaXRpYWxpemluZyB0aGUgcXVhbnRpemF0aW9uIHZhbHVlcwoJYnRWZWN0b3IzIGNsYW1wVmFsdWUocXVhbnRpemF0aW9uTWFyZ2luLHF1YW50aXphdGlvbk1hcmdpbixxdWFudGl6YXRpb25NYXJnaW4pOwoJb3V0TWluQm91bmQgPSBzcmNNaW5Cb3VuZCAtIGNsYW1wVmFsdWU7CglvdXRNYXhCb3VuZCA9IHNyY01heEJvdW5kICsgY2xhbXBWYWx1ZTsKCWJ0VmVjdG9yMyBhYWJiU2l6ZSA9IG91dE1heEJvdW5kIC0gb3V0TWluQm91bmQ7CglidmhRdWFudGl6YXRpb24gPSBidFZlY3RvcjMoYnRTY2FsYXIoNjU1MzUuMCksCgkJCQkJCQkJYnRTY2FsYXIoNjU1MzUuMCksCgkJCQkJCQkJYnRTY2FsYXIoNjU1MzUuMCkpIC8gYWFiYlNpemU7Cn0KCgpTSU1EX0ZPUkNFX0lOTElORSB2b2lkIGJ0X3F1YW50aXplX2NsYW1wKAoJdW5zaWduZWQgc2hvcnQqIG91dCwKCWNvbnN0IGJ0VmVjdG9yMyYgcG9pbnQsCgljb25zdCBidFZlY3RvcjMgJiBtaW5fYm91bmQsCgljb25zdCBidFZlY3RvcjMgJiBtYXhfYm91bmQsCgljb25zdCBidFZlY3RvcjMgJiBidmhRdWFudGl6YXRpb24pCnsKCglidFZlY3RvcjMgY2xhbXBlZFBvaW50KHBvaW50KTsKCWNsYW1wZWRQb2ludC5zZXRNYXgobWluX2JvdW5kKTsKCWNsYW1wZWRQb2ludC5zZXRNaW4obWF4X2JvdW5kKTsKCglidFZlY3RvcjMgdiA9IChjbGFtcGVkUG9pbnQgLSBtaW5fYm91bmQpICogYnZoUXVhbnRpemF0aW9uOwoJb3V0WzBdID0gKHVuc2lnbmVkIHNob3J0KSh2LmdldFgoKSswLjVmKTsKCW91dFsxXSA9ICh1bnNpZ25lZCBzaG9ydCkodi5nZXRZKCkrMC41Zik7CglvdXRbMl0gPSAodW5zaWduZWQgc2hvcnQpKHYuZ2V0WigpKzAuNWYpOwp9CgoKU0lNRF9GT1JDRV9JTkxJTkUgYnRWZWN0b3IzIGJ0X3VucXVhbnRpemUoCgljb25zdCB1bnNpZ25lZCBzaG9ydCogdmVjSW4sCgljb25zdCBidFZlY3RvcjMgJiBvZmZzZXQsCgljb25zdCBidFZlY3RvcjMgJiBidmhRdWFudGl6YXRpb24pCnsKCWJ0VmVjdG9yMwl2ZWNPdXQ7Cgl2ZWNPdXQuc2V0VmFsdWUoCgkJKGJ0U2NhbGFyKSh2ZWNJblswXSkgLyAoYnZoUXVhbnRpemF0aW9uLmdldFgoKSksCgkJKGJ0U2NhbGFyKSh2ZWNJblsxXSkgLyAoYnZoUXVhbnRpemF0aW9uLmdldFkoKSksCgkJKGJ0U2NhbGFyKSh2ZWNJblsyXSkgLyAoYnZoUXVhbnRpemF0aW9uLmdldFooKSkpOwoJdmVjT3V0ICs9IG9mZnNldDsKCXJldHVybiB2ZWNPdXQ7Cn0KCgoKI2VuZGlmIC8vIEdJTV9WRUNUT1JfSF9JTkNMVURFRAo=