LyoKICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KICoKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCiAqIGNvcGllcy4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAogKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCiAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCiAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgovKgogKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgogKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCiAqLwoKI2lmICFkZWZpbmVkKCBfX1dMQU5fUUNUX1BBTF9QQUNLRVRfSCApCiNkZWZpbmUgX19XTEFOX1FDVF9QQUxfUEFDS0VUX0gKCi8qKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAKICBcZmlsZSAgd2xhbl9xY3RfcGFsX3BhY2tldC5oCiAgCiAgXGJyaWVmIGRlZmluZSBQQUwgcGFja2V0LiB3cHQgPSAoV2xhbiBQYWwgVHlwZSkKICAgICAgICAgICAgICAgCiAgIERlZmluaXRpb25zIGZvciBwbGF0Zm9ybSBpbmRlcGVuZGVudC4KICAKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKI2luY2x1ZGUgIndsYW5fcWN0X3BhbF90eXBlLmgiCiNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfc3RhdHVzLmgiCiNpbmNsdWRlICJ2b3NfdHlwZXMuaCIKI2lmZGVmIEZFQVRVUkVfV0xBTl9ESUFHX1NVUFBPUlQKI2luY2x1ZGUgInZvc19kaWFnX2NvcmVfbG9nLmgiCiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICovCgovLyBUaGUgc2l6ZSBvZiB0aGUgZGF0YSBidWZmZXIgaW4gdm9zL3BhbCBwYWNrZXRzCi8vIEV4cGxhbmF0aW9uOgovLyBNVFUgc2l6ZSAgPSAxNTAwIGJ5dGVzCi8vIE1heCBudW1iZXIgb2YgQkQvUERVcyByZXF1aXJlZCB0byBob2xkIHBheWxvYWQgb2YgMTUwMCA9Ci8vICAgMTIgUERVcyAoMTI0IGJ5dGVzIGVhY2gpICsgMSBCRCAoMTIgYnl0ZXMgZm9yIHBheWxvYWQpID0KLy8gICAxMyBCRC9QRFVzID0gMTMgeCAxMjggPSAxNjY0IGJ5dGVzCi8vCi8vIEluIGNhc2Ugb2YgQS1NU0RVIHdpdGggZWFjaCBNU0RVIGhhdmluZyBwYXlsb2FkIG9mIDE1MDAgYnl0ZXM6Ci8vICAgMXN0IE1TRFUgPSByZXF1aXJlcyAxMyBCRC9QRFVzIGFzIHBlciB0aGUgYWJvdmUgZXF1YXRpb24uCi8vICAgMm5kIE1TRFUgPSBIVyBpbnNlcnRzIGFuIGV4dHJhIEJEIHRvIGhvbGQgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSAybmQKLy8gICBNU0RVIGFuZCB0aGUgcGF5bG9hZCBwb3J0aW9uIG9mIHRoaXMgQkQgaXMgdW51c2VkIHdoaWNoIG1lYW5zIHRvIGNvdmVyCi8vICAgMTUwMCBieXRlcyB3ZSByZXF1aXJlIDEzIFBEVXMuCi8vICAgU28gMTMgUERVcyArIDEgQkQgPSAxNCBCRC9QRFVzID0gMTc5MiBieXRlcy4KLy8KLy8gSE9XRVZFUgovLyBJbiBjYXNlIG9mIEEtTVNEVSB3aXRoIGVycm9ycywgdGhlIEFEVSB3aWxsIHB1c2ggdG8gdGhlIGhvc3QgdXAgdG8KLy8gMjM0NiBieXRlcy4gIElmIHRoYXQgaXMgdGhlIDJuZCBvciBsYXRlciBNU0RVIHRoZSB3b3JzdCBjYXNlIGlzOgovLyAgIDEgUHJlcGVuZGVkIEJEL1BEVQovLyAgIDEgQkQvUERVIGNvbnRhaW5pbmcgdGhlIDFzdCA0IGJ5dGVzIG9mIHRoZSBkZWxpbWl0ZXIKLy8gICAxIEJEL1BEVSBjb250YWluaW5nIHRoZSBsYXN0IDEwIGJ5dGVzIG9mIHRoZSBkZWxpbWl0ZXIKLy8gICAgIHBsdXMgdGhlIGZpcnN0IDExNCBvZiB0aGUgcGF5bG9hZAovLyAgIDE4IEJEL1BEVXMgY29udGFpbmluZyB0aGUgcmVtYWluaW5nIDIyMzIgYnl0ZXMgb2YgdGhlIHBheWxvYWQKLy8gICAgIDIzNDYgLSAxMTQgPSAyMjMyOyAyMjMyIC8gMTI0ID0gMTgKLy8gICBTbyAyMSBCRC9QRFVzIGFyZSByZXF1aXJlZAoKLy9UaGUgc2l6ZSBvZiBBTVNEVSBmcmFtZSBwZXIgc3BlYyBjYW4gYmUgYSBtYXggb2YgMzgzOSBieXRlcyAKLy8gaW4gQkQvUERVcyB0aGF0IG1lYW5zIDMwIChvbmUgQkQgPSAxMjggYnl0ZXMpIAovLyB3ZSBtdXN0IGFkZCB0aGUgc2l6ZSBvZiB0aGUgODAyLjExIGhlYWRlciB0byB0aGF0IAojZGVmaW5lIFZQS1RfU0laRV9CVUZGRVIgICgoMzAgKiAxMjgpICsgMzIpCgovKiBUcmFuc3BvcnQgY2hhbm5lbCBjb3VudCB0byByZXBvcnQgRElBRyAqLwojZGVmaW5lIFdQVF9OVU1fVFJQVF9DSEFOTkVMICAgICAgOAovKiBUcmFuc3BvcnQgY2hhbm5lbCBuYW1lIHN0cmluZyBzaXplICovCiNkZWZpbmUgV1BUX1RSUFRfQ0hBTk5FTF9OQU1FICAgICA0Cgp0eXBlZGVmIGVudW0KewogICAvLy9QYWNrZXQgaXMgdXNlZCB0byB0cmFuc21pdCA4MDIuMTEgTWFuYWdlbWVudCBmcmFtZXMuCiAgIGVXTEFOX1BBTF9QS1RfVFlQRV9UWF84MDJfMTFfTUdNVCwKICAgLy8vUGFja2V0IGlzIHVzZWQgdG8gdHJhbnNtaXQgODAyLjExIERhdGEgZnJhbWVzLgogICBlV0xBTl9QQUxfUEtUX1RZUEVfVFhfODAyXzExX0RBVEEsCiAgIC8vL1BhY2tldCBpcyB1c2VkIHRvIHRyYW5zbWl0IDgwMi4zIERhdGEgZnJhbWVzLgogICBlV0xBTl9QQUxfUEtUX1RZUEVfVFhfODAyXzNfREFUQSwKICAgLy8vUGFja2V0IGNvbnRhaW5zIFJlY2VpdmVkIGRhdGEgb2YgYW4gdW5rbm93biBmcmFtZSB0eXBlCiAgIGVXTEFOX1BBTF9QS1RfVFlQRV9SWF9SQVcKfSB3cHRfcGFja2V0X3R5cGU7CgoKdHlwZWRlZiBzdHJ1Y3Qgc3dwdF9wYWNrZXQKewogICAvKgogICBQb2ludGVyIHRvIGEgYnVmZmVyIGZvciBCRCBmb3IgVFggcGFja2V0cwogICBGb3IgUlggcGFja2V0cy4gVGhlIHBCRCBNVVNUIHNldCB0byBOVUxMLgogICBQQUwgcGFja2V0IHNoYWxsIHNldCB0aGUgcG9pbnRlciBwb2ludCB0byB0aGUgc3RhcnQgb2YgdGhlIGZsYXQgYnVmZmVyCiAgIHdoZXJlIHRoZSBCRCBzdGFydHMuCiAgICovCiAgIHZvaWQgKnBCRDsKICAgLy9QaHlzaWNhbCBhZGRyZXNzIGZvciBwQkQgZm9yIERNQS1hYmxlIGRldmljZXMKICAgdm9pZCAqcEJEUGh5czsgCiAgIC8vT1MgZGVwZW5kZW50IHN0cnVjdXRyZSB1c2VkIG9ubHkgYnkgT1Mgc3BlY2lmaWMgY29kZS4KICAgdm9pZCAqcE9TU3RydWN0OyAgCiAgIHZvaWQgKnBrdE1ldGFJbmZvOwogICB3cHRfcGFja2V0X3R5cGUgcGt0VHlwZTsKICAgLy9UaGUgbnVtYmVyIG9mIGJ5dGVzIHBCRCB1c2VzLiBJdCBNVVNUIGJlIHNldCB0byAwIGZvciBSWCBwYWNrZXRzCiAgIHdwdF91aW50MTYgQkRMZW5ndGg7CgogICAvL0ludGVybmFsIGRhdGEgZm9yIFBBTCBwYWNrZXQgaW1wbGVtZW50YXRpb24gdXNhZ2Ugb25seQogICB2b2lkICpwSW50ZXJuYWxEYXRhOyAKfSB3cHRfcGFja2V0OwoKdHlwZWRlZiBzdHJ1Y3Qgc3dwdF9pdGVyYXRvcgp7CiAgIHZvaWQgKnBOZXh0OyAgCiAgIHZvaWQgKnBDdXI7CiAgIHZvaWQgKnBDb250ZXh0Owp9IHdwdF9pdGVyYXRvcjsKCi8qIEVhY2ggc3BlY2lmaWMgY2hhbm5lbCBkZWRpY2F0ZWQgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGxvZ2dlZCAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgIGNoYXIgICAgICAgICBjaGFubmVsTmFtZVtXUFRfVFJQVF9DSEFOTkVMX05BTUVdOwogICB2X1UzMl90ICAgICAgbnVtRGVzYzsKICAgdl9VMzJfdCAgICAgIG51bUZyZWVEZXNjOwogICB2X1UzMl90ICAgICAgbnVtUnN2ZERlc2M7CiAgIHZfVTMyX3QgICAgICBoZWFkRGVzY09yZGVyOwogICB2X1UzMl90ICAgICAgdGFpbERlc2NPcmRlcjsKICAgdl9VMzJfdCAgICAgIGN0cmxSZWdWYWw7CiAgIHZfVTMyX3QgICAgICBzdGF0UmVnVmFsOwogICB2X1UzMl90ICAgICAgbnVtVmFsRGVzYzsKICAgdl9VMzJfdCAgICAgIG51bUludmFsRGVzYzsKfSB3cHRfbG9nX2RhdGFfc3RhbGxfY2hhbm5lbF90eXBlOwoKLyogVHJhbnNwb3J0IGxvZyBjb250ZXh0ICovCnR5cGVkZWYgc3RydWN0CnsKICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgUG93ZXJTdGF0ZTsKICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJlZUJkOwogICB3cHRfbG9nX2RhdGFfc3RhbGxfY2hhbm5lbF90eXBlICBkeGVDaGFubmVsSW5mb1tXUFRfTlVNX1RSUFRfQ0hBTk5FTF07Cn0gd3B0X2xvZ19kYXRhX3N0YWxsX3R5cGU7CgoKLy9wUGt0IGlzIGEgcG9pbnRlciB0byB3cHRfcGFja2V0CiNkZWZpbmUgV1BBTF9QQUNLRVRfU0VUX0JEX1BPSU5URVIocFBrdCwgcEJkKSAgICggKHBQa3QpLT5wQkQgPSAocEJkKSApCiNkZWZpbmUgV1BBTF9QQUNLRVRfR0VUX0JEX1BPSU5URVIocFBrdCkgICggKHBQa3QpLT5wQkQgKQovL0FjY2VzcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBCRAojZGVmaW5lIFdQQUxfUEFDS0VUX1NFVF9CRF9QSFlTKHBQa3QsIHBCZFBoeXMpICAgKCAocFBrdCktPnBCRFBoeXMgPSAocEJkUGh5cykgKQojZGVmaW5lIFdQQUxfUEFDS0VUX0dFVF9CRF9QSFlTKHBQa3QpICAoIChwUGt0KS0+cEJEUGh5cyApCiNkZWZpbmUgV1BBTF9QQUNLRVRfU0VUX0JEX0xFTkdUSChwUGt0LCBsZW4pICAgKCAocFBrdCktPkJETGVuZ3RoID0gKGxlbikgKQojZGVmaW5lIFdQQUxfUEFDS0VUX0dFVF9CRF9MRU5HVEgocFBrdCkgICggKHBQa3QpLT5CRExlbmd0aCApCiNkZWZpbmUgV1BBTF9QQUNLRVRfU0VUX01FVEFJTkZPX1BPSU5URVIocFBrdCwgcCkgKCAocFBrdCktPnBrdE1ldGFJbmZvID0gKHApICkKI2RlZmluZSBXUEFMX1BBQ0tFVF9HRVRfTUVUQUlORk9fUE9JTlRFUihwUGt0KSAoIChwUGt0KS0+cGt0TWV0YUluZm8gKQojZGVmaW5lIFdQQUxfUEFDS0VUX1NFVF9UWVBFKHBQa3QsIHR5cGUpICAoIChwUGt0KS0+cGt0VHlwZSA9ICh0eXBlKSApCiNkZWZpbmUgV1BBTF9QQUNLRVRfR0VUX1RZUEUocFBrdCkgICggKHBQa3QpLT5wa3RUeXBlICkKI2RlZmluZSBXUEFMX1BBQ0tFVF9TRVRfT1NfU1RSVUNUX1BPSU5URVIocFBrdCwgcFN0cnVjdCkgICAoIChwUGt0KS0+cE9TU3RydWN0ID0gKHBTdHJ1Y3QpICkKI2RlZmluZSBXUEFMX1BBQ0tFVF9HRVRfT1NfU1RSVUNUX1BPSU5URVIocFBrdCkgICggKHBQa3QpLT5wT1NTdHJ1Y3QgKQojZGVmaW5lIFdQQUxfUEFDS0VUX0lTX0ZMQVRfQlVGKHBrdFR5cGUpICggKGVXTEFOX1BBTF9QS1RfVFlQRV9SWF9SQVcgPT0gKHBrdFR5cGUpKSB8fCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZVdMQU5fUEFMX1BLVF9UWVBFX1RYXzgwMl8xMV9NR01UID09IChwa3RUeXBlKSkgKQoKLyogUlggUkFXIHBhY2tldCBhbGxvYyBmYWlsIGR1ZSB0byBvdXQgb2YgcmVzb3VyY2UgQ0IgZnVuY3Rpb24gdHlwZSAqLwp0eXBlZGVmIHZvaWQgKCAqd3BhbFBhY2tldExvd1BhY2tldENCICkoIHdwdF9wYWNrZXQgKnBQYWNrZXQsIHZvaWQgKnVzckRhdGEgKTsKCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbFBhY2tldEluaXQgliBJbml0aWFsaXplIGFsbCB3cHRfcGFja2V0IHJlbGF0ZWQgb2JqZWN0cy4gQWxsb2NhdGUgbWVtb3J5IGZvciB3cHRfcGFja2V0LiAKICAgIEFsbG9jYXRlIG1lbW9yeSBmb3IgVFggbWFuYWdlbWVudCBmcmFtZXMgYW5kIFJYIGZyYW1lcy4KICAgIEZvciBvdXIgbGVnYWN5IFVNQUMsIGl0IGlzIG5vdCBuZWVkZWQgYmVjYXVzZSB2b3NfcGFja2V0IGNvbnRhaW5zIHdwdF9wYWNrZXQuCiAgICBQYXJhbTogCiAgICAgICAgcFBhbENvbnRleHQgliBBIGNvbnRleHQgUEFMIHVzZXM/PwogICAgUmV0dXJuOgogICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtLSBzdWNjZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9zdGF0dXMgd3BhbFBhY2tldEluaXQodm9pZCAqcFBhbENvbnRleHQpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxQYWNrZXRDbG9zZSCWIEZyZWUgYWxsIGFsbG9jYXRlZCByZXNvdXJjZSBieSB3cGFsUGFja2V0SW5pdC4KICAgIEZvciBvdXIgbGVnYWN5IFVNQUMsIGl0IGlzIG5vdCBuZWVkZWQgYmVjYXVzZSB2b3NfcGFja2V0IGNvbnRhaW5zIHBhbF9wYWNrZXQuCiAgICBQYXJhbTogCiAgICAgICAgcFBhbENvbnRleHQgliBBIGNvbnRleHQgUEFMIHVzZXM/PwogICAgUmV0dXJuOgogICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtLSBzdWNjZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9zdGF0dXMgd3BhbFBhY2tldENsb3NlKHZvaWQgKnBQYWxDb250ZXh0KTsKCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbFBhY2tldEFsbG9jIJYgQWxsb2NhdGUgYSB3cHRfcGFja2V0IGZyb20gUEFMLgogICAgUGFyYW06IAogICAgICAgIHBQYWxDb250ZXh0IJYgQSBjb250ZXh0IFBBTCB1c2VzPz8KICAgICAgICBwa3RUeXBlIJYgc3BlY2lmeSB0aGUgdHlwZSBvZiB3cHRfcGFja2V0IHRvIGFsbG9jYXRlCiAgICAgICAgblBrdFNpemUgLSBzcGVjaWZ5IHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHBhY2tldCBidWZmZXIuCiAgICBSZXR1cm46CiAgICAgICAgQSBwb2ludGVyIHRvIHRoZSB3cHRfcGFja2V0LiBOVUxMIG1lYW5zIGZhaWwuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9wYWNrZXQgKiB3cGFsUGFja2V0QWxsb2Mod3B0X3BhY2tldF90eXBlIHBrdFR5cGUsIHdwdF91aW50MzIgblBrdFNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3BhbFBhY2tldExvd1BhY2tldENCIHJ4TG93Q0IsIHZvaWQgKnVzcmRhdGEpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxQYWNrZXRGcmVlIJYgRnJlZSBhIHdwdF9wYWNrZXQgY2hhaW4gZm9yIG9uZSBwYXJ0aWN1bGFyIHR5cGUuCiAgICBQYWNrZXQgdHlwZSBpcyBjYXJyaWVkIGluIHdwdF9wYWNrZXQgc3RydWN0dXJlLgogICAgUGFyYW06IAogICAgICAgIHBQYWxDb250ZXh0IJYgQSBjb250ZXh0IFBBTCB1c2VzPz8KICAgICAgICBwUGt0IC0gcG9pbnRlciB0byBhIHBhY2tldCB0byBiZSBmcmVlZC4KICAgIFJldHVybjoKICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSBzdWNjZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9zdGF0dXMgd3BhbFBhY2tldEZyZWUod3B0X3BhY2tldCAqcFBrdCk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbFBhY2tldEdldExlbmd0aCCWIEdldCBudW1iZXIgb2YgYnl0ZXMgaW4gYSB3cHRfcGFja2V0LgogICAgUGFyYW06IAogICAgICAgIHBQYWxDb250ZXh0IJYgUEFMIGNvbnRleHQgcmV0dXJuZWQgZnJvbSBQQUwgb3BlbgogICAgICAgIHBQa3QgLSBwb2ludGVyIHRvIGEgcGFja2V0IHRvIGJlIGZyZWVkLgogICAgUmV0dXJuOgogICAgICAgIExlbmd0aCBvZiB0aGUgZGF0YSBpbmNsdWRlIGxheWVyLTIgaGVhZGVycy4gRm9yIGV4YW1wbGUsIGlmIHRoZSBmcmFtZSBpcyA4MDIuMywgCiAgICAgICAgdGhlIGxlbmd0aCBpbmNsdWRlcyB0aGUgZXRoZXJuZXQgaGVhZGVyLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfdWludDMyIHdwYWxQYWNrZXRHZXRMZW5ndGgod3B0X3BhY2tldCAqcFBrdCk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbFBhY2tldFJhd1RyaW1IZWFkIJYgTW92ZSB0aGUgc3RhcnRpbmcgb2Zmc2V0IGFuZCByZWR1Y2UgcGFja2V0IGxlbmd0aC4KICAgICAgICAgIFRoZSBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIHdpdGggcmF3IHBhY2tldHMsCiAgICAgICAgICB3aG9zZSBidWZmZXIgaXMgb25lIHBpZWNlIGFuZCBhbGxvY2F0ZWQgYnkgV0xBTiBkcml2ZXIuIAogICAgUGFyYW06IAogICAgICAgIHBQa3QgLSBwb2ludGVyIHRvIGEgd3B0X3BhY2tldC4KICAgICAgICBzaXplIJYgbnVtYmVyIG9mIGJ5dGVzIHRvIHRha2Ugb2ZmIHRoZSBoZWFkLgogICAgUmV0dXJuOgogICAgICAgIGVXUEFMX1NUQVRVU19TVUNDRVNTIC0gc3VjY2Vzcy4gRmFpbCBvdGhlcndpc2UuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9zdGF0dXMgd3BhbFBhY2tldFJhd1RyaW1IZWFkKHdwdF9wYWNrZXQgKnBQa3QsIHdwdF91aW50MzIgc2l6ZSk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbFBhY2tldFJhd1RyaW1UYWlsIJYgcmVkdWNlIHRoZSBsZW5ndGggb2YgdGhlIHBhY2tldC4gVGhlIGZ1bmN0aW9uIGNhbiAKICAgICAgICAgIG9ubHkgYmUgdXNlZCB3aXRoIHJhdyBwYWNrZXRzLCB3aG9zZSBidWZmZXIgaXMgb25lIHBpZWNlIGFuZCAKICAgICAgICAgIGFsbG9jYXRlZCBieSBXTEFOIGRyaXZlci4gVGhpcyBhbHNvIHJlZHVjZSB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQuCiAgICBQYXJhbTogCiAgICAgICAgcFBrdCAtIHBvaW50ZXIgdG8gYSB3cHRfcGFja2V0LgogICAgICAgIHNpemUgliBudW1iZXIgb2YgYnl0ZXMgdG8gdGFrZSBvZiB0aGUgcGFja2V0IGxlbmd0aAogICAgUmV0dXJuOgogICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyCWIHN1Y2Nlc3MuIE90aGVyd2lzZSBmYWlsLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfc3RhdHVzIHdwYWxQYWNrZXRSYXdUcmltVGFpbCh3cHRfcGFja2V0ICpwUGt0LCB3cHRfdWludDMyIHNpemUpOwoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsUGFja2V0R2V0UmF3QnVmIJYgUmV0dXJuIHRoZSBzdGFydGluZyBidWZmZXIncyB2aXJ0dWFsIGFkZHJlc3MgZm9yIHRoZSBSQVcgZmxhdCBidWZmZXIKICAgIEl0IGlzIGlubGluZSBpbiBob3BlIG9mIGZhc3RlciBpbXBsZW1lbnRhdGlvbiBmb3IgY2VydGFpbiBwbGF0Zm9ybS4KICAgIFBhcmFtOiAKICAgICAgICBwUGt0IC0gcG9pbnRlciB0byBhIHdwdF9wYWNrZXQuCiAgICBSZXR1cm46CiAgICAgICAgTlVMTCAtIGZhaWwuCiAgICAgICAgT3RoZXJ3aXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydGluZyBvZiB0aGUgYnVmZmVyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmV4dGVybiB3cHRfdWludDggKndwYWxQYWNrZXRHZXRSYXdCdWYod3B0X3BhY2tldCAqcFBrdCk7CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxQYWNrZXRTZXRSeExlbmd0aCCWIFNldCB0aGUgdmFsaWQgZGF0YSBsZW5ndGggb24gYSBSWCBwYWNrZXQuIFRoaXMgZnVuY3Rpb24gbXVzdCAKICAgIGJlIGNhbGxlZCBvbmNlIHBlciBSWCBwYWNrZXQgcGVyIHJlY2VpdmluZy4gSXQgaW5kaWNhdGVzIHRoZSBhdmFpbGFibGUgZGF0YSBsZW5ndGggZnJvbQogICAgdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIuCiAgICBQYXJhbTogCiAgICAgICAgcFBrdCAtIHBvaW50ZXIgdG8gYSB3cHRfcGFja2V0LgogICAgUmV0dXJuOgogICAgICAgIE5VTEwgLSBmYWlsLgogICAgICAgIE90aGVyd2lzZSB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnRpbmcgb2YgdGhlIGJ1ZmZlcgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpleHRlcm4gd3B0X3N0YXR1cyB3cGFsUGFja2V0U2V0UnhMZW5ndGgod3B0X3BhY2tldCAqcFBrdCwgd3B0X3VpbnQzMiBsZW4pOwoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsSXRlcmF0b3JJbml0IJYgSW5pdGlhbGl6ZSBhbiBpbnRlcmF0b3IgYnkgdXBkYXRpbmcgcEN1ciB0byBmaXJzdCBpdGVtLgogICAgUGFyYW06IAogICAgICAgIHBJdGVyIJYgcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgd3B0X2l0ZXJhdG9yCiAgICAgICAgcFBhY2tldCCWIHBvaW50ZXIgdG8gYSB3cHRfcGFja2V0CiAgICBSZXR1cm46CiAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gc3VjY2VzcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfc3RhdHVzIHdwYWxJdGVyYXRvckluaXQod3B0X2l0ZXJhdG9yICpwSXRlciwgd3B0X3BhY2tldCAqcFBhY2tldCk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbEl0ZXJhdG9yTmV4dCCWIEdldCB0aGUgYWRkcmVzcyBmb3IgdGhlIG5leHQgaXRlbQogICAgUGFyYW06IAogICAgICAgIHBJdGVyIJYgcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgd3B0X2l0ZXJhdG9yCiAgICAgICAgcFBhY2tldCCWIHBvaW50ZXIgdG8gYSB3cHRfcGFja2V0CiAgICAgICAgcHBBZGRyIJYgQ2FsbGVyIGFsbG9jYXRlZCBwb2ludGVyIHRvIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgaXRlbS4gRm9yIERNQS1hYmxlIGRldmljZXMsIHRoaXMgaXMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGl0ZW0uCiAgICAgICAgcExlbiCWIFRvIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBpdGVtLgogICAgUmV0dXJuOgogICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kd3B0X3N0YXR1cyB3cGFsSXRlcmF0b3JOZXh0KHdwdF9pdGVyYXRvciAqcEl0ZXIsIHdwdF9wYWNrZXQgKnBQYWNrZXQsIHZvaWQgKipwcEFkZHIsIHdwdF91aW50MzIgKnBMZW4pOwoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsTG9ja1BhY2tldEZvclRyYW5zZmVyIJYgUGFja2V0IG11c3QgYmUgbG9ja2VkIGJlZm9yZSB0cmFuc2ZlciBjYW4gYmVnaW4sCiAgICB0aGUgbG9jayB3aWxsIGVuc3VyZSB0aGF0IHRoZSBETUEgZW5naW5lIGhhcyBhY2Nlc3MgdG8gdGhlIGRhdGEgcGFja2V0CiAgICBpbiBhIGNhY2hlIGNvaGVyZW50IG1hbm5lcgogCiAgICBQYXJhbTogCiAgICAgICAgcFBhY2tldCCWIHBvaW50ZXIgdG8gYSB3cHRfcGFja2V0CiAKICAgIFJldHVybjoKICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSBzdWNjZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9zdGF0dXMgd3BhbExvY2tQYWNrZXRGb3JUcmFuc2Zlciggd3B0X3BhY2tldCAqcFBhY2tldCk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbFVubG9ja1BhY2tldCCWIE9uY2UgdGhlIHRyYW5zZmVyIGhhcyBiZWVuIGNvbXBsZXRlZCB0aGUgcGFja2V0IHNob3VsZAogICAgICAgICAgICAgICAgICAgICAgIGJlIHVubG9ja2VkIHNvIHRoYXQgbm9ybWFsIG9wZXJhdGlvbiBtYXkgcmVzdW1lCiAgICBQYXJhbTogCiAgICAgICAgcFBhY2tldCCWIHBvaW50ZXIgdG8gYSB3cHRfcGFja2V0CiAKICAgIFJldHVybjoKICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSBzdWNjZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9zdGF0dXMgd3BhbFVubG9ja1BhY2tldCggd3B0X3BhY2tldCAqcFBhY2tldCk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbFBhY2tldEdldEZyYWdDb3VudCCWIEdldCBjb3VudCBvZiBtZW1vcnkgY2hhaW5zIChmcmFnbWVudHMpCiAgICAgICAgICAgICAgICAgICAgICAgaW4gYSBwYWNrZXQKICAgIFBhcmFtOiAKICAgICAgICBwUGFja2V0IJYgcG9pbnRlciB0byBhIHdwdF9wYWNrZXQKIAogICAgUmV0dXJuOgogICAgICAgIG1lbW9yeSBmcmFnbWVudCBjb3VudCBpbiBhIHBhY2tldAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfaW50MzIgd3BhbFBhY2tldEdldEZyYWdDb3VudCh3cHRfcGFja2V0ICpwUGt0KTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsSXNQYWNrZXRMb2NrZWQgliAgQ2hlY2sgd2hldGhlciB0aGUgUGFja2V0IGlzIGxvY2tlZCBmb3IgRE1BLgogICAgUGFyYW06IAogICAgICAgIHBQYWNrZXQgliBwb2ludGVyIHRvIGEgd3B0X3BhY2tldAogCiAgICBSZXR1cm46CiAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTCiAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19FX0ZBSUxVUkUKICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX0VfSU5WQUwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kd3B0X3N0YXR1cyB3cGFsSXNQYWNrZXRMb2NrZWQoIHdwdF9wYWNrZXQgKnBQYWNrZXQpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgd3BhbEdldE51bVJ4UmF3UGFja2V0ICAgUXVlcnkgYXZhaWxhYmxlIFJYIFJBVyB0b3RhbCBidWZmZXIgY291bnQKICAgcGFyYW06CiAgICAgICBudW1SeFJlc291cmNlICBwb2ludGVyIG9mIHF1ZXJpZWQgdmFsdWUKCiAgIHJldHVybjoKICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfc3RhdHVzIHdwYWxHZXROdW1SeFJhd1BhY2tldCh3cHRfdWludDMyICpudW1SeFJlc291cmNlKTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIHdwYWxHZXROdW1SeFBhY2tldEFsbG9jRmFpbHVyZXMgICBHZXQgbnVtYmVyIG9mIHRpbWVzIHBhY2tldCBhbGxvYyBmYWlsZWQKICAgICAgIG51bVJ4UmVzb3VyY2UgIHBvaW50ZXIgb2YgcXVlcmllZCB2YWx1ZQoKICAgcmV0dXJuOgogICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9zdGF0dXMgd3BhbEdldE51bVJ4UGFja2V0QWxsb2NGYWlsdXJlcyh3cHRfdWludDMyICpudW1SeFJlc291cmNlKTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIHdwYWxHZXROdW1SeEZyZWVQYWNrZXQgICBRdWVyeSBhdmFpbGFibGUgUlggRnJlZSBidWZmZXIgY291bnQKICAgcGFyYW06CiAgICAgICBudW1SeFJlc291cmNlICBwb2ludGVyIG9mIHF1ZXJpZWQgdmFsdWUKCiAgIHJldHVybjoKICAgICAgIFdQVF9TVEFUVVMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kd3B0X3N0YXR1cyB3cGFsR2V0TnVtUnhGcmVlUGFja2V0KHdwdF91aW50MzIgKm51bVJ4UmVzb3VyY2UpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxQYWNrZXRTdGFsbFVwZGF0ZUluZm8gliBVcGRhdGUgZWFjaCBjaGFubmVsIGluZm9ybWF0aW9uIHdoZW4gc3RhbGwKICAgICAgIGRldGVjdGVkLCBhbHNvIHBvd2VyIHN0YXRlIGFuZCBmcmVlIHJlc291cmNlIGNvdW50CgogICAgUGFyYW06CiAgICAgICBwb3dlclN0YXRlICA/IFdMQU4gc3lzdGVtIHBvd2VyIHN0YXRlIHdoZW4gc3RhbGwgZGV0ZWN0ZWQKICAgICAgIG51bUZyZWVCZCAgID8gTnVtYmVyIG9mIGZyZWUgcmVzb3VyY2UgY291bnQgaW4gSFcKICAgICAgIGNoYW5uZWxJbmZvID8gRWFjaCBjaGFubmVsIHNwZWNpZmljIGluZm9ybWF0aW9uIHdoZW4gc3RhbGwgaGFwcGVuCiAgICAgICBjaGFubmVsTnVtICA/IENoYW5uZWwgbnVtYmVyIHVwZGF0ZSBpbmZvcm1hdGlvbgoKICAgIFJldHVybjoKICAgICAgIE5PTkUKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnZvaWQgd3BhbFBhY2tldFN0YWxsVXBkYXRlSW5mbwooCiAgIHZfVTMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgKnBvd2VyU3RhdGUsCiAgIHZfVTMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgKm51bUZyZWVCZCwKICAgd3B0X2xvZ19kYXRhX3N0YWxsX2NoYW5uZWxfdHlwZSAqY2hhbm5lbEluZm8sCiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxOdW0KKTsKCiNpZmRlZiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsUGFja2V0U3RhbGxEdW1wTG9nIJYgVHJpZ2dlciB0byBzZW5kIGxvZyBwYWNrZXQgdG8gRElBRwogICAgICAgVXBkYXRlZCB0cmFuc3BvcnQgc3lzdGVtIGluZm9ybWF0aW9uIHdpbGwgYmUgc2VudCB0byBESUFHCgogICAgUGFyYW06CiAgICAgICAgTk9ORQoKICAgIFJldHVybjoKICAgICAgICBOT05FCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIHdwYWxQYWNrZXRTdGFsbER1bXBMb2cKKAogICB2b2lkCik7CiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRElBR19TVVBQT1JUICovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbExvZ1BrdFNlcmlhbGl6ZSAtIFNlcmlhbGl6ZSBMb2dnaW5nIGRhdGEgdG8gbG9nZ2VyIHRocmVhZAoKICAgIFBhcmFtOgogICAgd3B0X3BhY2tldCBwRnJhbWUgLSBUaGUgcGFja2V0IHdoaWNoIGNvbnRhaW5zIHRoZSBsb2dnaW5nIGRhdGEuCiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFja2V0IGhhcyB0byBiZSBhIFZBTElEIHBhY2tldCwgYXMgdGhpcwogICAgICAgICAgICAgICAgICAgICAgICBBUEkgd2lsbCBub3QgZG8gYW55IGNoZWNrcyBvbiB0aGUgdmFsaWRpdHkgb2YKICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhY2tldC4KCiAgICBSZXR1cm46CiAgICAgICAgTk9ORQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCB3cGFsTG9nUGt0U2VyaWFsaXplCigKICAgd3B0X3BhY2tldCAqcEZyYW1lCik7CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxGd0xvZ1BrdFNlcmlhbGl6ZSAtIFNlcmlhbGl6ZSBMb2dnaW5nIGRhdGEgdG8gbG9nZ2VyIHRocmVhZAoKICAgIFBhcmFtOgogICAgd3B0X3BhY2tldCBwRnJhbWUgLSBUaGUgcGFja2V0IHdoaWNoIGNvbnRhaW5zIHRoZSBsb2dnaW5nIGRhdGEuCiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFja2V0IGhhcyB0byBiZSBhIFZBTElEIHBhY2tldCwgYXMgdGhpcwogICAgICAgICAgICAgICAgICAgICAgICBBUEkgd2lsbCBub3QgZG8gYW55IGNoZWNrcyBvbiB0aGUgdmFsaWRpdHkgb2YKICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhY2tldC4KCiAgICBSZXR1cm46CiAgICAgICAgTk9ORQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCB3cGFsRndMb2dQa3RTZXJpYWxpemUKKAogICB3cHRfcGFja2V0ICpwRnJhbWUsIHdwdF91aW50MzIgcGt0VHlwZQopOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxQZXJQa3RTZXJpYWxpemUgLSBTZXJpYWxpemUgcGVycGt0IGRhdGEgdG8gbG9nZ2VyIHRocmVhZAoKICAgIFBhcmFtOgoKCiAgICBSZXR1cm46CiAgICAgICAgTk9ORQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCB3cGFsUGVyUGt0U2VyaWFsaXplCigKICAgdm9pZCAqcGVyUGt0U3RhdAopOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxHZXRPU1BrdEhlYWQgliBHZXQgdGhlIGhlYWQgb2YgT1Mgc3BhY2lmaWMgc29ja2V0IGJ1ZmZlcgogICAgUGFyYW06CiAgICAgICAgcFBhY2tldCCWIHBvaW50ZXIgdG8gYSB3cHRfcGFja2V0CgogICAgUmV0dXJuOgogICAgICAgIHZvaWQqIC0gc3VjY2VzcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkKiB3cGFsR2V0T1NQa3RIZWFkKCB3cHRfcGFja2V0ICpwUGFja2V0KTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgd3BhbEdldE9TUGt0ZW5kIJYgR2V0IGVuZCBwb2ludGVyIG9mIE9TIHNwYWNpZmljIHNvY2tldCBidWZmZXIKICAgIFBhcmFtOgogICAgICAgIHBQYWNrZXQgliBwb2ludGVyIHRvIGEgd3B0X3BhY2tldAoKICAgIFJldHVybjoKICAgICAgICB2b2lkKiAgLSBzdWNjZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnZvaWQqIHdwYWxHZXRPU1BrdGVuZCggd3B0X3BhY2tldCAqcFBhY2tldCk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbFJlY292ZXJUYWlsIJYgcmVjb3ZlciBjdXJydXB0ZWQgc2tiIHRhaWwuCiAgICBQYXJhbToKICAgICAgICBwUGFja2V0IJYgcG9pbnRlciB0byBhIHdwdF9wYWNrZXQKCiAgICBSZXR1cm46CiAgICAgICAgdm9pZCAgLSBzdWNjZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnZvaWQgd3BhbFJlY292ZXJUYWlsKCB3cHRfcGFja2V0ICpwUGFja2V0KTsKCiNlbmRpZiAvLyBfX1dMQU5fUUNUX1BBTF9QQUNLRVRfSAo=