LyogR1N0cmVhbWVyCiAqIENvcHlyaWdodCAoQykgMTk5OSBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgogKiBDb3B5cmlnaHQgKEMpIDIwMDQgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KICogQ29weXJpZ2h0IChDKSAyMDA3IFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgogKiBDb3B5cmlnaHQgKEMpIDIwMDggT2xlIEFuZHLpIFZhZGxhIFJhdm7lcyA8b2xlLmFuZHJlLnJhdm5hc0B0YW5kYmVyZy5jb20+CiAqCiAqIGdzdHBvbGwuYzogRmlsZSBkZXNjcmlwdG9yIHNldAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCiAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgogKi8KLyoqCiAqIFNFQ1RJT046Z3N0cG9sbAogKiBAc2hvcnRfZGVzY3JpcHRpb246IEtlZXAgdHJhY2sgb2YgZmlsZSBkZXNjcmlwdG9ycyBhbmQgbWFrZSBpdCBwb3NzaWJsZQogKiAgICAgICAgICAgICAgICAgICAgIHRvIHdhaXQgb24gdGhlbSBpbiBhIGNhbmNlbGxhYmxlIHdheQogKgogKiBBICNHc3RQb2xsIGtlZXBzIHRyYWNrIG9mIGZpbGUgZGVzY3JpcHRvcnMgbXVjaCBsaWtlIGZkX3NldCAodXNlZCB3aXRoCiAqIHNlbGVjdCgpKSBvciBhIHN0cnVjdCBwb2xsZmQgYXJyYXkgKHVzZWQgd2l0aCBwb2xsKCkpLiBPbmNlIGNyZWF0ZWQgd2l0aAogKiBnc3RfcG9sbF9uZXcoKSwgdGhlIHNldCBjYW4gYmUgdXNlZCB0byB3YWl0IGZvciBmaWxlIGRlc2NyaXB0b3JzIHRvIGJlCiAqIHJlYWRhYmxlIGFuZC9vciB3cml0YWJsZS4gSXQgaXMgcG9zc2libGUgdG8gbWFrZSB0aGlzIHdhaXQgYmUgY29udHJvbGxlZAogKiBieSBzcGVjaWZ5aW5nICVUUlVFIGZvciB0aGUgQGNvbnRyb2xsYWJsZSBmbGFnIHdoZW4gY3JlYXRpbmcgdGhlIHNldCAob3IKICogbGF0ZXIgY2FsbGluZyBnc3RfcG9sbF9zZXRfY29udHJvbGxhYmxlKCkpLgogKgogKiBOZXcgZmlsZSBkZXNjcmlwdG9ycyBhcmUgYWRkZWQgdG8gdGhlIHNldCB1c2luZyBnc3RfcG9sbF9hZGRfZmQoKSwgYW5kCiAqIHJlbW92ZWQgdXNpbmcgZ3N0X3BvbGxfcmVtb3ZlX2ZkKCkuIENvbnRyb2xsaW5nIHdoaWNoIGZpbGUgZGVzY3JpcHRvcnMKICogc2hvdWxkIGJlIHdhaXRlZCBmb3IgdG8gYmVjb21lIHJlYWRhYmxlIGFuZC9vciB3cml0YWJsZSBhcmUgZG9uZSB1c2luZwogKiBnc3RfcG9sbF9mZF9jdGxfcmVhZCgpIGFuZCBnc3RfcG9sbF9mZF9jdGxfd3JpdGUoKS4KICoKICogVXNlIGdzdF9wb2xsX3dhaXQoKSB0byB3YWl0IGZvciB0aGUgZmlsZSBkZXNjcmlwdG9ycyB0byBhY3R1YWxseSBiZWNvbWUKICogcmVhZGFibGUgYW5kL29yIHdyaXRhYmxlLCBvciB0byB0aW1lb3V0IGlmIG5vIGZpbGUgZGVzY3JpcHRvciBpcyBhdmFpbGFibGUKICogaW4gdGltZS4gVGhlIHdhaXQgY2FuIGJlIGNvbnRyb2xsZWQgYnkgY2FsbGluZyBnc3RfcG9sbF9yZXN0YXJ0KCkgYW5kCiAqIGdzdF9wb2xsX3NldF9mbHVzaGluZygpLgogKgogKiBPbmNlIHRoZSBmaWxlIGRlc2NyaXB0b3Igc2V0IGhhcyBiZWVuIHdhaXRlZCBmb3IsIG9uZSBjYW4gdXNlCiAqIGdzdF9wb2xsX2ZkX2hhc19jbG9zZWQoKSB0byBzZWUgaWYgdGhlIGZpbGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjbG9zZWQsCiAqIGdzdF9wb2xsX2ZkX2hhc19lcnJvcigpIHRvIHNlZSBpZiBpdCBoYXMgZ2VuZXJhdGVkIGFuIGVycm9yLAogKiBnc3RfcG9sbF9mZF9jYW5fcmVhZCgpIHRvIHNlZSBpZiBpdCBpcyBwb3NzaWJsZSB0byByZWFkIGZyb20gdGhlIGZpbGUKICogZGVzY3JpcHRvciwgYW5kIGdzdF9wb2xsX2ZkX2Nhbl93cml0ZSgpIHRvIHNlZSBpZiBpdCBpcyBwb3NzaWJsZSB0bwogKiB3cml0ZSB0byBpdC4KICoKICovCgojaWZkZWYgSEFWRV9DT05GSUdfSAojaW5jbHVkZSAiY29uZmlnLmgiCiNlbmRpZgoKI2luY2x1ZGUgImdzdF9wcml2YXRlLmgiCiNpbmNsdWRlICJnbGliLWNvbXBhdC1wcml2YXRlLmgiCgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CgojaWZkZWYgSEFWRV9VTklTVERfSAojaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgoKI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxmY250bC5oPgoKI2luY2x1ZGUgPGdsaWIuaD4KCiNpZmRlZiBHX09TX1dJTjMyCiNpbmNsdWRlIDx3aW5zb2NrMi5oPgojZWxzZQojZGVmaW5lIF9HTlVfU09VUkNFIDEKI2lmZGVmIEhBVkVfU1lTX1BPTExfSAojaW5jbHVkZSA8c3lzL3BvbGwuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1BPTExfSAojaW5jbHVkZSA8cG9sbC5oPgojZW5kaWYKI2luY2x1ZGUgPHN5cy90aW1lLmg+CiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbmRpZgoKI2lmZGVmIEdfT1NfV0lOMzIKIyAgaWZuZGVmIEVXT1VMREJMT0NLCiMgIGRlZmluZSBFV09VTERCTE9DSyBFQUdBSU4gICAgLyogVGhpcyBpcyBqdXN0IHRvIHBsYWNhdGUgZ2NjICovCiMgIGVuZGlmCiNlbmRpZiAvKiBHX09TX1dJTjMyICovCgovKiBPUy9YIG5lZWRzIHRoaXMgYmVjYXVzZSBvZiBiYWQgaGVhZGVycyAqLwojaW5jbHVkZSA8c3RyaW5nLmg+CgovKiBUaGUgcG9sbCgpIGVtdWxhdGlvbiBvbiBPUy9YIGRvZXNuJ3QgaGFuZGxlIGZkcz1OVUxMLCBuZmRzPTAsCiAqIHNvIHdlIHByZWZlciBvdXIgb3duIHBvbGwgZW11bGF0aW9uLgogKi8KI2lmIGRlZmluZWQoQlJPS0VOX1BPTEwpCiN1bmRlZiBIQVZFX1BPTEwKI2VuZGlmCgojaW5jbHVkZSAiZ3N0cG9sbC5oIgoKI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgR1NUX0NBVF9QT0xMCgojaWZkZWYgR19PU19XSU4zMgp0eXBlZGVmIHN0cnVjdCBfV2luc29ja0ZkIFdpbnNvY2tGZDsKCnN0cnVjdCBfV2luc29ja0ZkCnsKICBnaW50IGZkOwogIGdsb25nIGV2ZW50X21hc2s7CiAgV1NBTkVUV09SS0VWRU5UUyBldmVudHM7CiAgZ2xvbmcgaWdub3JlZF9ldmVudF9tYXNrOwp9OwojZW5kaWYKCnR5cGVkZWYgZW51bQp7CiAgR1NUX1BPTExfTU9ERV9BVVRPLAogIEdTVF9QT0xMX01PREVfU0VMRUNULAogIEdTVF9QT0xMX01PREVfUFNFTEVDVCwKICBHU1RfUE9MTF9NT0RFX1BPTEwsCiAgR1NUX1BPTExfTU9ERV9QUE9MTCwKICBHU1RfUE9MTF9NT0RFX1dJTkRPV1MKfSBHc3RQb2xsTW9kZTsKCnN0cnVjdCBfR3N0UG9sbAp7CiAgR3N0UG9sbE1vZGUgbW9kZTsKCiAgR011dGV4IGxvY2s7CiAgLyogYXJyYXkgb2YgZmRzLCBhbHdheXMgd3JpdHRlbiB0byBhbmQgcmVhZCBmcm9tIHdpdGggbG9jayAqLwogIEdBcnJheSAqZmRzOwogIC8qIGFycmF5IG9mIGFjdGl2ZSBmZHMsIG9ubHkgd3JpdHRlbiB0byBmcm9tIHRoZSB3YWl0aW5nIHRocmVhZCB3aXRoIHRoZQogICAqIGxvY2sgYW5kIHJlYWQgZnJvbSB3aXRoIHRoZSBsb2NrIG9yIHdpdGhvdXQgdGhlIGxvY2sgZnJvbSB0aGUgd2FpdGluZwogICAqIHRocmVhZCAqLwogIEdBcnJheSAqYWN0aXZlX2ZkczsKCiNpZm5kZWYgR19PU19XSU4zMgogIEdzdFBvbGxGRCBjb250cm9sX3JlYWRfZmQ7CiAgR3N0UG9sbEZEIGNvbnRyb2xfd3JpdGVfZmQ7CiNlbHNlCiAgR0FycmF5ICphY3RpdmVfZmRzX2lnbm9yZWQ7CiAgR0FycmF5ICpldmVudHM7CiAgR0FycmF5ICphY3RpdmVfZXZlbnRzOwoKICBIQU5ETEUgd2FrZXVwX2V2ZW50OwojZW5kaWYKCiAgZ2Jvb2xlYW4gY29udHJvbGxhYmxlOwogIHZvbGF0aWxlIGdpbnQgd2FpdGluZzsKICB2b2xhdGlsZSBnaW50IGNvbnRyb2xfcGVuZGluZzsKICB2b2xhdGlsZSBnaW50IGZsdXNoaW5nOwogIGdib29sZWFuIHRpbWVyOwogIHZvbGF0aWxlIGdpbnQgcmVidWlsZDsKfTsKCnN0YXRpYyBnYm9vbGVhbiBnc3RfcG9sbF9mZF9jdGxfcmVhZF91bmxvY2tlZCAoR3N0UG9sbCAqIHNldCwgR3N0UG9sbEZEICogZmQsCiAgICBnYm9vbGVhbiBhY3RpdmUpOwpzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3BvbGxfYWRkX2ZkX3VubG9ja2VkIChHc3RQb2xsICogc2V0LCBHc3RQb2xsRkQgKiBmZCk7CgojZGVmaW5lIElTX0ZMVVNISU5HKHMpICAgICAgKGdfYXRvbWljX2ludF9nZXQoJihzKS0+Zmx1c2hpbmcpKQojZGVmaW5lIFNFVF9GTFVTSElORyhzLHZhbCkgKGdfYXRvbWljX2ludF9zZXQoJihzKS0+Zmx1c2hpbmcsICh2YWwpKSkKCiNkZWZpbmUgSU5DX1dBSVRJTkcocykgICAgICAoZ19hdG9taWNfaW50X2FkZCgmKHMpLT53YWl0aW5nLCAxKSkKI2RlZmluZSBERUNfV0FJVElORyhzKSAgICAgIChnX2F0b21pY19pbnRfYWRkKCYocyktPndhaXRpbmcsIC0xKSkKI2RlZmluZSBHRVRfV0FJVElORyhzKSAgICAgIChnX2F0b21pY19pbnRfZ2V0KCYocyktPndhaXRpbmcpKQoKI2RlZmluZSBURVNUX1JFQlVJTEQocykgICAgIChnX2F0b21pY19pbnRfY29tcGFyZV9hbmRfZXhjaGFuZ2UoJihzKS0+cmVidWlsZCwgMSwgMCkpCiNkZWZpbmUgTUFSS19SRUJVSUxEKHMpICAgICAoZ19hdG9taWNfaW50X3NldCgmKHMpLT5yZWJ1aWxkLCAxKSkKCiNpZm5kZWYgR19PU19XSU4zMgoKc3RhdGljIGdib29sZWFuCndha2VfZXZlbnQgKEdzdFBvbGwgKiBzZXQpCnsKICBzc2l6ZV90IG51bV93cml0dGVuOwogIHdoaWxlICgobnVtX3dyaXR0ZW4gPSB3cml0ZSAoc2V0LT5jb250cm9sX3dyaXRlX2ZkLmZkLCAiVyIsIDEpKSAhPSAxKSB7CiAgICBpZiAobnVtX3dyaXR0ZW4gPT0gLTEgJiYgZXJybm8gIT0gRUFHQUlOICYmIGVycm5vICE9IEVJTlRSKSB7CiAgICAgIGdfY3JpdGljYWwgKCIlcDogZmFpbGVkIHRvIHdha2UgZXZlbnQ6ICVzIiwgc2V0LCBzdHJlcnJvciAoZXJybm8pKTsKICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogIH0KICByZXR1cm4gVFJVRTsKfQoKc3RhdGljIGdib29sZWFuCnJlbGVhc2VfZXZlbnQgKEdzdFBvbGwgKiBzZXQpCnsKICBnY2hhciBidWZbMV0gPSB7ICdcMCcgfTsKICBzc2l6ZV90IG51bV9yZWFkOwogIHdoaWxlICgobnVtX3JlYWQgPSByZWFkIChzZXQtPmNvbnRyb2xfcmVhZF9mZC5mZCwgYnVmLCAxKSkgIT0gMSkgewogICAgaWYgKG51bV9yZWFkID09IC0xICYmIGVycm5vICE9IEVBR0FJTiAmJiBlcnJubyAhPSBFSU5UUikgewogICAgICBnX2NyaXRpY2FsICgiJXA6IGZhaWxlZCB0byByZWxlYXNlIGV2ZW50OiAlcyIsIHNldCwgc3RyZXJyb3IgKGVycm5vKSk7CiAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICB9CiAgcmV0dXJuIFRSVUU7Cn0KCiNlbHNlCgpzdGF0aWMgdm9pZApmb3JtYXRfbGFzdF9lcnJvciAoZ2NoYXIgKiBidWYsIHNpemVfdCBidWZfbGVuKQp7CiAgRFdPUkQgZmxhZ3MgPSBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTTsKICBMUENWT0lEIHNyYyA9IE5VTEw7CiAgRFdPUkQgbGFuZyA9IDA7CiAgRFdPUkQgaWQ7CiAgaWQgPSBHZXRMYXN0RXJyb3IgKCk7CiAgRm9ybWF0TWVzc2FnZSAoZmxhZ3MsIHNyYywgaWQsIGxhbmcsIGJ1ZiwgKERXT1JEKSBidWZfbGVuLCBOVUxMKTsKICBTZXRMYXN0RXJyb3IgKGlkKTsKfQoKc3RhdGljIGdib29sZWFuCndha2VfZXZlbnQgKEdzdFBvbGwgKiBzZXQpCnsKICBTZXRMYXN0RXJyb3IgKDApOwogIGVycm5vID0gMDsKICBpZiAoIVNldEV2ZW50IChzZXQtPndha2V1cF9ldmVudCkpIHsKICAgIGdjaGFyIG1zZ1sxMDI0XSA9ICI8dW5rbm93bj4iOwogICAgZm9ybWF0X2xhc3RfZXJyb3IgKG1zZywgc2l6ZW9mIChtc2cpKTsKICAgIGdfY3JpdGljYWwgKCIlcDogZmFpbGVkIHRvIHNldCB3YWt1cF9ldmVudDogJXMiLCBzZXQsIG1zZyk7CiAgICBlcnJubyA9IEVCQURGOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgcmV0dXJuIFRSVUU7Cn0KCnN0YXRpYyBnYm9vbGVhbgpyZWxlYXNlX2V2ZW50IChHc3RQb2xsICogc2V0KQp7CiAgRFdPUkQgc3RhdHVzOwogIFNldExhc3RFcnJvciAoMCk7CiAgZXJybm8gPSAwOwoKICBzdGF0dXMgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0IChzZXQtPndha2V1cF9ldmVudCwgSU5GSU5JVEUpOwogIGlmIChzdGF0dXMpIHsKICAgIGNvbnN0IGdjaGFyICpyZWFzb24gPSAidW5rbm93biI7CiAgICBnY2hhciBtc2dbMTAyNF0gPSAiPHVua25vd24+IjsKICAgIHN3aXRjaCAoc3RhdHVzKSB7CiAgICAgIGNhc2UgV0FJVF9BQkFORE9ORUQ6CiAgICAgICAgcmVhc29uID0gIldBSVRfQUJBTkRPTkVEIjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBXQUlUX1RJTUVPVVQ6CiAgICAgICAgcmVhc29uID0gIldBSVRfVElNRU9VVCI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgV0FJVF9GQUlMRUQ6CiAgICAgICAgZm9ybWF0X2xhc3RfZXJyb3IgKG1zZywgc2l6ZW9mIChtc2cpKTsKICAgICAgICByZWFzb24gPSBtc2c7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmVhc29uID0gIm90aGVyIjsKICAgICAgICBicmVhazsKICAgIH0KICAgIGdfY3JpdGljYWwgKCIlcDogZmFpbGVkIHRvIGJsb2NrIG9uIHdha3VwX2V2ZW50OiAlcyIsIHNldCwgcmVhc29uKTsKICAgIGVycm5vID0gRUJBREY7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBpZiAoIVJlc2V0RXZlbnQgKHNldC0+d2FrZXVwX2V2ZW50KSkgewogICAgZ2NoYXIgbXNnWzEwMjRdID0gIjx1bmtub3duPiI7CiAgICBmb3JtYXRfbGFzdF9lcnJvciAobXNnLCBzaXplb2YgKG1zZykpOwogICAgZ19jcml0aWNhbCAoIiVwOiBmYWlsZWQgdG8gcmVzZXQgd2FrdXBfZXZlbnQ6ICVzIiwgc2V0LCBtc2cpOwogICAgZXJybm8gPSBFQkFERjsKICAgIHJldHVybiBGQUxTRTsKICB9CgogIHJldHVybiBUUlVFOwp9CgojZW5kaWYKCi8qIHRoZSBwb2xsL3NlbGVjdCBjYWxsIGlzIGFsc28gcGVyZm9ybWVkIG9uIGEgY29udHJvbCBzb2NrZXQsIHRoYXQgd2F5CiAqIHdlIGNhbiBzZW5kIHNwZWNpYWwgY29tbWFuZHMgdG8gY29udHJvbCBpdCAqLwpzdGF0aWMgaW5saW5lIGdib29sZWFuCnJhaXNlX3dha2V1cCAoR3N0UG9sbCAqIHNldCkKewogIGdib29sZWFuIHJlc3VsdCA9IFRSVUU7CgogIC8qIG1ha2VzIHRlc3RpbmcgY29udHJvbF9wZW5kaW5nIGFuZCBXQUtFX0VWRU5UKCkgYXRvbWljLiAqLwogIGdfbXV0ZXhfbG9jayAoJnNldC0+bG9jayk7CgogIGlmIChzZXQtPmNvbnRyb2xfcGVuZGluZyA9PSAwKSB7CiAgICAvKiByYWlzZSB3aGVuIG5vdGhpbmcgcGVuZGluZyAqLwogICAgR1NUX0xPRyAoIiVwOiByYWlzZSIsIHNldCk7CiAgICByZXN1bHQgPSB3YWtlX2V2ZW50IChzZXQpOwogIH0KCiAgaWYgKHJlc3VsdCkgewogICAgc2V0LT5jb250cm9sX3BlbmRpbmcrKzsKICB9CgogIGdfbXV0ZXhfdW5sb2NrICgmc2V0LT5sb2NrKTsKCiAgcmV0dXJuIHJlc3VsdDsKfQoKc3RhdGljIGlubGluZSBnYm9vbGVhbgpyZWxlYXNlX3dha2V1cCAoR3N0UG9sbCAqIHNldCkKewogIGdib29sZWFuIHJlc3VsdCA9IEZBTFNFOwoKICAvKiBtYWtlcyB0ZXN0aW5nL21vZGlmeWluZyBjb250cm9sX3BlbmRpbmcgYW5kIFJFTEVBU0VfRVZFTlQoKSBhdG9taWMuICovCiAgZ19tdXRleF9sb2NrICgmc2V0LT5sb2NrKTsKCiAgaWYgKHNldC0+Y29udHJvbF9wZW5kaW5nID4gMCkgewogICAgLyogcmVsZWFzZSwgb25seSBpZiB0aGlzIHdhcyB0aGUgbGFzdCBwZW5kaW5nLiAqLwogICAgaWYgKHNldC0+Y29udHJvbF9wZW5kaW5nID09IDEpIHsKICAgICAgR1NUX0xPRyAoIiVwOiByZWxlYXNlIiwgc2V0KTsKICAgICAgcmVzdWx0ID0gcmVsZWFzZV9ldmVudCAoc2V0KTsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IFRSVUU7CiAgICB9CgogICAgaWYgKHJlc3VsdCkgewogICAgICBzZXQtPmNvbnRyb2xfcGVuZGluZy0tOwogICAgfQogIH0gZWxzZSB7CiAgICBlcnJubyA9IEVXT1VMREJMT0NLOwogIH0KCiAgZ19tdXRleF91bmxvY2sgKCZzZXQtPmxvY2spOwoKICByZXR1cm4gcmVzdWx0Owp9CgpzdGF0aWMgaW5saW5lIGdpbnQKcmVsZWFzZV9hbGxfd2FrZXVwIChHc3RQb2xsICogc2V0KQp7CiAgZ2ludCBvbGQ7CgogIC8qIG1ha2VzIHRlc3RpbmcgY29udHJvbF9wZW5kaW5nIGFuZCBSRUxFQVNFX0VWRU5UKCkgYXRvbWljLiAqLwogIGdfbXV0ZXhfbG9jayAoJnNldC0+bG9jayk7CgogIGlmICgob2xkID0gc2V0LT5jb250cm9sX3BlbmRpbmcpID4gMCkgewogICAgR1NUX0xPRyAoIiVwOiByZWxlYXNpbmcgJWQiLCBzZXQsIG9sZCk7CiAgICBpZiAocmVsZWFzZV9ldmVudCAoc2V0KSkgewogICAgICBzZXQtPmNvbnRyb2xfcGVuZGluZyA9IDA7CiAgICB9IGVsc2UgewogICAgICBvbGQgPSAwOwogICAgfQogIH0KCiAgZ19tdXRleF91bmxvY2sgKCZzZXQtPmxvY2spOwoKICByZXR1cm4gb2xkOwp9CgpzdGF0aWMgZ2ludApmaW5kX2luZGV4IChHQXJyYXkgKiBhcnJheSwgR3N0UG9sbEZEICogZmQpCnsKI2lmbmRlZiBHX09TX1dJTjMyCiAgc3RydWN0IHBvbGxmZCAqaWZkOwojZWxzZQogIFdpbnNvY2tGZCAqaWZkOwojZW5kaWYKICBndWludCBpOwoKICAvKiBzdGFydCBieSBhc3N1bWluZyB0aGUgaW5kZXggZm91bmQgaW4gdGhlIGZkIGlzIHN0aWxsIHZhbGlkICovCiAgaWYgKGZkLT5pZHggPj0gMCAmJiBmZC0+aWR4IDwgYXJyYXktPmxlbikgewojaWZuZGVmIEdfT1NfV0lOMzIKICAgIGlmZCA9ICZnX2FycmF5X2luZGV4IChhcnJheSwgc3RydWN0IHBvbGxmZCwgZmQtPmlkeCk7CiNlbHNlCiAgICBpZmQgPSAmZ19hcnJheV9pbmRleCAoYXJyYXksIFdpbnNvY2tGZCwgZmQtPmlkeCk7CiNlbmRpZgoKICAgIGlmIChpZmQtPmZkID09IGZkLT5mZCkgewogICAgICByZXR1cm4gZmQtPmlkeDsKICAgIH0KICB9CgogIC8qIHRoZSBwb2xsZmQgYXJyYXkgaGFzIGNoYW5nZWQgYW5kIHdlIG5lZWQgdG8gbG9va3VwIHRoZSBmZCBhZ2FpbiAqLwogIGZvciAoaSA9IDA7IGkgPCBhcnJheS0+bGVuOyBpKyspIHsKI2lmbmRlZiBHX09TX1dJTjMyCiAgICBpZmQgPSAmZ19hcnJheV9pbmRleCAoYXJyYXksIHN0cnVjdCBwb2xsZmQsIGkpOwojZWxzZQogICAgaWZkID0gJmdfYXJyYXlfaW5kZXggKGFycmF5LCBXaW5zb2NrRmQsIGkpOwojZW5kaWYKCiAgICBpZiAoaWZkLT5mZCA9PSBmZC0+ZmQpIHsKICAgICAgZmQtPmlkeCA9IChnaW50KSBpOwogICAgICByZXR1cm4gZmQtPmlkeDsKICAgIH0KICB9CgogIGZkLT5pZHggPSAtMTsKICByZXR1cm4gZmQtPmlkeDsKfQoKI2lmICFkZWZpbmVkKEhBVkVfUFBPTEwpICYmIGRlZmluZWQoSEFWRV9QT0xMKQovKiBjaGVjayBpZiBhbGwgZmlsZSBkZXNjcmlwdG9ycyB3aWxsIGZpdCBpbiBhbiBmZF9zZXQgKi8Kc3RhdGljIGdib29sZWFuCnNlbGVjdGFibGVfZmRzIChHc3RQb2xsICogc2V0KQp7CiAgZ3VpbnQgaTsKCiAgZ19tdXRleF9sb2NrICgmc2V0LT5sb2NrKTsKICBmb3IgKGkgPSAwOyBpIDwgc2V0LT5mZHMtPmxlbjsgaSsrKSB7CiAgICBzdHJ1Y3QgcG9sbGZkICpwZmQgPSAmZ19hcnJheV9pbmRleCAoc2V0LT5mZHMsIHN0cnVjdCBwb2xsZmQsIGkpOwoKICAgIGlmIChwZmQtPmZkID49IEZEX1NFVFNJWkUpCiAgICAgIGdvdG8gdG9vX21hbnk7CiAgfQogIGdfbXV0ZXhfdW5sb2NrICgmc2V0LT5sb2NrKTsKCiAgcmV0dXJuIFRSVUU7Cgp0b29fbWFueToKICB7CiAgICBnX211dGV4X3VubG9jayAoJnNldC0+bG9jayk7CiAgICByZXR1cm4gRkFMU0U7CiAgfQp9CgovKiBjaGVjayBpZiB0aGUgdGltZW91dCB3aWxsIGNvbnZlcnQgdG8gYSB0aW1lb3V0IHZhbHVlIHVzZWQgZm9yIHBvbGwoKQogKiB3aXRob3V0IGEgbG9zcyBvZiBwcmVjaXNpb24KICovCnN0YXRpYyBnYm9vbGVhbgpwb2xsYWJsZV90aW1lb3V0IChHc3RDbG9ja1RpbWUgdGltZW91dCkKewogIGlmICh0aW1lb3V0ID09IEdTVF9DTE9DS19USU1FX05PTkUpCiAgICByZXR1cm4gVFJVRTsKCiAgLyogbm90IGEgbmljZSBtdWx0aXBsZSBvZiBtaWxsaXNlY29uZHMgKi8KICBpZiAodGltZW91dCAlIDEwMDAwMDApCiAgICByZXR1cm4gRkFMU0U7CgogIHJldHVybiBUUlVFOwp9CiNlbmRpZgoKc3RhdGljIEdzdFBvbGxNb2RlCmNob29zZV9tb2RlIChHc3RQb2xsICogc2V0LCBHc3RDbG9ja1RpbWUgdGltZW91dCkKewogIEdzdFBvbGxNb2RlIG1vZGU7CgogIGlmIChzZXQtPm1vZGUgPT0gR1NUX1BPTExfTU9ERV9BVVRPKSB7CiNpZmRlZiBIQVZFX1BQT0xMCiAgICBtb2RlID0gR1NUX1BPTExfTU9ERV9QUE9MTDsKI2VsaWYgZGVmaW5lZChIQVZFX1BPTEwpCiAgICBpZiAoIXNlbGVjdGFibGVfZmRzIChzZXQpIHx8IHBvbGxhYmxlX3RpbWVvdXQgKHRpbWVvdXQpKSB7CiAgICAgIG1vZGUgPSBHU1RfUE9MTF9NT0RFX1BPTEw7CiAgICB9IGVsc2UgewojaWZkZWYgSEFWRV9QU0VMRUNUCiAgICAgIG1vZGUgPSBHU1RfUE9MTF9NT0RFX1BTRUxFQ1Q7CiNlbHNlCiAgICAgIG1vZGUgPSBHU1RfUE9MTF9NT0RFX1NFTEVDVDsKI2VuZGlmCiAgICB9CiNlbGlmIGRlZmluZWQoSEFWRV9QU0VMRUNUKQogICAgbW9kZSA9IEdTVF9QT0xMX01PREVfUFNFTEVDVDsKI2Vsc2UKICAgIG1vZGUgPSBHU1RfUE9MTF9NT0RFX1NFTEVDVDsKI2VuZGlmCiAgfSBlbHNlIHsKICAgIG1vZGUgPSBzZXQtPm1vZGU7CiAgfQogIHJldHVybiBtb2RlOwp9CgojaWZuZGVmIEdfT1NfV0lOMzIKc3RhdGljIGdpbnQKcG9sbGZkX3RvX2ZkX3NldCAoR3N0UG9sbCAqIHNldCwgZmRfc2V0ICogcmVhZGZkcywgZmRfc2V0ICogd3JpdGVmZHMsCiAgICBmZF9zZXQgKiBlcnJvcmZkcykKewogIGdpbnQgbWF4X2ZkID0gLTE7CiAgZ3VpbnQgaTsKCiAgRkRfWkVSTyAocmVhZGZkcyk7CiAgRkRfWkVSTyAod3JpdGVmZHMpOwogIEZEX1pFUk8gKGVycm9yZmRzKTsKCiAgZ19tdXRleF9sb2NrICgmc2V0LT5sb2NrKTsKCiAgZm9yIChpID0gMDsgaSA8IHNldC0+YWN0aXZlX2Zkcy0+bGVuOyBpKyspIHsKICAgIHN0cnVjdCBwb2xsZmQgKnBmZCA9ICZnX2FycmF5X2luZGV4IChzZXQtPmZkcywgc3RydWN0IHBvbGxmZCwgaSk7CgogICAgaWYgKHBmZC0+ZmQgPCBGRF9TRVRTSVpFKSB7CiAgICAgIGlmIChwZmQtPmV2ZW50cyAmIFBPTExJTikKICAgICAgICBGRF9TRVQgKHBmZC0+ZmQsIHJlYWRmZHMpOwogICAgICBpZiAocGZkLT5ldmVudHMgJiBQT0xMT1VUKQogICAgICAgIEZEX1NFVCAocGZkLT5mZCwgd3JpdGVmZHMpOwogICAgICBpZiAocGZkLT5ldmVudHMpCiAgICAgICAgRkRfU0VUIChwZmQtPmZkLCBlcnJvcmZkcyk7CiAgICAgIGlmIChwZmQtPmZkID4gbWF4X2ZkICYmIChwZmQtPmV2ZW50cyAmIChQT0xMSU4gfCBQT0xMT1VUKSkpCiAgICAgICAgbWF4X2ZkID0gcGZkLT5mZDsKICAgIH0KICB9CgogIGdfbXV0ZXhfdW5sb2NrICgmc2V0LT5sb2NrKTsKCiAgcmV0dXJuIG1heF9mZDsKfQoKc3RhdGljIHZvaWQKZmRfc2V0X3RvX3BvbGxmZCAoR3N0UG9sbCAqIHNldCwgZmRfc2V0ICogcmVhZGZkcywgZmRfc2V0ICogd3JpdGVmZHMsCiAgICBmZF9zZXQgKiBlcnJvcmZkcykKewogIGd1aW50IGk7CgogIGdfbXV0ZXhfbG9jayAoJnNldC0+bG9jayk7CgogIGZvciAoaSA9IDA7IGkgPCBzZXQtPmFjdGl2ZV9mZHMtPmxlbjsgaSsrKSB7CiAgICBzdHJ1Y3QgcG9sbGZkICpwZmQgPSAmZ19hcnJheV9pbmRleCAoc2V0LT5hY3RpdmVfZmRzLCBzdHJ1Y3QgcG9sbGZkLCBpKTsKCiAgICBpZiAocGZkLT5mZCA8IEZEX1NFVFNJWkUpIHsKICAgICAgcGZkLT5yZXZlbnRzID0gMDsKICAgICAgaWYgKEZEX0lTU0VUIChwZmQtPmZkLCByZWFkZmRzKSkKICAgICAgICBwZmQtPnJldmVudHMgfD0gUE9MTElOOwogICAgICBpZiAoRkRfSVNTRVQgKHBmZC0+ZmQsIHdyaXRlZmRzKSkKICAgICAgICBwZmQtPnJldmVudHMgfD0gUE9MTE9VVDsKICAgICAgaWYgKEZEX0lTU0VUIChwZmQtPmZkLCBlcnJvcmZkcykpCiAgICAgICAgcGZkLT5yZXZlbnRzIHw9IFBPTExFUlI7CiAgICB9CiAgfQoKICBnX211dGV4X3VubG9jayAoJnNldC0+bG9jayk7Cn0KI2Vsc2UgLyogR19PU19XSU4zMiAqLwovKgogKiBUcmFuc2xhdGUgZXJyb3JzIHRocm93biBieSB0aGUgV2luc29jayBBUEkgdXNlZCBieSBHc3RQb2xsOgogKiAgIFdTQUV2ZW50U2VsZWN0LCBXU0FXYWl0Rm9yTXVsdGlwbGVFdmVudHMgYW5kIFdTQUVudW1OZXR3b3JrRXZlbnRzCiAqLwpzdGF0aWMgZ2ludApnc3RfcG9sbF93aW5zb2NrX2Vycm9yX3RvX2Vycm5vIChEV09SRCBsYXN0X2Vycm9yKQp7CiAgc3dpdGNoIChsYXN0X2Vycm9yKSB7CiAgICBjYXNlIFdTQV9JTlZBTElEX0hBTkRMRToKICAgIGNhc2UgV1NBRUlOVkFMOgogICAgY2FzZSBXU0FFTk9UU09DSzoKICAgICAgcmV0dXJuIEVCQURGOwoKICAgIGNhc2UgV1NBX05PVF9FTk9VR0hfTUVNT1JZOgogICAgICByZXR1cm4gRU5PTUVNOwoKICAgICAgLyoKICAgICAgICogQW55dGhpbmcgZWxzZSwgaW5jbHVkaW5nOgogICAgICAgKiAgIFdTQV9JTlZBTElEX1BBUkFNRVRFUiwgV1NBRUZBVUxULCBXU0FFSU5QUk9HUkVTUywgV1NBRU5FVERPV04sCiAgICAgICAqICAgV1NBTk9USU5JVElBTElTRUQKICAgICAgICovCiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gRUlOVkFMOwogIH0KfQoKc3RhdGljIHZvaWQKZ3N0X3BvbGxfZnJlZV93aW5zb2NrX2V2ZW50IChHc3RQb2xsICogc2V0LCBnaW50IGlkeCkKewogIFdpbnNvY2tGZCAqd2ZkID0gJmdfYXJyYXlfaW5kZXggKHNldC0+ZmRzLCBXaW5zb2NrRmQsIGlkeCk7CiAgSEFORExFIGV2ZW50ID0gZ19hcnJheV9pbmRleCAoc2V0LT5ldmVudHMsIEhBTkRMRSwgaWR4KTsKCiAgV1NBRXZlbnRTZWxlY3QgKHdmZC0+ZmQsIGV2ZW50LCAwKTsKICBDbG9zZUhhbmRsZSAoZXZlbnQpOwp9CgpzdGF0aWMgdm9pZApnc3RfcG9sbF91cGRhdGVfd2luc29ja19ldmVudF9tYXNrIChHc3RQb2xsICogc2V0LCBnaW50IGlkeCwgZ2xvbmcgZmxhZ3MsCiAgICBnYm9vbGVhbiBhY3RpdmUpCnsKICBXaW5zb2NrRmQgKndmZDsKCiAgd2ZkID0gJmdfYXJyYXlfaW5kZXggKHNldC0+ZmRzLCBXaW5zb2NrRmQsIGlkeCk7CgogIGlmIChhY3RpdmUpCiAgICB3ZmQtPmV2ZW50X21hc2sgfD0gZmxhZ3M7CiAgZWxzZQogICAgd2ZkLT5ldmVudF9tYXNrICY9IH5mbGFnczsKCiAgLyogcmVzZXQgaWdub3JlZCBzdGF0ZSBpZiB0aGUgbmV3IG1hc2sgZG9lc24ndCBvdmVybGFwIGF0IGFsbCAqLwogIGlmICgod2ZkLT5pZ25vcmVkX2V2ZW50X21hc2sgJiB3ZmQtPmV2ZW50X21hc2spID09IDApCiAgICB3ZmQtPmlnbm9yZWRfZXZlbnRfbWFzayA9IDA7Cn0KCnN0YXRpYyBnYm9vbGVhbgpnc3RfcG9sbF9wcmVwYXJlX3dpbnNvY2tfYWN0aXZlX3NldHMgKEdzdFBvbGwgKiBzZXQpCnsKICBndWludCBpOwoKICBnX2FycmF5X3NldF9zaXplIChzZXQtPmFjdGl2ZV9mZHMsIDApOwogIGdfYXJyYXlfc2V0X3NpemUgKHNldC0+YWN0aXZlX2Zkc19pZ25vcmVkLCAwKTsKICBnX2FycmF5X3NldF9zaXplIChzZXQtPmFjdGl2ZV9ldmVudHMsIDApOwogIGdfYXJyYXlfYXBwZW5kX3ZhbCAoc2V0LT5hY3RpdmVfZXZlbnRzLCBzZXQtPndha2V1cF9ldmVudCk7CgogIGZvciAoaSA9IDA7IGkgPCBzZXQtPmZkcy0+bGVuOyBpKyspIHsKICAgIFdpbnNvY2tGZCAqd2ZkID0gJmdfYXJyYXlfaW5kZXggKHNldC0+ZmRzLCBXaW5zb2NrRmQsIGkpOwogICAgSEFORExFIGV2ZW50ID0gZ19hcnJheV9pbmRleCAoc2V0LT5ldmVudHMsIEhBTkRMRSwgaSk7CgogICAgaWYgKHdmZC0+aWdub3JlZF9ldmVudF9tYXNrID09IDApIHsKICAgICAgZ2ludCByZXQ7CgogICAgICBnX2FycmF5X2FwcGVuZF92YWwgKHNldC0+YWN0aXZlX2ZkcywgKndmZCk7CiAgICAgIGdfYXJyYXlfYXBwZW5kX3ZhbCAoc2V0LT5hY3RpdmVfZXZlbnRzLCBldmVudCk7CgogICAgICByZXQgPSBXU0FFdmVudFNlbGVjdCAod2ZkLT5mZCwgZXZlbnQsIHdmZC0+ZXZlbnRfbWFzayk7CiAgICAgIGlmIChHX1VOTElLRUxZIChyZXQgIT0gMCkpIHsKICAgICAgICBlcnJubyA9IGdzdF9wb2xsX3dpbnNvY2tfZXJyb3JfdG9fZXJybm8gKFdTQUdldExhc3RFcnJvciAoKSk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBnX2FycmF5X2FwcGVuZF92YWwgKHNldC0+YWN0aXZlX2Zkc19pZ25vcmVkLCB3ZmQpOwogICAgfQogIH0KCiAgcmV0dXJuIFRSVUU7Cn0KCnN0YXRpYyBnaW50CmdzdF9wb2xsX2NvbGxlY3Rfd2luc29ja19ldmVudHMgKEdzdFBvbGwgKiBzZXQpCnsKICBnaW50IHJlcywgaTsKCiAgLyoKICAgKiBXZSBuZWVkIHRvIGNoZWNrIHdoaWNoIGV2ZW50cyBhcmUgc2lnbmFsZWQsIGFuZCBjYWxsCiAgICogV1NBRW51bU5ldHdvcmtFdmVudHMgZm9yIHRob3NlIHRoYXQgYXJlLCB3aGljaCByZXNldHMKICAgKiB0aGUgZXZlbnQgYW5kIGNsZWFycyB0aGUgaW50ZXJuYWwgbmV0d29yayBldmVudCByZWNvcmRzLgogICAqLwogIHJlcyA9IDA7CiAgZm9yIChpID0gMDsgaSA8IHNldC0+YWN0aXZlX2Zkcy0+bGVuOyBpKyspIHsKICAgIFdpbnNvY2tGZCAqd2ZkID0gJmdfYXJyYXlfaW5kZXggKHNldC0+YWN0aXZlX2ZkcywgV2luc29ja0ZkLCBpKTsKICAgIEhBTkRMRSBldmVudCA9IGdfYXJyYXlfaW5kZXggKHNldC0+YWN0aXZlX2V2ZW50cywgSEFORExFLCBpICsgMSk7CiAgICBEV09SRCB3YWl0X3JldDsKCiAgICB3YWl0X3JldCA9IFdhaXRGb3JTaW5nbGVPYmplY3QgKGV2ZW50LCAwKTsKICAgIGlmICh3YWl0X3JldCA9PSBXQUlUX09CSkVDVF8wKSB7CiAgICAgIGdpbnQgZW51bV9yZXQgPSBXU0FFbnVtTmV0d29ya0V2ZW50cyAod2ZkLT5mZCwgZXZlbnQsICZ3ZmQtPmV2ZW50cyk7CgogICAgICBpZiAoR19VTkxJS0VMWSAoZW51bV9yZXQgIT0gMCkpIHsKICAgICAgICByZXMgPSAtMTsKICAgICAgICBlcnJubyA9IGdzdF9wb2xsX3dpbnNvY2tfZXJyb3JfdG9fZXJybm8gKFdTQUdldExhc3RFcnJvciAoKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICAgIHJlcysrOwogICAgfSBlbHNlIHsKICAgICAgLyogY2xlYXIgYW55IHByZXZpb3VzbHkgc3RvcmVkIHJlc3VsdCAqLwogICAgICBtZW1zZXQgKCZ3ZmQtPmV2ZW50cywgMCwgc2l6ZW9mICh3ZmQtPmV2ZW50cykpOwogICAgfQogIH0KCiAgLyogSWYgYWxsIHdlbnQgd2VsbCB3ZSBhbHNvIG5lZWQgdG8gcmVzZXQgdGhlIGlnbm9yZWQgZmRzLiAqLwogIGlmIChyZXMgPj0gMCkgewogICAgcmVzICs9IHNldC0+YWN0aXZlX2Zkc19pZ25vcmVkLT5sZW47CgogICAgZm9yIChpID0gMDsgaSA8IHNldC0+YWN0aXZlX2Zkc19pZ25vcmVkLT5sZW47IGkrKykgewogICAgICBXaW5zb2NrRmQgKndmZCA9IGdfYXJyYXlfaW5kZXggKHNldC0+YWN0aXZlX2Zkc19pZ25vcmVkLCBXaW5zb2NrRmQgKiwgaSk7CgogICAgICB3ZmQtPmlnbm9yZWRfZXZlbnRfbWFzayA9IDA7CiAgICB9CgogICAgZ19hcnJheV9zZXRfc2l6ZSAoc2V0LT5hY3RpdmVfZmRzX2lnbm9yZWQsIDApOwogIH0KCiAgcmV0dXJuIHJlczsKfQojZW5kaWYKCi8qKgogKiBnc3RfcG9sbF9uZXc6IChza2lwKQogKiBAY29udHJvbGxhYmxlOiB3aGV0aGVyIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBjb250cm9sIGEgd2FpdC4KICoKICogQ3JlYXRlIGEgbmV3IGZpbGUgZGVzY3JpcHRvciBzZXQuIElmIEBjb250cm9sbGFibGUsIGl0CiAqIGlzIHBvc3NpYmxlIHRvIHJlc3RhcnQgb3IgZmx1c2ggYSBjYWxsIHRvIGdzdF9wb2xsX3dhaXQoKSB3aXRoCiAqIGdzdF9wb2xsX3Jlc3RhcnQoKSBhbmQgZ3N0X3BvbGxfc2V0X2ZsdXNoaW5nKCkgcmVzcGVjdGl2ZWx5LgogKgogKiBGcmVlLWZ1bmN0aW9uOiBnc3RfcG9sbF9mcmVlCiAqCiAqIFJldHVybnM6ICh0cmFuc2ZlciBmdWxsKSAobnVsbGFibGUpOiBhIG5ldyAjR3N0UG9sbCwgb3IgJU5VTEwgaW4KICogICAgIGNhc2Ugb2YgYW4gZXJyb3IuICBGcmVlIHdpdGggZ3N0X3BvbGxfZnJlZSgpLgogKi8KR3N0UG9sbCAqCmdzdF9wb2xsX25ldyAoZ2Jvb2xlYW4gY29udHJvbGxhYmxlKQp7CiAgR3N0UG9sbCAqbnNldDsKCiAgbnNldCA9IGdfc2xpY2VfbmV3MCAoR3N0UG9sbCk7CiAgR1NUX0RFQlVHICgiJXA6IG5ldyBjb250cm9sbGFibGUgOiAlZCIsIG5zZXQsIGNvbnRyb2xsYWJsZSk7CiAgZ19tdXRleF9pbml0ICgmbnNldC0+bG9jayk7CiNpZm5kZWYgR19PU19XSU4zMgogIG5zZXQtPm1vZGUgPSBHU1RfUE9MTF9NT0RFX0FVVE87CiAgbnNldC0+ZmRzID0gZ19hcnJheV9uZXcgKEZBTFNFLCBGQUxTRSwgc2l6ZW9mIChzdHJ1Y3QgcG9sbGZkKSk7CiAgbnNldC0+YWN0aXZlX2ZkcyA9IGdfYXJyYXlfbmV3IChGQUxTRSwgRkFMU0UsIHNpemVvZiAoc3RydWN0IHBvbGxmZCkpOwogIG5zZXQtPmNvbnRyb2xfcmVhZF9mZC5mZCA9IC0xOwogIG5zZXQtPmNvbnRyb2xfd3JpdGVfZmQuZmQgPSAtMTsKICB7CiAgICBnaW50IGNvbnRyb2xfc29ja1syXTsKCiAgICBpZiAoc29ja2V0cGFpciAoUEZfVU5JWCwgU09DS19TVFJFQU0sIDAsIGNvbnRyb2xfc29jaykgPCAwKQogICAgICBnb3RvIG5vX3NvY2tldF9wYWlyOwoKICAgIG5zZXQtPmNvbnRyb2xfcmVhZF9mZC5mZCA9IGNvbnRyb2xfc29ja1swXTsKICAgIG5zZXQtPmNvbnRyb2xfd3JpdGVfZmQuZmQgPSBjb250cm9sX3NvY2tbMV07CgogICAgZ3N0X3BvbGxfYWRkX2ZkX3VubG9ja2VkIChuc2V0LCAmbnNldC0+Y29udHJvbF9yZWFkX2ZkKTsKICAgIGdzdF9wb2xsX2ZkX2N0bF9yZWFkX3VubG9ja2VkIChuc2V0LCAmbnNldC0+Y29udHJvbF9yZWFkX2ZkLCBUUlVFKTsKICB9CiNlbHNlCiAgbnNldC0+bW9kZSA9IEdTVF9QT0xMX01PREVfV0lORE9XUzsKICBuc2V0LT5mZHMgPSBnX2FycmF5X25ldyAoRkFMU0UsIEZBTFNFLCBzaXplb2YgKFdpbnNvY2tGZCkpOwogIG5zZXQtPmFjdGl2ZV9mZHMgPSBnX2FycmF5X25ldyAoRkFMU0UsIEZBTFNFLCBzaXplb2YgKFdpbnNvY2tGZCkpOwogIG5zZXQtPmFjdGl2ZV9mZHNfaWdub3JlZCA9IGdfYXJyYXlfbmV3IChGQUxTRSwgRkFMU0UsIHNpemVvZiAoV2luc29ja0ZkICopKTsKICBuc2V0LT5ldmVudHMgPSBnX2FycmF5X25ldyAoRkFMU0UsIEZBTFNFLCBzaXplb2YgKEhBTkRMRSkpOwogIG5zZXQtPmFjdGl2ZV9ldmVudHMgPSBnX2FycmF5X25ldyAoRkFMU0UsIEZBTFNFLCBzaXplb2YgKEhBTkRMRSkpOwoKICBuc2V0LT53YWtldXBfZXZlbnQgPSBDcmVhdGVFdmVudCAoTlVMTCwgVFJVRSwgRkFMU0UsIE5VTEwpOwojZW5kaWYKCiAgLyogZW5zdXJlIChyZSlidWlsZCwgdGhvdWdoIGFscmVhZHkgc25lYWtpbHkgc2V0IGluIG5vbi13aW5kb3dzIGNhc2UgKi8KICBNQVJLX1JFQlVJTEQgKG5zZXQpOwoKICBuc2V0LT5jb250cm9sbGFibGUgPSBjb250cm9sbGFibGU7CiAgbnNldC0+Y29udHJvbF9wZW5kaW5nID0gMDsKCiAgcmV0dXJuIG5zZXQ7CgogIC8qIEVSUk9SUyAqLwojaWZuZGVmIEdfT1NfV0lOMzIKbm9fc29ja2V0X3BhaXI6CiAgewogICAgR1NUX1dBUk5JTkcgKCIlcDogY2FuJ3QgY3JlYXRlIHNvY2tldCBwYWlyICEiLCBuc2V0KTsKICAgIGdzdF9wb2xsX2ZyZWUgKG5zZXQpOwogICAgcmV0dXJuIE5VTEw7CiAgfQojZW5kaWYKfQoKLyoqCiAqIGdzdF9wb2xsX25ld190aW1lcjogKHNraXApCiAqCiAqIENyZWF0ZSBhIG5ldyBwb2xsIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGZvciBzY2hlZHVsaW5nIGNhbmNlbGxhYmxlCiAqIHRpbWVvdXRzLgogKgogKiBBIHRpbWVvdXQgaXMgcGVyZm9ybWVkIHdpdGggZ3N0X3BvbGxfd2FpdCgpLiBNdWx0aXBsZSB0aW1lb3V0cyBjYW4gYmUKICogcGVyZm9ybWVkIGZyb20gZGlmZmVyZW50IHRocmVhZHMuIAogKgogKiBGcmVlLWZ1bmN0aW9uOiBnc3RfcG9sbF9mcmVlCiAqCiAqIFJldHVybnM6ICh0cmFuc2ZlciBmdWxsKSAobnVsbGFibGUpOiBhIG5ldyAjR3N0UG9sbCwgb3IgJU5VTEwgaW4KICogICAgIGNhc2Ugb2YgYW4gZXJyb3IuICBGcmVlIHdpdGggZ3N0X3BvbGxfZnJlZSgpLgogKi8KR3N0UG9sbCAqCmdzdF9wb2xsX25ld190aW1lciAodm9pZCkKewogIEdzdFBvbGwgKnBvbGw7CgogIC8qIG1ha2UgYSBuZXcgY29udHJvbGxhYmxlIHBvbGwgc2V0ICovCiAgaWYgKCEocG9sbCA9IGdzdF9wb2xsX25ldyAoVFJVRSkpKQogICAgZ290byBkb25lOwoKICAvKiB3ZSBhcmUgYSB0aW1lciAqLwogIHBvbGwtPnRpbWVyID0gVFJVRTsKCmRvbmU6CiAgcmV0dXJuIHBvbGw7Cn0KCi8qKgogKiBnc3RfcG9sbF9mcmVlOgogKiBAc2V0OiAodHJhbnNmZXIgZnVsbCk6IGEgZmlsZSBkZXNjcmlwdG9yIHNldC4KICoKICogRnJlZSBhIGZpbGUgZGVzY3JpcHRvciBzZXQuCiAqLwp2b2lkCmdzdF9wb2xsX2ZyZWUgKEdzdFBvbGwgKiBzZXQpCnsKICBnX3JldHVybl9pZl9mYWlsIChzZXQgIT0gTlVMTCk7CgogIEdTVF9ERUJVRyAoIiVwOiBmcmVlaW5nIiwgc2V0KTsKCiNpZm5kZWYgR19PU19XSU4zMgogIGlmIChzZXQtPmNvbnRyb2xfd3JpdGVfZmQuZmQgPj0gMCkKICAgIGNsb3NlIChzZXQtPmNvbnRyb2xfd3JpdGVfZmQuZmQpOwogIGlmIChzZXQtPmNvbnRyb2xfcmVhZF9mZC5mZCA+PSAwKQogICAgY2xvc2UgKHNldC0+Y29udHJvbF9yZWFkX2ZkLmZkKTsKI2Vsc2UKICBDbG9zZUhhbmRsZSAoc2V0LT53YWtldXBfZXZlbnQpOwoKICB7CiAgICBndWludCBpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBzZXQtPmV2ZW50cy0+bGVuOyBpKyspCiAgICAgIGdzdF9wb2xsX2ZyZWVfd2luc29ja19ldmVudCAoc2V0LCBpKTsKICB9CgogIGdfYXJyYXlfZnJlZSAoc2V0LT5hY3RpdmVfZXZlbnRzLCBUUlVFKTsKICBnX2FycmF5X2ZyZWUgKHNldC0+ZXZlbnRzLCBUUlVFKTsKICBnX2FycmF5X2ZyZWUgKHNldC0+YWN0aXZlX2Zkc19pZ25vcmVkLCBUUlVFKTsKI2VuZGlmCgogIGdfYXJyYXlfZnJlZSAoc2V0LT5hY3RpdmVfZmRzLCBUUlVFKTsKICBnX2FycmF5X2ZyZWUgKHNldC0+ZmRzLCBUUlVFKTsKICBnX211dGV4X2NsZWFyICgmc2V0LT5sb2NrKTsKICBnX3NsaWNlX2ZyZWUgKEdzdFBvbGwsIHNldCk7Cn0KCi8qKgogKiBnc3RfcG9sbF9nZXRfcmVhZF9ncG9sbGZkOgogKiBAc2V0OiBhICNHc3RQb2xsCiAqIEBmZDogYSAjR1BvbGxGRAogKgogKiBHZXQgYSBHUG9sbEZEIGZvciB0aGUgcmVhZGluZyBwYXJ0IG9mIHRoZSBjb250cm9sIHNvY2tldC4gVGhpcyBpcyB1c2VmdWwgd2hlbgogKiBpbnRlZ3JhdGluZyB3aXRoIGEgR1NvdXJjZSBhbmQgR01haW5Mb29wLgogKi8Kdm9pZApnc3RfcG9sbF9nZXRfcmVhZF9ncG9sbGZkIChHc3RQb2xsICogc2V0LCBHUG9sbEZEICogZmQpCnsKICBnX3JldHVybl9pZl9mYWlsIChzZXQgIT0gTlVMTCk7CiAgZ19yZXR1cm5faWZfZmFpbCAoZmQgIT0gTlVMTCk7CgojaWZuZGVmIEdfT1NfV0lOMzIKICBmZC0+ZmQgPSBzZXQtPmNvbnRyb2xfcmVhZF9mZC5mZDsKI2Vsc2UKI2lmIEdMSUJfU0laRU9GX1ZPSURfUCA9PSA4CiAgZmQtPmZkID0gKGdpbnQ2NCkgc2V0LT53YWtldXBfZXZlbnQ7CiNlbHNlCiAgZmQtPmZkID0gKGdpbnQpIHNldC0+d2FrZXVwX2V2ZW50OwojZW5kaWYKI2VuZGlmCiAgZmQtPmV2ZW50cyA9IEdfSU9fSU4gfCBHX0lPX0hVUCB8IEdfSU9fRVJSOwogIGZkLT5yZXZlbnRzID0gMDsKfQoKLyoqCiAqIGdzdF9wb2xsX2ZkX2luaXQ6CiAqIEBmZDogYSAjR3N0UG9sbEZECiAqCiAqIEluaXRpYWxpemVzIEBmZC4gQWx0ZXJuYXRpdmVseSB5b3UgY2FuIGluaXRpYWxpemUgaXQgd2l0aAogKiAjR1NUX1BPTExfRkRfSU5JVC4KICovCnZvaWQKZ3N0X3BvbGxfZmRfaW5pdCAoR3N0UG9sbEZEICogZmQpCnsKICBnX3JldHVybl9pZl9mYWlsIChmZCAhPSBOVUxMKTsKCiAgZmQtPmZkID0gLTE7CiAgZmQtPmlkeCA9IC0xOwp9CgpzdGF0aWMgZ2Jvb2xlYW4KZ3N0X3BvbGxfYWRkX2ZkX3VubG9ja2VkIChHc3RQb2xsICogc2V0LCBHc3RQb2xsRkQgKiBmZCkKewogIGdpbnQgaWR4OwoKICBHU1RfREVCVUcgKCIlcDogZmQgKGZkOiVkLCBpZHg6JWQpIiwgc2V0LCBmZC0+ZmQsIGZkLT5pZHgpOwoKICBpZHggPSBmaW5kX2luZGV4IChzZXQtPmZkcywgZmQpOwogIGlmIChpZHggPCAwKSB7CiNpZm5kZWYgR19PU19XSU4zMgogICAgc3RydWN0IHBvbGxmZCBuZmQ7CgogICAgbmZkLmZkID0gZmQtPmZkOwogICAgbmZkLmV2ZW50cyA9IFBPTExFUlIgfCBQT0xMTlZBTCB8IFBPTExIVVA7CiAgICBuZmQucmV2ZW50cyA9IDA7CgogICAgZ19hcnJheV9hcHBlbmRfdmFsIChzZXQtPmZkcywgbmZkKTsKCiAgICBmZC0+aWR4ID0gc2V0LT5mZHMtPmxlbiAtIDE7CiNlbHNlCiAgICBXaW5zb2NrRmQgd2ZkOwogICAgSEFORExFIGV2ZW50OwoKICAgIHdmZC5mZCA9IGZkLT5mZDsKICAgIHdmZC5ldmVudF9tYXNrID0gRkRfQ0xPU0U7CiAgICBtZW1zZXQgKCZ3ZmQuZXZlbnRzLCAwLCBzaXplb2YgKHdmZC5ldmVudHMpKTsKICAgIHdmZC5pZ25vcmVkX2V2ZW50X21hc2sgPSAwOwogICAgZXZlbnQgPSBXU0FDcmVhdGVFdmVudCAoKTsKCiAgICBnX2FycmF5X2FwcGVuZF92YWwgKHNldC0+ZmRzLCB3ZmQpOwogICAgZ19hcnJheV9hcHBlbmRfdmFsIChzZXQtPmV2ZW50cywgZXZlbnQpOwoKICAgIGZkLT5pZHggPSBzZXQtPmZkcy0+bGVuIC0gMTsKI2VuZGlmCiAgICBNQVJLX1JFQlVJTEQgKHNldCk7CiAgfSBlbHNlIHsKICAgIEdTVF9XQVJOSU5HICgiJXA6IGZkIGFscmVhZHkgYWRkZWQgISIsIHNldCk7CiAgfQoKICByZXR1cm4gVFJVRTsKfQoKLyoqCiAqIGdzdF9wb2xsX2FkZF9mZDoKICogQHNldDogYSBmaWxlIGRlc2NyaXB0b3Igc2V0LgogKiBAZmQ6IGEgZmlsZSBkZXNjcmlwdG9yLgogKgogKiBBZGQgYSBmaWxlIGRlc2NyaXB0b3IgdG8gdGhlIGZpbGUgZGVzY3JpcHRvciBzZXQuCiAqCiAqIFJldHVybnM6ICVUUlVFIGlmIHRoZSBmaWxlIGRlc2NyaXB0b3Igd2FzIHN1Y2Nlc3NmdWxseSBhZGRlZCB0byB0aGUgc2V0LgogKi8KZ2Jvb2xlYW4KZ3N0X3BvbGxfYWRkX2ZkIChHc3RQb2xsICogc2V0LCBHc3RQb2xsRkQgKiBmZCkKewogIGdib29sZWFuIHJldDsKCiAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNldCAhPSBOVUxMLCBGQUxTRSk7CiAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGZkICE9IE5VTEwsIEZBTFNFKTsKICBnX3JldHVybl92YWxfaWZfZmFpbCAoZmQtPmZkID49IDAsIEZBTFNFKTsKCiAgZ19tdXRleF9sb2NrICgmc2V0LT5sb2NrKTsKCiAgcmV0ID0gZ3N0X3BvbGxfYWRkX2ZkX3VubG9ja2VkIChzZXQsIGZkKTsKCiAgZ19tdXRleF91bmxvY2sgKCZzZXQtPmxvY2spOwoKICByZXR1cm4gcmV0Owp9CgovKioKICogZ3N0X3BvbGxfcmVtb3ZlX2ZkOgogKiBAc2V0OiBhIGZpbGUgZGVzY3JpcHRvciBzZXQuCiAqIEBmZDogYSBmaWxlIGRlc2NyaXB0b3IuCiAqCiAqIFJlbW92ZSBhIGZpbGUgZGVzY3JpcHRvciBmcm9tIHRoZSBmaWxlIGRlc2NyaXB0b3Igc2V0LgogKgogKiBSZXR1cm5zOiAlVFJVRSBpZiB0aGUgZmlsZSBkZXNjcmlwdG9yIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZCBmcm9tIHRoZSBzZXQuCiAqLwpnYm9vbGVhbgpnc3RfcG9sbF9yZW1vdmVfZmQgKEdzdFBvbGwgKiBzZXQsIEdzdFBvbGxGRCAqIGZkKQp7CiAgZ2ludCBpZHg7CgogIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZXQgIT0gTlVMTCwgRkFMU0UpOwogIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChmZCAhPSBOVUxMLCBGQUxTRSk7CiAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGZkLT5mZCA+PSAwLCBGQUxTRSk7CgoKICBHU1RfREVCVUcgKCIlcDogZmQgKGZkOiVkLCBpZHg6JWQpIiwgc2V0LCBmZC0+ZmQsIGZkLT5pZHgpOwoKICBnX211dGV4X2xvY2sgKCZzZXQtPmxvY2spOwoKICAvKiBnZXQgdGhlIGluZGV4LCAtMSBpcyBhbiBmZCB0aGF0IGlzIG5vdCBhZGRlZCAqLwogIGlkeCA9IGZpbmRfaW5kZXggKHNldC0+ZmRzLCBmZCk7CiAgaWYgKGlkeCA+PSAwKSB7CiNpZmRlZiBHX09TX1dJTjMyCiAgICBnc3RfcG9sbF9mcmVlX3dpbnNvY2tfZXZlbnQgKHNldCwgaWR4KTsKICAgIGdfYXJyYXlfcmVtb3ZlX2luZGV4X2Zhc3QgKHNldC0+ZXZlbnRzLCBpZHgpOwojZW5kaWYKCiAgICAvKiByZW1vdmUgdGhlIGZkIGF0IGluZGV4LCB3ZSB1c2UgX3JlbW92ZV9pbmRleF9mYXN0LCB3aGljaCBjb3BpZXMgdGhlIGxhc3QKICAgICAqIGVsZW1lbnQgb2YgdGhlIGFycmF5IHRvIHRoZSBmcmVlZCBpbmRleCAqLwogICAgZ19hcnJheV9yZW1vdmVfaW5kZXhfZmFzdCAoc2V0LT5mZHMsIGlkeCk7CgogICAgLyogbWFyayBmZCBhcyByZW1vdmVkIGJ5IHNldHRpbmcgdGhlIGluZGV4IHRvIC0xICovCiAgICBmZC0+aWR4ID0gLTE7CiAgICBNQVJLX1JFQlVJTEQgKHNldCk7CiAgfSBlbHNlIHsKICAgIEdTVF9XQVJOSU5HICgiJXA6IGNvdWxkbid0IGZpbmQgZmQgISIsIHNldCk7CiAgfQoKICBnX211dGV4X3VubG9jayAoJnNldC0+bG9jayk7CgogIHJldHVybiBpZHggPj0gMDsKfQoKLyoqCiAqIGdzdF9wb2xsX2ZkX2N0bF93cml0ZToKICogQHNldDogYSBmaWxlIGRlc2NyaXB0b3Igc2V0LgogKiBAZmQ6IGEgZmlsZSBkZXNjcmlwdG9yLgogKiBAYWN0aXZlOiBhIG5ldyBzdGF0dXMuCiAqCiAqIENvbnRyb2wgd2hldGhlciB0aGUgZGVzY3JpcHRvciBAZmQgaW4gQHNldCB3aWxsIGJlIG1vbml0b3JlZCBmb3IKICogd3JpdGFiaWxpdHkuCiAqCiAqIFJldHVybnM6ICVUUlVFIGlmIHRoZSBkZXNjcmlwdG9yIHdhcyBzdWNjZXNzZnVsbHkgdXBkYXRlZC4KICovCmdib29sZWFuCmdzdF9wb2xsX2ZkX2N0bF93cml0ZSAoR3N0UG9sbCAqIHNldCwgR3N0UG9sbEZEICogZmQsIGdib29sZWFuIGFjdGl2ZSkKewogIGdpbnQgaWR4OwoKICBnX3JldHVybl92YWxfaWZfZmFpbCAoc2V0ICE9IE5VTEwsIEZBTFNFKTsKICBnX3JldHVybl92YWxfaWZfZmFpbCAoZmQgIT0gTlVMTCwgRkFMU0UpOwogIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChmZC0+ZmQgPj0gMCwgRkFMU0UpOwoKICBHU1RfREVCVUcgKCIlcDogZmQgKGZkOiVkLCBpZHg6JWQpLCBhY3RpdmUgOiAlZCIsIHNldCwKICAgICAgZmQtPmZkLCBmZC0+aWR4LCBhY3RpdmUpOwoKICBnX211dGV4X2xvY2sgKCZzZXQtPmxvY2spOwoKICBpZHggPSBmaW5kX2luZGV4IChzZXQtPmZkcywgZmQpOwogIGlmIChpZHggPj0gMCkgewojaWZuZGVmIEdfT1NfV0lOMzIKICAgIHN0cnVjdCBwb2xsZmQgKnBmZCA9ICZnX2FycmF5X2luZGV4IChzZXQtPmZkcywgc3RydWN0IHBvbGxmZCwgaWR4KTsKCiAgICBpZiAoYWN0aXZlKQogICAgICBwZmQtPmV2ZW50cyB8PSBQT0xMT1VUOwogICAgZWxzZQogICAgICBwZmQtPmV2ZW50cyAmPSB+UE9MTE9VVDsKCiAgICBHU1RfTE9HICgiJXA6IHBmZC0+ZXZlbnRzIG5vdyAlZCAoUE9MTE9VVDolZCkiLCBzZXQsIHBmZC0+ZXZlbnRzLCBQT0xMT1VUKTsKI2Vsc2UKICAgIGdzdF9wb2xsX3VwZGF0ZV93aW5zb2NrX2V2ZW50X21hc2sgKHNldCwgaWR4LCBGRF9XUklURSB8IEZEX0NPTk5FQ1QsCiAgICAgICAgYWN0aXZlKTsKI2VuZGlmCiAgICBNQVJLX1JFQlVJTEQgKHNldCk7CiAgfSBlbHNlIHsKICAgIEdTVF9XQVJOSU5HICgiJXA6IGNvdWxkbid0IGZpbmQgZmQgISIsIHNldCk7CiAgfQoKICBnX211dGV4X3VubG9jayAoJnNldC0+bG9jayk7CgogIHJldHVybiBpZHggPj0gMDsKfQoKc3RhdGljIGdib29sZWFuCmdzdF9wb2xsX2ZkX2N0bF9yZWFkX3VubG9ja2VkIChHc3RQb2xsICogc2V0LCBHc3RQb2xsRkQgKiBmZCwgZ2Jvb2xlYW4gYWN0aXZlKQp7CiAgZ2ludCBpZHg7CgogIEdTVF9ERUJVRyAoIiVwOiBmZCAoZmQ6JWQsIGlkeDolZCksIGFjdGl2ZSA6ICVkIiwgc2V0LAogICAgICBmZC0+ZmQsIGZkLT5pZHgsIGFjdGl2ZSk7CgogIGlkeCA9IGZpbmRfaW5kZXggKHNldC0+ZmRzLCBmZCk7CgogIGlmIChpZHggPj0gMCkgewojaWZuZGVmIEdfT1NfV0lOMzIKICAgIHN0cnVjdCBwb2xsZmQgKnBmZCA9ICZnX2FycmF5X2luZGV4IChzZXQtPmZkcywgc3RydWN0IHBvbGxmZCwgaWR4KTsKCiAgICBpZiAoYWN0aXZlKQogICAgICBwZmQtPmV2ZW50cyB8PSAoUE9MTElOIHwgUE9MTFBSSSk7CiAgICBlbHNlCiAgICAgIHBmZC0+ZXZlbnRzICY9IH4oUE9MTElOIHwgUE9MTFBSSSk7CiNlbHNlCiAgICBnc3RfcG9sbF91cGRhdGVfd2luc29ja19ldmVudF9tYXNrIChzZXQsIGlkeCwgRkRfUkVBRCB8IEZEX0FDQ0VQVCwgYWN0aXZlKTsKI2VuZGlmCiAgICBNQVJLX1JFQlVJTEQgKHNldCk7CiAgfSBlbHNlIHsKICAgIEdTVF9XQVJOSU5HICgiJXA6IGNvdWxkbid0IGZpbmQgZmQgISIsIHNldCk7CiAgfQoKICByZXR1cm4gaWR4ID49IDA7Cn0KCi8qKgogKiBnc3RfcG9sbF9mZF9jdGxfcmVhZDoKICogQHNldDogYSBmaWxlIGRlc2NyaXB0b3Igc2V0LgogKiBAZmQ6IGEgZmlsZSBkZXNjcmlwdG9yLgogKiBAYWN0aXZlOiBhIG5ldyBzdGF0dXMuCiAqCiAqIENvbnRyb2wgd2hldGhlciB0aGUgZGVzY3JpcHRvciBAZmQgaW4gQHNldCB3aWxsIGJlIG1vbml0b3JlZCBmb3IKICogcmVhZGFiaWxpdHkuCiAqCiAqIFJldHVybnM6ICVUUlVFIGlmIHRoZSBkZXNjcmlwdG9yIHdhcyBzdWNjZXNzZnVsbHkgdXBkYXRlZC4KICovCmdib29sZWFuCmdzdF9wb2xsX2ZkX2N0bF9yZWFkIChHc3RQb2xsICogc2V0LCBHc3RQb2xsRkQgKiBmZCwgZ2Jvb2xlYW4gYWN0aXZlKQp7CiAgZ2Jvb2xlYW4gcmV0OwoKICBnX3JldHVybl92YWxfaWZfZmFpbCAoc2V0ICE9IE5VTEwsIEZBTFNFKTsKICBnX3JldHVybl92YWxfaWZfZmFpbCAoZmQgIT0gTlVMTCwgRkFMU0UpOwogIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChmZC0+ZmQgPj0gMCwgRkFMU0UpOwoKICBnX211dGV4X2xvY2sgKCZzZXQtPmxvY2spOwoKICByZXQgPSBnc3RfcG9sbF9mZF9jdGxfcmVhZF91bmxvY2tlZCAoc2V0LCBmZCwgYWN0aXZlKTsKCiAgZ19tdXRleF91bmxvY2sgKCZzZXQtPmxvY2spOwoKICByZXR1cm4gcmV0Owp9CgovKioKICogZ3N0X3BvbGxfZmRfaWdub3JlZDoKICogQHNldDogYSBmaWxlIGRlc2NyaXB0b3Igc2V0LgogKiBAZmQ6IGEgZmlsZSBkZXNjcmlwdG9yLgogKgogKiBNYXJrIEBmZCBhcyBpZ25vcmVkIHNvIHRoYXQgdGhlIG5leHQgY2FsbCB0byBnc3RfcG9sbF93YWl0KCkgd2lsbCB5aWVsZAogKiB0aGUgc2FtZSByZXN1bHQgZm9yIEBmZCBhcyBsYXN0IHRpbWUuIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaWYgbm8KICogb3BlcmF0aW9uIChyZWFkL3dyaXRlL3JlY3Yvc2VuZC9ldGMuKSB3aWxsIGJlIHBlcmZvcm1lZCBvbiBAZmQgYmVmb3JlCiAqIHRoZSBuZXh0IGNhbGwgdG8gZ3N0X3BvbGxfd2FpdCgpLgogKgogKiBUaGUgcmVhc29uIHdoeSB0aGlzIGlzIG5lZWRlZCBpcyBiZWNhdXNlIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uCiAqIG1pZ2h0IG5vdCBhbGxvdyBxdWVyeWluZyB0aGUgZmQgbW9yZSB0aGFuIG9uY2UgYmV0d2VlbiBjYWxscyB0byBvbmUgb2YKICogdGhlIHJlLWVuYWJsaW5nIG9wZXJhdGlvbnMuCiAqLwp2b2lkCmdzdF9wb2xsX2ZkX2lnbm9yZWQgKEdzdFBvbGwgKiBzZXQsIEdzdFBvbGxGRCAqIGZkKQp7CiNpZmRlZiBHX09TX1dJTjMyCiAgZ2ludCBpZHg7CgogIGdfcmV0dXJuX2lmX2ZhaWwgKHNldCAhPSBOVUxMKTsKICBnX3JldHVybl9pZl9mYWlsIChmZCAhPSBOVUxMKTsKICBnX3JldHVybl9pZl9mYWlsIChmZC0+ZmQgPj0gMCk7CgogIGdfbXV0ZXhfbG9jayAoJnNldC0+bG9jayk7CgogIGlkeCA9IGZpbmRfaW5kZXggKHNldC0+ZmRzLCBmZCk7CiAgaWYgKGlkeCA+PSAwKSB7CiAgICBXaW5zb2NrRmQgKndmZCA9ICZnX2FycmF5X2luZGV4IChzZXQtPmZkcywgV2luc29ja0ZkLCBpZHgpOwoKICAgIHdmZC0+aWdub3JlZF9ldmVudF9tYXNrID0gd2ZkLT5ldmVudF9tYXNrICYgKEZEX1JFQUQgfCBGRF9XUklURSk7CiAgICBNQVJLX1JFQlVJTEQgKHNldCk7CiAgfQoKICBnX211dGV4X3VubG9jayAoJnNldC0+bG9jayk7CiNlbmRpZgp9CgovKioKICogZ3N0X3BvbGxfZmRfaGFzX2Nsb3NlZDoKICogQHNldDogYSBmaWxlIGRlc2NyaXB0b3Igc2V0LgogKiBAZmQ6IGEgZmlsZSBkZXNjcmlwdG9yLgogKgogKiBDaGVjayBpZiBAZmQgaW4gQHNldCBoYXMgY2xvc2VkIHRoZSBjb25uZWN0aW9uLgogKgogKiBSZXR1cm5zOiAlVFJVRSBpZiB0aGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkLgogKi8KZ2Jvb2xlYW4KZ3N0X3BvbGxfZmRfaGFzX2Nsb3NlZCAoY29uc3QgR3N0UG9sbCAqIHNldCwgR3N0UG9sbEZEICogZmQpCnsKICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKICBnaW50IGlkeDsKCiAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNldCAhPSBOVUxMLCBGQUxTRSk7CiAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGZkICE9IE5VTEwsIEZBTFNFKTsKICBnX3JldHVybl92YWxfaWZfZmFpbCAoZmQtPmZkID49IDAsIEZBTFNFKTsKCiAgZ19tdXRleF9sb2NrICgmKChHc3RQb2xsICopIHNldCktPmxvY2spOwoKICBpZHggPSBmaW5kX2luZGV4IChzZXQtPmFjdGl2ZV9mZHMsIGZkKTsKICBpZiAoaWR4ID49IDApIHsKI2lmbmRlZiBHX09TX1dJTjMyCiAgICBzdHJ1Y3QgcG9sbGZkICpwZmQgPSAmZ19hcnJheV9pbmRleCAoc2V0LT5hY3RpdmVfZmRzLCBzdHJ1Y3QgcG9sbGZkLCBpZHgpOwoKICAgIHJlcyA9IChwZmQtPnJldmVudHMgJiBQT0xMSFVQKSAhPSAwOwojZWxzZQogICAgV2luc29ja0ZkICp3ZmQgPSAmZ19hcnJheV9pbmRleCAoc2V0LT5hY3RpdmVfZmRzLCBXaW5zb2NrRmQsIGlkeCk7CgogICAgcmVzID0gKHdmZC0+ZXZlbnRzLmxOZXR3b3JrRXZlbnRzICYgRkRfQ0xPU0UpICE9IDA7CiNlbmRpZgogIH0gZWxzZSB7CiAgICBHU1RfV0FSTklORyAoIiVwOiBjb3VsZG4ndCBmaW5kIGZkICEiLCBzZXQpOwogIH0KICBnX211dGV4X3VubG9jayAoJigoR3N0UG9sbCAqKSBzZXQpLT5sb2NrKTsKCiAgR1NUX0RFQlVHICgiJXA6IGZkIChmZDolZCwgaWR4OiVkKSAlZCIsIHNldCwgZmQtPmZkLCBmZC0+aWR4LCByZXMpOwoKICByZXR1cm4gcmVzOwp9CgovKioKICogZ3N0X3BvbGxfZmRfaGFzX2Vycm9yOgogKiBAc2V0OiBhIGZpbGUgZGVzY3JpcHRvciBzZXQuCiAqIEBmZDogYSBmaWxlIGRlc2NyaXB0b3IuCiAqCiAqIENoZWNrIGlmIEBmZCBpbiBAc2V0IGhhcyBhbiBlcnJvci4KICoKICogUmV0dXJuczogJVRSVUUgaWYgdGhlIGRlc2NyaXB0b3IgaGFzIGFuIGVycm9yLgogKi8KZ2Jvb2xlYW4KZ3N0X3BvbGxfZmRfaGFzX2Vycm9yIChjb25zdCBHc3RQb2xsICogc2V0LCBHc3RQb2xsRkQgKiBmZCkKewogIGdib29sZWFuIHJlcyA9IEZBTFNFOwogIGdpbnQgaWR4OwoKICBnX3JldHVybl92YWxfaWZfZmFpbCAoc2V0ICE9IE5VTEwsIEZBTFNFKTsKICBnX3JldHVybl92YWxfaWZfZmFpbCAoZmQgIT0gTlVMTCwgRkFMU0UpOwogIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChmZC0+ZmQgPj0gMCwgRkFMU0UpOwoKICBnX211dGV4X2xvY2sgKCYoKEdzdFBvbGwgKikgc2V0KS0+bG9jayk7CgogIGlkeCA9IGZpbmRfaW5kZXggKHNldC0+YWN0aXZlX2ZkcywgZmQpOwogIGlmIChpZHggPj0gMCkgewojaWZuZGVmIEdfT1NfV0lOMzIKICAgIHN0cnVjdCBwb2xsZmQgKnBmZCA9ICZnX2FycmF5X2luZGV4IChzZXQtPmFjdGl2ZV9mZHMsIHN0cnVjdCBwb2xsZmQsIGlkeCk7CgogICAgcmVzID0gKHBmZC0+cmV2ZW50cyAmIChQT0xMRVJSIHwgUE9MTE5WQUwpKSAhPSAwOwojZWxzZQogICAgV2luc29ja0ZkICp3ZmQgPSAmZ19hcnJheV9pbmRleCAoc2V0LT5hY3RpdmVfZmRzLCBXaW5zb2NrRmQsIGlkeCk7CgogICAgcmVzID0gKHdmZC0+ZXZlbnRzLmlFcnJvckNvZGVbRkRfQ0xPU0VfQklUXSAhPSAwKSB8fAogICAgICAgICh3ZmQtPmV2ZW50cy5pRXJyb3JDb2RlW0ZEX1JFQURfQklUXSAhPSAwKSB8fAogICAgICAgICh3ZmQtPmV2ZW50cy5pRXJyb3JDb2RlW0ZEX1dSSVRFX0JJVF0gIT0gMCkgfHwKICAgICAgICAod2ZkLT5ldmVudHMuaUVycm9yQ29kZVtGRF9BQ0NFUFRfQklUXSAhPSAwKSB8fAogICAgICAgICh3ZmQtPmV2ZW50cy5pRXJyb3JDb2RlW0ZEX0NPTk5FQ1RfQklUXSAhPSAwKTsKI2VuZGlmCiAgfSBlbHNlIHsKICAgIEdTVF9XQVJOSU5HICgiJXA6IGNvdWxkbid0IGZpbmQgZmQgISIsIHNldCk7CiAgfQogIGdfbXV0ZXhfdW5sb2NrICgmKChHc3RQb2xsICopIHNldCktPmxvY2spOwoKICBHU1RfREVCVUcgKCIlcDogZmQgKGZkOiVkLCBpZHg6JWQpICVkIiwgc2V0LCBmZC0+ZmQsIGZkLT5pZHgsIHJlcyk7CgogIHJldHVybiByZXM7Cn0KCnN0YXRpYyBnYm9vbGVhbgpnc3RfcG9sbF9mZF9jYW5fcmVhZF91bmxvY2tlZCAoY29uc3QgR3N0UG9sbCAqIHNldCwgR3N0UG9sbEZEICogZmQpCnsKICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKICBnaW50IGlkeDsKCiAgaWR4ID0gZmluZF9pbmRleCAoc2V0LT5hY3RpdmVfZmRzLCBmZCk7CiAgaWYgKGlkeCA+PSAwKSB7CiNpZm5kZWYgR19PU19XSU4zMgogICAgc3RydWN0IHBvbGxmZCAqcGZkID0gJmdfYXJyYXlfaW5kZXggKHNldC0+YWN0aXZlX2Zkcywgc3RydWN0IHBvbGxmZCwgaWR4KTsKCiAgICByZXMgPSAocGZkLT5yZXZlbnRzICYgKFBPTExJTiB8IFBPTExQUkkpKSAhPSAwOwojZWxzZQogICAgV2luc29ja0ZkICp3ZmQgPSAmZ19hcnJheV9pbmRleCAoc2V0LT5hY3RpdmVfZmRzLCBXaW5zb2NrRmQsIGlkeCk7CgogICAgcmVzID0gKHdmZC0+ZXZlbnRzLmxOZXR3b3JrRXZlbnRzICYgKEZEX1JFQUQgfCBGRF9BQ0NFUFQpKSAhPSAwOwojZW5kaWYKICB9IGVsc2UgewogICAgR1NUX1dBUk5JTkcgKCIlcDogY291bGRuJ3QgZmluZCBmZCAhIiwgc2V0KTsKICB9CiAgR1NUX0RFQlVHICgiJXA6IGZkIChmZDolZCwgaWR4OiVkKSAlZCIsIHNldCwgZmQtPmZkLCBmZC0+aWR4LCByZXMpOwoKICByZXR1cm4gcmVzOwp9CgovKioKICogZ3N0X3BvbGxfZmRfY2FuX3JlYWQ6CiAqIEBzZXQ6IGEgZmlsZSBkZXNjcmlwdG9yIHNldC4KICogQGZkOiBhIGZpbGUgZGVzY3JpcHRvci4KICoKICogQ2hlY2sgaWYgQGZkIGluIEBzZXQgaGFzIGRhdGEgdG8gYmUgcmVhZC4KICoKICogUmV0dXJuczogJVRSVUUgaWYgdGhlIGRlc2NyaXB0b3IgaGFzIGRhdGEgdG8gYmUgcmVhZC4KICovCmdib29sZWFuCmdzdF9wb2xsX2ZkX2Nhbl9yZWFkIChjb25zdCBHc3RQb2xsICogc2V0LCBHc3RQb2xsRkQgKiBmZCkKewogIGdib29sZWFuIHJlcyA9IEZBTFNFOwoKICBnX3JldHVybl92YWxfaWZfZmFpbCAoc2V0ICE9IE5VTEwsIEZBTFNFKTsKICBnX3JldHVybl92YWxfaWZfZmFpbCAoZmQgIT0gTlVMTCwgRkFMU0UpOwogIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChmZC0+ZmQgPj0gMCwgRkFMU0UpOwoKICBnX211dGV4X2xvY2sgKCYoKEdzdFBvbGwgKikgc2V0KS0+bG9jayk7CgogIHJlcyA9IGdzdF9wb2xsX2ZkX2Nhbl9yZWFkX3VubG9ja2VkIChzZXQsIGZkKTsKCiAgZ19tdXRleF91bmxvY2sgKCYoKEdzdFBvbGwgKikgc2V0KS0+bG9jayk7CgogIHJldHVybiByZXM7Cn0KCi8qKgogKiBnc3RfcG9sbF9mZF9jYW5fd3JpdGU6CiAqIEBzZXQ6IGEgZmlsZSBkZXNjcmlwdG9yIHNldC4KICogQGZkOiBhIGZpbGUgZGVzY3JpcHRvci4KICoKICogQ2hlY2sgaWYgQGZkIGluIEBzZXQgY2FuIGJlIHVzZWQgZm9yIHdyaXRpbmcuCiAqCiAqIFJldHVybnM6ICVUUlVFIGlmIHRoZSBkZXNjcmlwdG9yIGNhbiBiZSB1c2VkIGZvciB3cml0aW5nLgogKi8KZ2Jvb2xlYW4KZ3N0X3BvbGxfZmRfY2FuX3dyaXRlIChjb25zdCBHc3RQb2xsICogc2V0LCBHc3RQb2xsRkQgKiBmZCkKewogIGdib29sZWFuIHJlcyA9IEZBTFNFOwogIGdpbnQgaWR4OwoKICBnX3JldHVybl92YWxfaWZfZmFpbCAoc2V0ICE9IE5VTEwsIEZBTFNFKTsKICBnX3JldHVybl92YWxfaWZfZmFpbCAoZmQgIT0gTlVMTCwgRkFMU0UpOwogIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChmZC0+ZmQgPj0gMCwgRkFMU0UpOwoKICBnX211dGV4X2xvY2sgKCYoKEdzdFBvbGwgKikgc2V0KS0+bG9jayk7CgogIGlkeCA9IGZpbmRfaW5kZXggKHNldC0+YWN0aXZlX2ZkcywgZmQpOwogIGlmIChpZHggPj0gMCkgewojaWZuZGVmIEdfT1NfV0lOMzIKICAgIHN0cnVjdCBwb2xsZmQgKnBmZCA9ICZnX2FycmF5X2luZGV4IChzZXQtPmFjdGl2ZV9mZHMsIHN0cnVjdCBwb2xsZmQsIGlkeCk7CgogICAgcmVzID0gKHBmZC0+cmV2ZW50cyAmIFBPTExPVVQpICE9IDA7CiNlbHNlCiAgICBXaW5zb2NrRmQgKndmZCA9ICZnX2FycmF5X2luZGV4IChzZXQtPmFjdGl2ZV9mZHMsIFdpbnNvY2tGZCwgaWR4KTsKCiAgICByZXMgPSAod2ZkLT5ldmVudHMubE5ldHdvcmtFdmVudHMgJiBGRF9XUklURSkgIT0gMDsKI2VuZGlmCiAgfSBlbHNlIHsKICAgIEdTVF9XQVJOSU5HICgiJXA6IGNvdWxkbid0IGZpbmQgZmQgISIsIHNldCk7CiAgfQogIGdfbXV0ZXhfdW5sb2NrICgmKChHc3RQb2xsICopIHNldCktPmxvY2spOwoKICBHU1RfREVCVUcgKCIlcDogZmQgKGZkOiVkLCBpZHg6JWQpICVkIiwgc2V0LCBmZC0+ZmQsIGZkLT5pZHgsIHJlcyk7CgogIHJldHVybiByZXM7Cn0KCi8qKgogKiBnc3RfcG9sbF93YWl0OgogKiBAc2V0OiBhICNHc3RQb2xsLgogKiBAdGltZW91dDogYSB0aW1lb3V0IGluIG5hbm9zZWNvbmRzLgogKgogKiBXYWl0IGZvciBhY3Rpdml0eSBvbiB0aGUgZmlsZSBkZXNjcmlwdG9ycyBpbiBAc2V0LiBUaGlzIGZ1bmN0aW9uIHdhaXRzIHVwIHRvCiAqIHRoZSBzcGVjaWZpZWQgQHRpbWVvdXQuICBBIHRpbWVvdXQgb2YgI0dTVF9DTE9DS19USU1FX05PTkUgd2FpdHMgZm9yZXZlci4KICoKICogRm9yICNHc3RQb2xsIG9iamVjdHMgY3JlYXRlZCB3aXRoIGdzdF9wb2xsX25ldygpLCB0aGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlCiAqIGNhbGxlZCBmcm9tIGEgc2luZ2xlIHRocmVhZCBhdCBhIHRpbWUuICBJZiBjYWxsZWQgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLAogKiAtMSB3aWxsIGJlIHJldHVybmVkIHdpdGggZXJybm8gc2V0IHRvIEVQRVJNLgogKgogKiBUaGlzIGlzIG5vdCB0cnVlIGZvciB0aW1lciAjR3N0UG9sbCBvYmplY3RzIGNyZWF0ZWQgd2l0aAogKiBnc3RfcG9sbF9uZXdfdGltZXIoKSwgd2hlcmUgaXQgaXMgYWxsb3dlZCB0byBoYXZlIG11bHRpcGxlIHRocmVhZHMgd2FpdGluZwogKiBzaW11bHRhbmVvdXNseS4KICoKICogUmV0dXJuczogVGhlIG51bWJlciBvZiAjR3N0UG9sbEZEIGluIEBzZXQgdGhhdCBoYXZlIGFjdGl2aXR5IG9yIDAgd2hlbiBubwogKiBhY3Rpdml0eSB3YXMgZGV0ZWN0ZWQgYWZ0ZXIgQHRpbWVvdXQuIElmIGFuIGVycm9yIG9jY3VycywgLTEgaXMgcmV0dXJuZWQKICogYW5kIGVycm5vIGlzIHNldC4KICovCmdpbnQKZ3N0X3BvbGxfd2FpdCAoR3N0UG9sbCAqIHNldCwgR3N0Q2xvY2tUaW1lIHRpbWVvdXQpCnsKICBnYm9vbGVhbiByZXN0YXJ0aW5nOwogIGdib29sZWFuIGlzX3RpbWVyOwogIGludCByZXM7CiAgZ2ludCBvbGRfd2FpdGluZzsKCiAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNldCAhPSBOVUxMLCAtMSk7CgogIEdTVF9ERUJVRyAoIiVwOiB0aW1lb3V0IDolIiBHU1RfVElNRV9GT1JNQVQsIHNldCwgR1NUX1RJTUVfQVJHUyAodGltZW91dCkpOwoKICBpc190aW1lciA9IHNldC0+dGltZXI7CgogIC8qIGFkZCBvbmUgbW9yZSB3YWl0ZXIgKi8KICBvbGRfd2FpdGluZyA9IElOQ19XQUlUSU5HIChzZXQpOwoKICAvKiB3ZSBjYW5ub3Qgd2FpdCBmcm9tIG11bHRpcGxlIHRocmVhZHMgdW5sZXNzIHdlIGFyZSBhIHRpbWVyICovCiAgaWYgKEdfVU5MSUtFTFkgKG9sZF93YWl0aW5nID4gMCAmJiAhaXNfdGltZXIpKQogICAgZ290byBhbHJlYWR5X3dhaXRpbmc7CgogIC8qIGZsdXNoaW5nLCBleGl0IGltbWVkaWF0ZWx5ICovCiAgaWYgKEdfVU5MSUtFTFkgKElTX0ZMVVNISU5HIChzZXQpKSkKICAgIGdvdG8gZmx1c2hpbmc7CgogIGRvIHsKICAgIEdzdFBvbGxNb2RlIG1vZGU7CgogICAgcmVzID0gLTE7CiAgICByZXN0YXJ0aW5nID0gRkFMU0U7CgogICAgbW9kZSA9IGNob29zZV9tb2RlIChzZXQsIHRpbWVvdXQpOwoKICAgIGlmIChURVNUX1JFQlVJTEQgKHNldCkpIHsKICAgICAgZ19tdXRleF9sb2NrICgmc2V0LT5sb2NrKTsKI2lmbmRlZiBHX09TX1dJTjMyCiAgICAgIGdfYXJyYXlfc2V0X3NpemUgKHNldC0+YWN0aXZlX2Zkcywgc2V0LT5mZHMtPmxlbik7CiAgICAgIG1lbWNweSAoc2V0LT5hY3RpdmVfZmRzLT5kYXRhLCBzZXQtPmZkcy0+ZGF0YSwKICAgICAgICAgIHNldC0+ZmRzLT5sZW4gKiBzaXplb2YgKHN0cnVjdCBwb2xsZmQpKTsKI2Vsc2UKICAgICAgaWYgKCFnc3RfcG9sbF9wcmVwYXJlX3dpbnNvY2tfYWN0aXZlX3NldHMgKHNldCkpCiAgICAgICAgZ290byB3aW5zb2NrX2Vycm9yOwojZW5kaWYKICAgICAgZ19tdXRleF91bmxvY2sgKCZzZXQtPmxvY2spOwogICAgfQoKICAgIHN3aXRjaCAobW9kZSkgewogICAgICBjYXNlIEdTVF9QT0xMX01PREVfQVVUTzoKICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBHU1RfUE9MTF9NT0RFX1BQT0xMOgogICAgICB7CiNpZmRlZiBIQVZFX1BQT0xMCiAgICAgICAgc3RydWN0IHRpbWVzcGVjIHRzOwogICAgICAgIHN0cnVjdCB0aW1lc3BlYyAqdHNwdHI7CgogICAgICAgIGlmICh0aW1lb3V0ICE9IEdTVF9DTE9DS19USU1FX05PTkUpIHsKICAgICAgICAgIEdTVF9USU1FX1RPX1RJTUVTUEVDICh0aW1lb3V0LCB0cyk7CiAgICAgICAgICB0c3B0ciA9ICZ0czsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdHNwdHIgPSBOVUxMOwogICAgICAgIH0KCiAgICAgICAgcmVzID0KICAgICAgICAgICAgcHBvbGwgKChzdHJ1Y3QgcG9sbGZkICopIHNldC0+YWN0aXZlX2Zkcy0+ZGF0YSwKICAgICAgICAgICAgc2V0LT5hY3RpdmVfZmRzLT5sZW4sIHRzcHRyLCBOVUxMKTsKI2Vsc2UKICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKICAgICAgICBlcnJubyA9IEVOT1NZUzsKI2VuZGlmCiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSBHU1RfUE9MTF9NT0RFX1BPTEw6CiAgICAgIHsKI2lmZGVmIEhBVkVfUE9MTAogICAgICAgIGdpbnQgdDsKCiAgICAgICAgaWYgKHRpbWVvdXQgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgewogICAgICAgICAgdCA9IEdTVF9USU1FX0FTX01TRUNPTkRTICh0aW1lb3V0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdCA9IC0xOwogICAgICAgIH0KCiAgICAgICAgcmVzID0KICAgICAgICAgICAgcG9sbCAoKHN0cnVjdCBwb2xsZmQgKikgc2V0LT5hY3RpdmVfZmRzLT5kYXRhLAogICAgICAgICAgICBzZXQtPmFjdGl2ZV9mZHMtPmxlbiwgdCk7CiNlbHNlCiAgICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CiAgICAgICAgZXJybm8gPSBFTk9TWVM7CiNlbmRpZgogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgR1NUX1BPTExfTU9ERV9QU0VMRUNUOgojaWZuZGVmIEhBVkVfUFNFTEVDVAogICAgICB7CiAgICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CiAgICAgICAgZXJybm8gPSBFTk9TWVM7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KI2VuZGlmCiAgICAgIGNhc2UgR1NUX1BPTExfTU9ERV9TRUxFQ1Q6CiAgICAgIHsKI2lmbmRlZiBHX09TX1dJTjMyCiAgICAgICAgZmRfc2V0IHJlYWRmZHM7CiAgICAgICAgZmRfc2V0IHdyaXRlZmRzOwogICAgICAgIGZkX3NldCBlcnJvcmZkczsKICAgICAgICBnaW50IG1heF9mZDsKCiAgICAgICAgbWF4X2ZkID0gcG9sbGZkX3RvX2ZkX3NldCAoc2V0LCAmcmVhZGZkcywgJndyaXRlZmRzLCAmZXJyb3JmZHMpOwoKICAgICAgICBpZiAobW9kZSA9PSBHU1RfUE9MTF9NT0RFX1NFTEVDVCkgewogICAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7CiAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCAqdHZwdHI7CgogICAgICAgICAgaWYgKHRpbWVvdXQgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgewogICAgICAgICAgICBHU1RfVElNRV9UT19USU1FVkFMICh0aW1lb3V0LCB0dik7CiAgICAgICAgICAgIHR2cHRyID0gJnR2OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdHZwdHIgPSBOVUxMOwogICAgICAgICAgfQoKICAgICAgICAgIEdTVF9ERUJVRyAoIiVwOiBDYWxsaW5nIHNlbGVjdCIsIHNldCk7CiAgICAgICAgICByZXMgPSBzZWxlY3QgKG1heF9mZCArIDEsICZyZWFkZmRzLCAmd3JpdGVmZHMsICZlcnJvcmZkcywgdHZwdHIpOwogICAgICAgICAgR1NUX0RFQlVHICgiJXA6IEFmdGVyIHNlbGVjdCwgcmVzOiVkIiwgc2V0LCByZXMpOwogICAgICAgIH0gZWxzZSB7CiNpZmRlZiBIQVZFX1BTRUxFQ1QKICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyAqdHNwdHI7CgogICAgICAgICAgaWYgKHRpbWVvdXQgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgewogICAgICAgICAgICBHU1RfVElNRV9UT19USU1FU1BFQyAodGltZW91dCwgdHMpOwogICAgICAgICAgICB0c3B0ciA9ICZ0czsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRzcHRyID0gTlVMTDsKICAgICAgICAgIH0KCiAgICAgICAgICBHU1RfREVCVUcgKCIlcDogQ2FsbGluZyBwc2VsZWN0Iiwgc2V0KTsKICAgICAgICAgIHJlcyA9CiAgICAgICAgICAgICAgcHNlbGVjdCAobWF4X2ZkICsgMSwgJnJlYWRmZHMsICZ3cml0ZWZkcywgJmVycm9yZmRzLCB0c3B0ciwgTlVMTCk7CiAgICAgICAgICBHU1RfREVCVUcgKCIlcDogQWZ0ZXIgcHNlbGVjdCwgcmVzOiVkIiwgc2V0LCByZXMpOwojZW5kaWYKICAgICAgICB9CgogICAgICAgIGlmIChyZXMgPj0gMCkgewogICAgICAgICAgZmRfc2V0X3RvX3BvbGxmZCAoc2V0LCAmcmVhZGZkcywgJndyaXRlZmRzLCAmZXJyb3JmZHMpOwogICAgICAgIH0KI2Vsc2UgLyogR19PU19XSU4zMiAqLwogICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOwogICAgICAgIGVycm5vID0gRU5PU1lTOwojZW5kaWYKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlIEdTVF9QT0xMX01PREVfV0lORE9XUzoKICAgICAgewojaWZkZWYgR19PU19XSU4zMgogICAgICAgIGdpbnQgaWdub3JlX2NvdW50ID0gc2V0LT5hY3RpdmVfZmRzX2lnbm9yZWQtPmxlbjsKICAgICAgICBEV09SRCB0LCB3YWl0X3JldDsKCiAgICAgICAgaWYgKEdfTElLRUxZIChpZ25vcmVfY291bnQgPT0gMCkpIHsKICAgICAgICAgIGlmICh0aW1lb3V0ICE9IEdTVF9DTE9DS19USU1FX05PTkUpCiAgICAgICAgICAgIHQgPSBHU1RfVElNRV9BU19NU0VDT05EUyAodGltZW91dCk7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHQgPSBJTkZJTklURTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLyogYWxyZWFkeSBvbmUgb3IgbW9yZSBpZ25vcmVkIGZkcywgc28gd2UgcXVpY2tseSBzd2VlcCB0aGUgb3RoZXJzICovCiAgICAgICAgICB0ID0gMDsKICAgICAgICB9CgogICAgICAgIGlmIChzZXQtPmFjdGl2ZV9ldmVudHMtPmxlbiAhPSAwKSB7CiAgICAgICAgICB3YWl0X3JldCA9IFdTQVdhaXRGb3JNdWx0aXBsZUV2ZW50cyAoc2V0LT5hY3RpdmVfZXZlbnRzLT5sZW4sCiAgICAgICAgICAgICAgKEhBTkRMRSAqKSBzZXQtPmFjdGl2ZV9ldmVudHMtPmRhdGEsIEZBTFNFLCB0LCBGQUxTRSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdhaXRfcmV0ID0gV1NBX1dBSVRfRkFJTEVEOwogICAgICAgICAgV1NBU2V0TGFzdEVycm9yIChXU0FfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlnbm9yZV9jb3VudCA9PSAwICYmIHdhaXRfcmV0ID09IFdTQV9XQUlUX1RJTUVPVVQpIHsKICAgICAgICAgIHJlcyA9IDA7CiAgICAgICAgfSBlbHNlIGlmICh3YWl0X3JldCA9PSBXU0FfV0FJVF9GQUlMRUQpIHsKICAgICAgICAgIHJlcyA9IC0xOwogICAgICAgICAgZXJybm8gPSBnc3RfcG9sbF93aW5zb2NrX2Vycm9yX3RvX2Vycm5vIChXU0FHZXRMYXN0RXJyb3IgKCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvKiB0aGUgZmlyc3QgZW50cnkgaXMgdGhlIHdha2V1cCBldmVudCAqLwogICAgICAgICAgaWYgKHdhaXRfcmV0IC0gV1NBX1dBSVRfRVZFTlRfMCA+PSAxKSB7CiAgICAgICAgICAgIHJlcyA9IGdzdF9wb2xsX2NvbGxlY3Rfd2luc29ja19ldmVudHMgKHNldCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXMgPSAxOyAgICAgICAgICAgIC8qIHdha2V1cCBldmVudCAqLwogICAgICAgICAgfQogICAgICAgIH0KI2Vsc2UKICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKICAgICAgICBlcnJubyA9IEVOT1NZUzsKI2VuZGlmCiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoIWlzX3RpbWVyKSB7CiAgICAgIC8qIEFwcGxpY2F0aW9ucyBuZWVkcyB0byBjbGVhciB0aGUgY29udHJvbCBzb2NrZXQgdGhlbXNlbHZlcyBmb3IgdGltZXIKICAgICAgICogcG9sbHMuCiAgICAgICAqIEZvciBvdGhlciBwb2xscywgd2UgbmVlZCB0byBjbGVhciB0aGUgY29udHJvbCBzb2NrZXQuIElmIHRoZXJlIHdhcyBvbmx5CiAgICAgICAqIG9uZSBzb2NrZXQgd2l0aCBhY3Rpdml0eSBhbmQgaXQgd2FzIHRoZSBjb250cm9sIHNvY2tldCwgd2UgbmVlZCB0bwogICAgICAgKiByZXN0YXJ0ICovCiAgICAgIGlmIChyZWxlYXNlX2FsbF93YWtldXAgKHNldCkgPiAwICYmIHJlcyA9PSAxKQogICAgICAgIHJlc3RhcnRpbmcgPSBUUlVFOwogICAgfQoKICAgIC8qIHdlIGdvdCB3b2tlbiB1cCBhbmQgd2UgYXJlIGZsdXNoaW5nLCB3ZSBuZWVkIHRvIHN0b3AgKi8KICAgIGlmIChHX1VOTElLRUxZIChJU19GTFVTSElORyAoc2V0KSkpCiAgICAgIGdvdG8gZmx1c2hpbmc7CgogIH0gd2hpbGUgKEdfVU5MSUtFTFkgKHJlc3RhcnRpbmcpKTsKCiAgREVDX1dBSVRJTkcgKHNldCk7CgogIHJldHVybiByZXM7CgogIC8qIEVSUk9SUyAqLwphbHJlYWR5X3dhaXRpbmc6CiAgewogICAgR1NUX0xPRyAoIiVwOiB3ZSBhcmUgYWxyZWFkeSB3YWl0aW5nIiwgc2V0KTsKICAgIERFQ19XQUlUSU5HIChzZXQpOwogICAgZXJybm8gPSBFUEVSTTsKICAgIHJldHVybiAtMTsKICB9CmZsdXNoaW5nOgogIHsKICAgIEdTVF9MT0cgKCIlcDogd2UgYXJlIGZsdXNoaW5nIiwgc2V0KTsKICAgIERFQ19XQUlUSU5HIChzZXQpOwogICAgZXJybm8gPSBFQlVTWTsKICAgIHJldHVybiAtMTsKICB9CiNpZmRlZiBHX09TX1dJTjMyCndpbnNvY2tfZXJyb3I6CiAgewogICAgR1NUX0xPRyAoIiVwOiB3aW5zb2NrIGVycm9yIiwgc2V0KTsKICAgIGdfbXV0ZXhfdW5sb2NrICgmc2V0LT5sb2NrKTsKICAgIERFQ19XQUlUSU5HIChzZXQpOwogICAgcmV0dXJuIC0xOwogIH0KI2VuZGlmCn0KCi8qKgogKiBnc3RfcG9sbF9zZXRfY29udHJvbGxhYmxlOgogKiBAc2V0OiBhICNHc3RQb2xsLgogKiBAY29udHJvbGxhYmxlOiBuZXcgY29udHJvbGxhYmxlIHN0YXRlLgogKgogKiBXaGVuIEBjb250cm9sbGFibGUgaXMgJVRSVUUsIHRoaXMgZnVuY3Rpb24gZW5zdXJlcyB0aGF0IGZ1dHVyZSBjYWxscyB0bwogKiBnc3RfcG9sbF93YWl0KCkgd2lsbCBiZSBhZmZlY3RlZCBieSBnc3RfcG9sbF9yZXN0YXJ0KCkgYW5kCiAqIGdzdF9wb2xsX3NldF9mbHVzaGluZygpLgogKgogKiBUaGlzIGZ1bmN0aW9uIG9ubHkgd29ya3MgZm9yIG5vbi10aW1lciAjR3N0UG9sbCBvYmplY3RzIGNyZWF0ZWQgd2l0aAogKiBnc3RfcG9sbF9uZXcoKS4KICoKICogUmV0dXJuczogJVRSVUUgaWYgdGhlIGNvbnRyb2xsYWJpbGl0eSBvZiBAc2V0IGNvdWxkIGJlIHVwZGF0ZWQuCiAqLwpnYm9vbGVhbgpnc3RfcG9sbF9zZXRfY29udHJvbGxhYmxlIChHc3RQb2xsICogc2V0LCBnYm9vbGVhbiBjb250cm9sbGFibGUpCnsKICBnX3JldHVybl92YWxfaWZfZmFpbCAoc2V0ICE9IE5VTEwsIEZBTFNFKTsKICBnX3JldHVybl92YWxfaWZfZmFpbCAoIXNldC0+dGltZXIsIEZBTFNFKTsKCiAgR1NUX0xPRyAoIiVwOiBjb250cm9sbGFibGUgOiAlZCIsIHNldCwgY29udHJvbGxhYmxlKTsKCiAgc2V0LT5jb250cm9sbGFibGUgPSBjb250cm9sbGFibGU7CgogIHJldHVybiBUUlVFOwp9CgovKioKICogZ3N0X3BvbGxfcmVzdGFydDoKICogQHNldDogYSAjR3N0UG9sbC4KICoKICogUmVzdGFydCBhbnkgZ3N0X3BvbGxfd2FpdCgpIHRoYXQgaXMgaW4gcHJvZ3Jlc3MuIFRoaXMgZnVuY3Rpb24gaXMgdHlwaWNhbGx5CiAqIHVzZWQgYWZ0ZXIgYWRkaW5nIG9yIHJlbW92aW5nIGRlc2NyaXB0b3JzIHRvIEBzZXQuCiAqCiAqIElmIEBzZXQgaXMgbm90IGNvbnRyb2xsYWJsZSwgdGhlbiB0aGlzIGNhbGwgd2lsbCBoYXZlIG5vIGVmZmVjdC4KICoKICogVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIGZvciBub24tdGltZXIgI0dzdFBvbGwgb2JqZWN0cyBjcmVhdGVkIHdpdGgKICogZ3N0X3BvbGxfbmV3KCkuCiAqLwp2b2lkCmdzdF9wb2xsX3Jlc3RhcnQgKEdzdFBvbGwgKiBzZXQpCnsKICBnX3JldHVybl9pZl9mYWlsIChzZXQgIT0gTlVMTCk7CiAgZ19yZXR1cm5faWZfZmFpbCAoIXNldC0+dGltZXIpOwoKICBpZiAoc2V0LT5jb250cm9sbGFibGUgJiYgR0VUX1dBSVRJTkcgKHNldCkgPiAwKSB7CiAgICAvKiB3ZSBhcmUgY29udHJvbGxhYmxlIGFuZCB3YWl0aW5nLCB3YWtlIHVwIHRoZSB3YWl0ZXIuIFRoZSBzb2NrZXQgd2lsbCBiZQogICAgICogY2xlYXJlZCBieSB0aGUgX3dhaXQoKSB0aHJlYWQgYW5kIHRoZSBwb2xsIHdpbGwgYmUgcmVzdGFydGVkICovCiAgICByYWlzZV93YWtldXAgKHNldCk7CiAgfQp9CgovKioKICogZ3N0X3BvbGxfc2V0X2ZsdXNoaW5nOgogKiBAc2V0OiBhICNHc3RQb2xsLgogKiBAZmx1c2hpbmc6IG5ldyBmbHVzaGluZyBzdGF0ZS4KICoKICogV2hlbiBAZmx1c2hpbmcgaXMgJVRSVUUsIHRoaXMgZnVuY3Rpb24gZW5zdXJlcyB0aGF0IGN1cnJlbnQgYW5kIGZ1dHVyZSBjYWxscwogKiB0byBnc3RfcG9sbF93YWl0KCkgd2lsbCByZXR1cm4gLTEsIHdpdGggZXJybm8gc2V0IHRvIEVCVVNZLgogKgogKiBVbnNldHRpbmcgdGhlIGZsdXNoaW5nIHN0YXRlIHdpbGwgcmVzdG9yZSBub3JtYWwgb3BlcmF0aW9uIG9mIEBzZXQuCiAqCiAqIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyBmb3Igbm9uLXRpbWVyICNHc3RQb2xsIG9iamVjdHMgY3JlYXRlZCB3aXRoCiAqIGdzdF9wb2xsX25ldygpLgogKi8Kdm9pZApnc3RfcG9sbF9zZXRfZmx1c2hpbmcgKEdzdFBvbGwgKiBzZXQsIGdib29sZWFuIGZsdXNoaW5nKQp7CiAgZ19yZXR1cm5faWZfZmFpbCAoc2V0ICE9IE5VTEwpOwogIGdfcmV0dXJuX2lmX2ZhaWwgKCFzZXQtPnRpbWVyKTsKCiAgR1NUX0xPRyAoIiVwOiBmbHVzaGluZzogJWQiLCBzZXQsIGZsdXNoaW5nKTsKCiAgLyogdXBkYXRlIHRoZSBuZXcgc3RhdGUgZmlyc3QgKi8KICBTRVRfRkxVU0hJTkcgKHNldCwgZmx1c2hpbmcpOwoKICBpZiAoZmx1c2hpbmcgJiYgc2V0LT5jb250cm9sbGFibGUgJiYgR0VUX1dBSVRJTkcgKHNldCkgPiAwKSB7CiAgICAvKiB3ZSBhcmUgZmx1c2hpbmcsIGNvbnRyb2xsYWJsZSBhbmQgd2FpdGluZywgd2FrZSB1cCB0aGUgd2FpdGVyLiBXaGVuIHdlCiAgICAgKiBzdG9wIHRoZSBmbHVzaGluZyBvcGVyYXRpb24gd2UgZG9uJ3QgY2xlYXIgdGhlIHdha2V1cCBmZCBoZXJlLCB0aGlzIHdpbGwKICAgICAqIGhhcHBlbiBpbiB0aGUgX3dhaXQoKSB0aHJlYWQuICovCiAgICByYWlzZV93YWtldXAgKHNldCk7CiAgfQp9CgovKioKICogZ3N0X3BvbGxfd3JpdGVfY29udHJvbDoKICogQHNldDogYSAjR3N0UG9sbC4KICoKICogV3JpdGUgYSBieXRlIHRvIHRoZSBjb250cm9sIHNvY2tldCBvZiB0aGUgY29udHJvbGxhYmxlIEBzZXQuCiAqIFRoaXMgZnVuY3Rpb24gaXMgbW9zdGx5IHVzZWZ1bCBmb3IgdGltZXIgI0dzdFBvbGwgb2JqZWN0cyBjcmVhdGVkIHdpdGgKICogZ3N0X3BvbGxfbmV3X3RpbWVyKCkuIAogKgogKiBJdCB3aWxsIG1ha2UgYW55IGN1cnJlbnQgYW5kIGZ1dHVyZSBnc3RfcG9sbF93YWl0KCkgZnVuY3Rpb24gcmV0dXJuIHdpdGgKICogMSwgbWVhbmluZyB0aGUgY29udHJvbCBzb2NrZXQgaXMgc2V0LiBBZnRlciBhbiBlcXVhbCBhbW91bnQgb2YgY2FsbHMgdG8KICogZ3N0X3BvbGxfcmVhZF9jb250cm9sKCkgaGF2ZSBiZWVuIHBlcmZvcm1lZCwgY2FsbHMgdG8gZ3N0X3BvbGxfd2FpdCgpIHdpbGwKICogYmxvY2sgYWdhaW4gdW50aWwgdGhlaXIgdGltZW91dCBleHBpcmVkLgogKgogKiBUaGlzIGZ1bmN0aW9uIG9ubHkgd29ya3MgZm9yIHRpbWVyICNHc3RQb2xsIG9iamVjdHMgY3JlYXRlZCB3aXRoCiAqIGdzdF9wb2xsX25ld190aW1lcigpLgogKgogKiBSZXR1cm5zOiAlVFJVRSBvbiBzdWNjZXNzLiAlRkFMU0Ugd2hlbiB3aGVuIHRoZSBieXRlIGNvdWxkIG5vdCBiZSB3cml0dGVuLgogKiBlcnJubyBjb250YWlucyB0aGUgZGV0YWlsZWQgZXJyb3IgY29kZSBidXQgd2lsbCBuZXZlciBiZSBFQUdBSU4sIEVJTlRSIG9yCiAqIEVXT1VMREJMT0NLLiAlRkFMU0UgYWx3YXlzIHNpZ25hbHMgYSBjcml0aWNhbCBlcnJvci4KICovCmdib29sZWFuCmdzdF9wb2xsX3dyaXRlX2NvbnRyb2wgKEdzdFBvbGwgKiBzZXQpCnsKICBnYm9vbGVhbiByZXM7CgogIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZXQgIT0gTlVMTCwgRkFMU0UpOwogIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZXQtPnRpbWVyLCBGQUxTRSk7CgogIHJlcyA9IHJhaXNlX3dha2V1cCAoc2V0KTsKCiAgcmV0dXJuIHJlczsKfQoKLyoqCiAqIGdzdF9wb2xsX3JlYWRfY29udHJvbDoKICogQHNldDogYSAjR3N0UG9sbC4KICoKICogUmVhZCBhIGJ5dGUgZnJvbSB0aGUgY29udHJvbCBzb2NrZXQgb2YgdGhlIGNvbnRyb2xsYWJsZSBAc2V0LgogKgogKiBUaGlzIGZ1bmN0aW9uIG9ubHkgd29ya3MgZm9yIHRpbWVyICNHc3RQb2xsIG9iamVjdHMgY3JlYXRlZCB3aXRoCiAqIGdzdF9wb2xsX25ld190aW1lcigpLgogKgogKiBSZXR1cm5zOiAlVFJVRSBvbiBzdWNjZXNzLiAlRkFMU0Ugd2hlbiB3aGVuIHRoZXJlIHdhcyBubyBieXRlIHRvIHJlYWQgb3IKICogcmVhZGluZyB0aGUgYnl0ZSBmYWlsZWQuIElmIHRoZXJlIHdhcyBubyBieXRlIHRvIHJlYWQsIGFuZCBvbmx5IHRoZW4sIGVycm5vCiAqIHdpbGwgY29udGFpbiBFV09VTERCTE9DSyBvciBFQUdBSU4uIEZvciBhbGwgb3RoZXIgdmFsdWVzIG9mIGVycm5vIHRoaXMgYWx3YXlzIHNpZ25hbHMgYQogKiBjcml0aWNhbCBlcnJvci4KICovCmdib29sZWFuCmdzdF9wb2xsX3JlYWRfY29udHJvbCAoR3N0UG9sbCAqIHNldCkKewogIGdib29sZWFuIHJlczsKCiAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNldCAhPSBOVUxMLCBGQUxTRSk7CiAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNldC0+dGltZXIsIEZBTFNFKTsKCiAgcmVzID0gcmVsZWFzZV93YWtldXAgKHNldCk7CgogIHJldHVybiByZXM7Cn0K