LyoNCiAqIFByb2plY3Q6IFZpektpdA0KICogVmVyc2lvbjogMS45DQogDQogKiBEYXRlOiAyMDA3MDUwMw0KICogRmlsZTogRGlzcGxheVJlc29sdXRpb25QYW5lLmgNCiAqDQogKi8NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KDQpDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNyBIZWlrbyBXaWNobWFubiAoaHR0cDovL3d3dy5pbWFnb21hdC5kZS92aXpraXQpDQoNCg0KVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzZWQgb3IgaW1wbGllZCB3YXJyYW50eS4NCkluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzDQphcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLg0KDQpQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwNCmluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQNCmZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoNCg0KMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOw0KICAgeW91IG11c3Qgbm90IGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4NCiAgIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50DQogICBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlIGFwcHJlY2lhdGVkDQogICBidXQgaXMgbm90IHJlcXVpcmVkLg0KDQoyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsDQogICBhbmQgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLg0KDQozLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLg0KDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaWYgIWRlZmluZWQoQUZYX0RJU1BMQVlSRVNPTFVUSU9OUEFORV9IX19FNjQ4NkE4M18yOUMxXzRGN0VfODREOV9ENEM4MDM3Q0JFQTRfX0lOQ0xVREVEXykNCiNkZWZpbmUgQUZYX0RJU1BMQVlSRVNPTFVUSU9OUEFORV9IX19FNjQ4NkE4M18yOUMxXzRGN0VfODREOV9ENEM4MDM3Q0JFQTRfX0lOQ0xVREVEXw0KDQojaWYgX01TQ19WRVIgPiAxMDAwDQojcHJhZ21hIG9uY2UNCiNlbmRpZiAvLyBfTVNDX1ZFUiA+IDEwMDANCg0KDQojaW5jbHVkZSAicmVzb3VyY2UuaCINCiNpbmNsdWRlIDxTdGRBZnguaD4NCg0KbmFtZXNwYWNlIFZpektpdCB7DQoNCgkvKioNCgkgKiBVSSAoV2luZG93cyk6IFBhbmUgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBwb3NzaWJsZSBkaXNwbGF5IHJlc29sdXRpb25zLg0KCSAqLw0KCWNsYXNzIENEaXNwbGF5UmVzb2x1dGlvblBhbmUgOiBwdWJsaWMgQ1Byb3BlcnR5UGFnZSB7DQoNCglERUNMQVJFX0RZTkNSRUFURShDRGlzcGxheVJlc29sdXRpb25QYW5lKQ0KDQoJcHVibGljOg0KDQoJCS8qKiBUaGUgY29uc3RydWN0b3IuICovDQoJCUNEaXNwbGF5UmVzb2x1dGlvblBhbmUoKTsNCg0KCQkvKiogVGhlIGRlc3RydWN0b3IuICovDQoJCX5DRGlzcGxheVJlc29sdXRpb25QYW5lKCk7DQoNCgkJLy97e0FGWF9EQVRBKENEaXNwbGF5UmVzb2x1dGlvblBhbmUpDQovLwkJZW51bSB7IElERCA9IElERF9ESUFMT0czIH07DQoJCQkvLw0KCQkvL319QUZYX0RBVEENCg0KCQkvL3t7QUZYX1ZJUlRVQUwoQ0Rpc3BsYXlSZXNvbHV0aW9uUGFuZSkNCgkJLyoqDQoJCSAqIENhbGxlZCB3aGVuIHBhbmUgYmVjb21lcyBhY3RpdmUuDQoJCSAqIEByZXR1cm4gVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLg0KCQkgKi8NCgkJdmlydHVhbCBCT09MIE9uU2V0QWN0aXZlKCk7DQoJDQoJcHJvdGVjdGVkOg0KDQoJCS8qKg0KCQkgKiBFeGNoYW5nZSBvZiBkYXRhIChERFgvRERWKS4NCgkJICogQHBhcmFtIHBEWCBQb2ludGVyIHRvIGRhdGEuDQoJCSAqLw0KCQl2aXJ0dWFsIHZvaWQgRG9EYXRhRXhjaGFuZ2UoQ0RhdGFFeGNoYW5nZSogcERYKTsNCgkJLy99fUFGWF9WSVJUVUFMDQoNCgkJLy97e0FGWF9NU0coQ0Rpc3BsYXlSZXNvbHV0aW9uUGFuZSkNCgkJLyoqDQoJCSAqIENhbGxlZCB3aGVuIHZhbHVlIG9mIGRyb3Bkb3duIG1lbnUgY2hhbmdlZC4NCgkJICovDQoJCWFmeF9tc2cgdm9pZCBPblNlbGNoYW5nZUNvbWJvMSgpOw0KDQoJCS8qKg0KCQkgKiBDYWxsZWQgd2hlbiBwYW5lIGlzIGluaXRpYWxpemVkLg0KCQkgKiBAcmV0dXJuIFRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZS4NCgkJICovDQoJCXZpcnR1YWwgQk9PTCBPbkluaXREaWFsb2coKTsNCg0KCQkvL319QUZYX01TRw0KCQlERUNMQVJFX01FU1NBR0VfTUFQKCkNCg0KCX07DQoNCn0NCg0KLy97e0FGWF9JTlNFUlRfTE9DQVRJT059fQ0KLy8gTWljcm9zb2Z0IFZpc3VhbCBDKysgZvxndCB1bm1pdHRlbGJhciB2b3IgZGVyIHZvcmhlcmdlaGVuZGVuIFplaWxlIHp1c+R0emxpY2hlIERla2xhcmF0aW9uZW4gZWluLg0KDQojZW5kaWYgLy8gQUZYX0RJU1BMQVlSRVNPTFVUSU9OUEFORV9IX19FNjQ4NkE4M18yOUMxXzRGN0VfODREOV9ENEM4MDM3Q0JFQTRfX0lOQ0xVREVEXw0K