ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjkyMTE0Li4wMDAwMDAwCi0tLSBhL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSB7Ci0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImV4dGVybmFsX3BwcF9saWNlbnNlIl0sCi19Ci0KLS8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKLWxpY2Vuc2UgewotICAgIG5hbWU6ICJleHRlcm5hbF9wcHBfbGljZW5zZSIsCi0gICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCi0gICAgbGljZW5zZV9raW5kczogWwotICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItMEJTRCIsCi0gICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKLSAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUJTRCIsCi0gICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1HUEwiLAotICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItR1BMLTIuMCIsCi0gICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1MR1BMIiwKLSAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLU1JVCIsCi0gICAgICAgICJsZWdhY3lfbm90aWNlIiwKLSAgICAgICAgImxlZ2FjeV91bmVuY3VtYmVyZWQiLAotICAgIF0sCi0gICAgbGljZW5zZV90ZXh0OiBbIkxJQ0VOU0UiXSwKLX0KLQotc3ViZGlycyA9IFsicHBwZCJdCmRpZmYgLS1naXQgYS9DbGVhblNwZWMubWsgYi9DbGVhblNwZWMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NGUxYjYuLjAwMDAwMDAKLS0tIGEvQ2xlYW5TcGVjLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBJZiB5b3UgZG9uJ3QgbmVlZCB0byBkbyBhIGZ1bGwgY2xlYW4gYnVpbGQgYnV0IHdvdWxkIGxpa2UgdG8gdG91Y2gKLSMgYSBmaWxlIG9yIGRlbGV0ZSBzb21lIGludGVybWVkaWF0ZSBmaWxlcywgYWRkIGEgY2xlYW4gc3RlcCB0byB0aGUgZW5kCi0jIG9mIHRoZSBsaXN0LiAgVGhlc2Ugc3RlcHMgd2lsbCBvbmx5IGJlIHJ1biBvbmNlLCBpZiB0aGV5IGhhdmVuJ3QgYmVlbgotIyBydW4gYmVmb3JlLgotIwotIyBFLmcuOgotIyAgICAgJChjYWxsIGFkZC1jbGVhbi1zdGVwLCB0b3VjaCAtYyBleHRlcm5hbC9zcWxpdGUvc3FsaXRlMy5oKQotIyAgICAgJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NUQVRJQ19MSUJSQVJJRVMvbGliel9pbnRlcm1lZGlhdGVzKQotIwotIyBBbHdheXMgdXNlICJ0b3VjaCAtYyIgYW5kICJybSAtZiIgb3IgInJtIC1yZiIgdG8gZ3JhY2VmdWxseSBkZWFsIHdpdGgKLSMgZmlsZXMgdGhhdCBhcmUgbWlzc2luZyBvciBoYXZlIGJlZW4gbW92ZWQuCi0jCi0jIFVzZSAkKFBST0RVQ1RfT1VUKSB0byBnZXQgdG8gdGhlICJvdXQvdGFyZ2V0L3Byb2R1Y3QvYmxhaC8iIGRpcmVjdG9yeS4KLSMgVXNlICQoT1VUX0RJUikgdG8gcmVmZXIgdG8gdGhlICJvdXQiIGRpcmVjdG9yeS4KLSMKLSMgSWYgeW91IG5lZWQgdG8gcmUtZG8gc29tZXRoaW5nIHRoYXQncyBhbHJlYWR5IG1lbnRpb25lZCwganVzdCBjb3B5Ci0jIHRoZSBjb21tYW5kIGFuZCBhZGQgaXQgdG8gdGhlIGJvdHRvbSBvZiB0aGUgbGlzdC4gIEUuZy4sIGlmIGEgY2hhbmdlCi0jIHRoYXQgeW91IG1hZGUgbGFzdCB3ZWVrIHJlcXVpcmVkIHRvdWNoaW5nIGEgZmlsZSBhbmQgYSBjaGFuZ2UgeW91Ci0jIG1hZGUgdG9kYXkgcmVxdWlyZXMgdG91Y2hpbmcgdGhlIHNhbWUgZmlsZSwganVzdCBjb3B5IHRoZSBvbGQKLSMgdG91Y2ggc3RlcCBhbmQgYWRkIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuCi0jCi0jICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBORVdFUiBDTEVBTiBTVEVQUyBNVVNUIEJFIEFUIFRIRSBFTkQgT0YgVEhFIExJU1QKLSMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSMgRm9yIGV4YW1wbGU6Ci0jJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai9BUFBTL0FuZHJvaWRUZXN0c19pbnRlcm1lZGlhdGVzKQotIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvY29yZV9pbnRlcm1lZGlhdGVzKQotIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgZmluZCAkKE9VVF9ESVIpIC10eXBlIGYgLW5hbWUgIklHVGFsa1Nlc3Npb24qIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYpCi0jJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvZGF0YS8qKQotCi0jICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBORVdFUiBDTEVBTiBTVEVQUyBNVVNUIEJFIEFUIFRIRSBFTkQgT0YgVEhFIExJU1QKLSMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9MSUNFTlNFIGIvTElDRU5TRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgwN2YyNS4uMDAwMDAwMAotLS0gYS9MSUNFTlNFCisrKyAvZGV2L251bGwKQEAgLTEsMjk1MiArMCwwIEBACi0gICAgQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2LCAxOTk3IEZyYW5jaXMuRHVwb250QGlucmlhLmZyLCBJTlJJQSBSb2NxdWVuY291cnQsCi0gICAgQWxhaW4uRHVyYW5kQGltYWcuZnIsIElNQUcsCi0gICAgSmVhbi1MdWMuUmljaGllckBpbWFnLmZyLCBJTUFHLUxTUi4KLQotICAgIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSBGcmFuY2lzLkR1cG9udEBpbnJpYS5mciwgR0lFIERZQURFLAotICAgIEFsYWluLkR1cmFuZEBpbWFnLmZyLCBJTUFHLAotICAgIEplYW4tTHVjLlJpY2hpZXJAaW1hZy5mciwgSU1BRy1MU1IuCi0KLSAgICBDZSB0cmF2YWlsIGEgw6l0w6kgZmFpdCBhdSBzZWluIGR1IEdJRSBEWUFERSAoR3JvdXBlbWVudCBkJ0ludMOpcsOqdAotICAgIMOJY29ub21pcXVlIGF5YW50IHBvdXIgbWVtYnJlcyBCVUxMIFMuQS4gZXQgbCdJTlJJQSkuCi0KLSAgICBDZSBsb2dpY2llbCBpbmZvcm1hdGlxdWUgZXN0IGRpc3BvbmlibGUgYXV4IGNvbmRpdGlvbnMKLSAgICB1c3VlbGxlcyBkYW5zIGxhIHJlY2hlcmNoZSwgYydlc3Qtw6AtZGlyZSBxdSdpbCBwZXV0Ci0gICAgw6p0cmUgdXRpbGlzw6ksIGNvcGnDqSwgbW9kaWZpw6ksIGRpc3RyaWJ1w6kgw6AgbCd1bmlxdWUKLSAgICBjb25kaXRpb24gcXVlIGNlIHRleHRlIHNvaXQgY29uc2VydsOpIGFmaW4gcXVlCi0gICAgbCdvcmlnaW5lIGRlIGNlIGxvZ2ljaWVsIHNvaXQgcmVjb25udWUuCi0KLSAgICBMZSBub20gZGUgbCdJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlCi0gICAgZXQgZW4gQXV0b21hdGlxdWUgKElOUklBKSwgZGUgbCdJTUFHLCBvdSBkJ3VuZSBwZXJzb25uZSBtb3JhbGUKLSAgICBvdSBwaHlzaXF1ZSBheWFudCBwYXJ0aWNpcMOpIMOgIGwnw6lsYWJvcmF0aW9uIGRlIGNlIGxvZ2ljaWVsIG5lIHBldXQKLSAgICDDqnRyZSB1dGlsaXPDqSBzYW5zIHNvbiBhY2NvcmQgcHLDqWFsYWJsZSBleHBsaWNpdGUuCi0KLSAgICBDZSBsb2dpY2llbCBlc3QgZm91cm5pIHRlbCBxdWVsIHNhbnMgYXVjdW5lIGdhcmFudGllLAotICAgIHN1cHBvcnQgb3UgcmVzcG9uc2FiaWxpdMOpIGQnYXVjdW5lIHNvcnRlLgotICAgIENlIGxvZ2ljaWVsIGVzdCBkw6lyaXbDqSBkZSBzb3VyY2VzIGQnb3JpZ2luZQotICAgICJVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEgYXQgQmVya2VsZXkiIGV0Ci0gICAgIkRpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uIiBjb3V2ZXJ0ZXMgcGFyIGRlcyBjb3B5cmlnaHRzLgotCi0gICAgTCdJbnN0aXR1dCBkJ0luZm9ybWF0aXF1ZSBldCBkZSBNYXRow6ltYXRpcXVlcyBBcHBsaXF1w6llcyBkZSBHcmVub2JsZSAoSU1BRykKLSAgICBlc3QgdW5lIGbDqWTDqXJhdGlvbiBkJ3VuaXTDqXMgbWl4dGVzIGRlIHJlY2hlcmNoZSBkdSBDTlJTLCBkZSBsJ0luc3RpdHV0IE5hdGlvbmFsCi0gICAgUG9seXRlY2huaXF1ZSBkZSBHcmVub2JsZSBldCBkZSBsJ1VuaXZlcnNpdMOpIEpvc2VwaCBGb3VyaWVyIHJlZ3JvdXBhbnQKLSAgICBzZXB0IGxhYm9yYXRvaXJlcyBkb250IGxlIGxhYm9yYXRvaXJlIExvZ2ljaWVscywgU3lzdMOobWVzLCBSw6lzZWF1eCAoTFNSKS4KLQotICAgIFRoaXMgd29yayBoYXMgYmVlbiBkb25lIGluIHRoZSBjb250ZXh0IG9mIEdJRSBEWUFERSAoam9pbnQgUiAmIEQgdmVudHVyZQotICAgIGJldHdlZW4gQlVMTCBTLkEuIGFuZCBJTlJJQSkuCi0KLSAgICBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB3aXRoIHVzdWFsICJyZXNlYXJjaCIgdGVybXMKLSAgICB3aXRoIHRoZSBhaW0gb2YgcmV0YWluIGNyZWRpdHMgb2YgdGhlIHNvZnR3YXJlLgotICAgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gICAgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gICAgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcywKLSAgICBhbmQgdGhlIG5hbWUgb2YgSU5SSUEsIElNQUcsIG9yIGFueSBjb250cmlidXRvciBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZwotICAgIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIHRoaXMgbWF0ZXJpYWwgd2l0aG91dCB0aGUgcHJpb3IgZXhwbGljaXQKLSAgICBwZXJtaXNzaW9uLiBUaGUgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGFueQotICAgIHdhcnJhbnRpZXMsIHN1cHBvcnQgb3IgbGlhYmlsaXRpZXMgb2YgYW55IGtpbmQuCi0gICAgVGhpcyBzb2Z0d2FyZSBpcyBkZXJpdmVkIGZyb20gc291cmNlIGNvZGUgZnJvbQotICAgICJVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEgYXQgQmVya2VsZXkiIGFuZAotICAgICJEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiIgcHJvdGVjdGVkIGJ5IGNvcHlyaWdodHMuCi0KLSAgICBHcmVub2JsZSdzIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlIGFuZCBBcHBsaWVkIE1hdGhlbWF0aWNzIChJTUFHKQotICAgIGlzIGEgZmVkZXJhdGlvbiBvZiBzZXZlbiByZXNlYXJjaCB1bml0cyBmdW5kZWQgYnkgdGhlIENOUlMsIE5hdGlvbmFsCi0gICAgUG9seXRlY2huaWMgSW5zdGl0dXRlIG9mIEdyZW5vYmxlIGFuZCBVbml2ZXJzaXR5IEpvc2VwaCBGb3VyaWVyLgotICAgIFRoZSByZXNlYXJjaCB1bml0IGluIFNvZnR3YXJlLCBTeXN0ZW1zLCBOZXR3b3JrcyAoTFNSKSBpcyBtZW1iZXIgb2YgSU1BRy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBVbml4IFNNQi9DSUZTIGltcGxlbWVudGF0aW9uLgotICAgU2FtYmEgdXRpbGl0eSBmdW5jdGlvbnMKLQotICAgQ29weXJpZ2h0IChDKSBBbmRyZXcgVHJpZGdlbGwgMTk5Mi0yMDAxCi0gICBDb3B5cmlnaHQgKEMpIFNpbW8gU29yY2UgICAgICAyMDAxLTIwMDIKLSAgIENvcHlyaWdodCAoQykgTWFydGluIFBvb2wgICAgIDIwMDMKLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBDb3B5cmlnaHQgKEMpIDE5OTAsIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCi0gTGljZW5zZSB0byBjb3B5IGFuZCB1c2UgdGhpcyBzb2Z0d2FyZSBpcyBncmFudGVkIHByb3ZpZGVkIHRoYXQgICAgKioKLSBpdCBpcyBpZGVudGlmaWVkIGFzIHRoZSAiUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2UtICAgICAqKgotIERpZ2VzdCBBbGdvcml0aG0iIGluIGFsbCBtYXRlcmlhbCBtZW50aW9uaW5nIG9yIHJlZmVyZW5jaW5nIHRoaXMgICoqCi0gc29mdHdhcmUgb3IgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgotIExpY2Vuc2UgaXMgYWxzbyBncmFudGVkIHRvIG1ha2UgYW5kIHVzZSBkZXJpdmF0aXZlIHdvcmtzICAgICAgICAgICoqCi0gcHJvdmlkZWQgdGhhdCBzdWNoIHdvcmtzIGFyZSBpZGVudGlmaWVkIGFzICJkZXJpdmVkIGZyb20gdGhlIFJTQSAgKioKLSBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0iIGluIGFsbCAgICAgICAgICAqKgotIG1hdGVyaWFsIG1lbnRpb25pbmcgb3IgcmVmZXJlbmNpbmcgdGhlIGRlcml2ZWQgd29yay4gICAgICAgICAgICAgICoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKLSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgY29uY2VybmluZyAgICAgICAqKgotIGVpdGhlciB0aGUgbWVyY2hhbnRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgb3IgdGhlIHN1aXRhYmlsaXR5ICAgICoqCi0gb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHBhcnRpY3VsYXIgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyAgKioKLSBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkgb2YgYW55IGtpbmQuICAgICAgICAgICAgICAqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCi0gVGhlc2Ugbm90aWNlcyBtdXN0IGJlIHJldGFpbmVkIGluIGFueSBjb3BpZXMgb2YgYW55IHBhcnQgb2YgdGhpcyAgKioKLSBkb2N1bWVudGF0aW9uIGFuZC9vciBzb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotJElkOiBhdnBhaXIuYyx2IDEuMSAyMDA0LzExLzE0IDA3OjI2OjI2IHBhdWx1cyBFeHAgJAotCi1Db3B5cmlnaHQgKEMpIDE5OTUgTGFycyBGZW5uZWJlcmcKLQotQ29weXJpZ2h0IDE5OTIgTGl2aW5nc3RvbiBFbnRlcnByaXNlcywgSW5jLgotCi1Db3B5cmlnaHQgMTk5MiwxOTkzLCAxOTk0LDE5OTUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4KLWFuZCBNZXJpdCBOZXR3b3JrLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLQotU2VlIHRoZSBmaWxlIENPUFlSSUdIVCBmb3IgdGhlIHJlc3BlY3RpdmUgdGVybXMgYW5kIGNvbmRpdGlvbnMuCi1JZiB0aGUgZmlsZSBpcyBtaXNzaW5nIGNvbnRhY3QgbWUgYXQgbGZAZWxlbWVudGFsLm5ldAotYW5kIEknbGwgc2VuZCB5b3UgYSBjb3B5LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSRJZDogYnVpbGRyZXEuYyx2IDEuMSAyMDA0LzExLzE0IDA3OjI2OjI2IHBhdWx1cyBFeHAgJAotCi1Db3B5cmlnaHQgKEMpIDE5OTUsMTk5NyBMYXJzIEZlbm5lYmVyZwotCi1TZWUgdGhlIGZpbGUgQ09QWVJJR0hUIGZvciB0aGUgcmVzcGVjdGl2ZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4KLUlmIHRoZSBmaWxlIGlzIG1pc3NpbmcgY29udGFjdCBtZSBhdCBsZkBlbGVtZW50YWwubmV0Ci1hbmQgSSdsbCBzZW5kIHlvdSBhIGNvcHkuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotJElkOiBjbGllbnRpZC5jLHYgMS4xIDIwMDQvMTEvMTQgMDc6MjY6MjYgcGF1bHVzIEV4cCAkCi0KLUNvcHlyaWdodCAoQykgMTk5NSwxOTk2LDE5OTcgTGFycyBGZW5uZWJlcmcKLQotU2VlIHRoZSBmaWxlIENPUFlSSUdIVCBmb3IgdGhlIHJlc3BlY3RpdmUgdGVybXMgYW5kIGNvbmRpdGlvbnMuCi1JZiB0aGUgZmlsZSBpcyBtaXNzaW5nIGNvbnRhY3QgbWUgYXQgbGZAZWxlbWVudGFsLm5ldAotYW5kIEknbGwgc2VuZCB5b3UgYSBjb3B5LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSRJZDogY29uZmlnLmMsdiAxLjEgMjAwNC8xMS8xNCAwNzoyNjoyNiBwYXVsdXMgRXhwICQKLQotQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYsMTk5NyBMYXJzIEZlbm5lYmVyZwotCi1Db3B5cmlnaHQgMTk5MiBMaXZpbmdzdG9uIEVudGVycHJpc2VzLCBJbmMuCi0KLUNvcHlyaWdodCAxOTkyLDE5OTMsIDE5OTQsMTk5NSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbgotYW5kIE1lcml0IE5ldHdvcmssIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAotCi1TZWUgdGhlIGZpbGUgQ09QWVJJR0hUIGZvciB0aGUgcmVzcGVjdGl2ZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4KLUlmIHRoZSBmaWxlIGlzIG1pc3NpbmcgY29udGFjdCBtZSBhdCBsZkBlbGVtZW50YWwubmV0Ci1hbmQgSSdsbCBzZW5kIHlvdSBhIGNvcHkuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotJElkOiBkaWN0LmMsdiAxLjEgMjAwNC8xMS8xNCAwNzoyNjoyNiBwYXVsdXMgRXhwICQKLQotQ29weXJpZ2h0IChDKSAyMDAyIFJvYXJpbmcgUGVuZ3VpbiBTb2Z0d2FyZSBJbmMuCi0KLUNvcHlyaWdodCAoQykgMTk5NSwxOTk2LDE5OTcgTGFycyBGZW5uZWJlcmcKLQotQ29weXJpZ2h0IDE5OTIgTGl2aW5nc3RvbiBFbnRlcnByaXNlcywgSW5jLgotCi1Db3B5cmlnaHQgMTk5MiwxOTkzLCAxOTk0LDE5OTUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4KLWFuZCBNZXJpdCBOZXR3b3JrLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLQotU2VlIHRoZSBmaWxlIENPUFlSSUdIVCBmb3IgdGhlIHJlc3BlY3RpdmUgdGVybXMgYW5kIGNvbmRpdGlvbnMuCi1JZiB0aGUgZmlsZSBpcyBtaXNzaW5nIGNvbnRhY3QgbWUgYXQgbGZAZWxlbWVudGFsLm5ldAotYW5kIEknbGwgc2VuZCB5b3UgYSBjb3B5LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSRJZDogaW5jbHVkZXMuaCx2IDEuMSAyMDA0LzExLzE0IDA3OjI2OjI2IHBhdWx1cyBFeHAgJAotCi1Db3B5cmlnaHQgKEMpIDE5OTcgTGFycyBGZW5uZWJlcmcKLQotQ29weXJpZ2h0IDE5OTIgTGl2aW5nc3RvbiBFbnRlcnByaXNlcywgSW5jLgotCi1Db3B5cmlnaHQgMTk5MiwxOTkzLCAxOTk0LDE5OTUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4KLWFuZCBNZXJpdCBOZXR3b3JrLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLQotU2VlIHRoZSBmaWxlIENPUFlSSUdIVCBmb3IgdGhlIHJlc3BlY3RpdmUgdGVybXMgYW5kIGNvbmRpdGlvbnMuCi1JZiB0aGUgZmlsZSBpcyBtaXNzaW5nIGNvbnRhY3QgbWUgYXQgbGZAZWxlbWVudGFsLm5ldAotYW5kIEknbGwgc2VuZCB5b3UgYSBjb3B5LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSRJZDogaXBfdXRpbC5jLHYgMS4xIDIwMDQvMTEvMTQgMDc6MjY6MjYgcGF1bHVzIEV4cCAkCi0KLUNvcHlyaWdodCAoQykgMTk5NSwxOTk2LDE5OTcgTGFycyBGZW5uZWJlcmcKLQotQ29weXJpZ2h0IDE5OTIgTGl2aW5nc3RvbiBFbnRlcnByaXNlcywgSW5jLgotCi1Db3B5cmlnaHQgMTk5MiwxOTkzLCAxOTk0LDE5OTUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4KLWFuZCBNZXJpdCBOZXR3b3JrLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLQotU2VlIHRoZSBmaWxlIENPUFlSSUdIVCBmb3IgdGhlIHJlc3BlY3RpdmUgdGVybXMgYW5kIGNvbmRpdGlvbnMuCi1JZiB0aGUgZmlsZSBpcyBtaXNzaW5nIGNvbnRhY3QgbWUgYXQgbGZAZWxlbWVudGFsLm5ldAotYW5kIEknbGwgc2VuZCB5b3UgYSBjb3B5LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSRJZDogbG9jay5jLHYgMS4xIDIwMDQvMTEvMTQgMDc6MjY6MjYgcGF1bHVzIEV4cCAkCi0KLUNvcHlyaWdodCAoQykgMTk5NyBMYXJzIEZlbm5lYmVyZwotCi1TZWUgdGhlIGZpbGUgQ09QWVJJR0hUIGZvciB0aGUgcmVzcGVjdGl2ZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4KLUlmIHRoZSBmaWxlIGlzIG1pc3NpbmcgY29udGFjdCBtZSBhdCBsZkBlbGVtZW50YWwubmV0Ci1hbmQgSSdsbCBzZW5kIHlvdSBhIGNvcHkuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotJElkOiBvcHRpb25zLmgsdiAxLjEgMjAwNC8xMS8xNCAwNzoyNjoyNiBwYXVsdXMgRXhwICQKLQotQ29weXJpZ2h0IChDKSAxOTk2IExhcnMgRmVubmViZXJnCi0KLVNlZSB0aGUgZmlsZSBDT1BZUklHSFQgZm9yIHRoZSByZXNwZWN0aXZlIHRlcm1zIGFuZCBjb25kaXRpb25zLgotSWYgdGhlIGZpbGUgaXMgbWlzc2luZyBjb250YWN0IG1lIGF0IGxmQGVsZW1lbnRhbC5uZXQKLWFuZCBJJ2xsIHNlbmQgeW91IGEgY29weS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0kSWQ6IHBhdGhuYW1lcy5oLHYgMS4xIDIwMDQvMTEvMTQgMDc6MjY6MjYgcGF1bHVzIEV4cCAkCi0KLUNvcHlyaWdodCAoQykgMTk5NSwxOTk2IExhcnMgRmVubmViZXJnCi0KLUNvcHlyaWdodCAxOTkyIExpdmluZ3N0b24gRW50ZXJwcmlzZXMsIEluYy4KLQotQ29weXJpZ2h0IDE5OTIsMTk5MywgMTk5NCwxOTk1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuCi1hbmQgTWVyaXQgTmV0d29yaywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkCi0KLVNlZSB0aGUgZmlsZSBDT1BZUklHSFQgZm9yIHRoZSByZXNwZWN0aXZlIHRlcm1zIGFuZCBjb25kaXRpb25zLgotSWYgdGhlIGZpbGUgaXMgbWlzc2luZyBjb250YWN0IG1lIGF0IGxmQGVsZW1lbnRhbC5uZXQKLWFuZCBJJ2xsIHNlbmQgeW91IGEgY29weS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0kSWQ6IHJhZGl1c2NsaWVudC5oLHYgMS4xIDIwMDQvMTEvMTQgMDc6MjY6MjYgcGF1bHVzIEV4cCAkCi0KLUNvcHlyaWdodCAoQykgMTk5NSwxOTk2LDE5OTcsMTk5OCBMYXJzIEZlbm5lYmVyZwotCi1Db3B5cmlnaHQgMTk5MiBMaXZpbmdzdG9uIEVudGVycHJpc2VzLCBJbmMuCi0KLUNvcHlyaWdodCAxOTkyLDE5OTMsIDE5OTQsMTk5NSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbgotYW5kIE1lcml0IE5ldHdvcmssIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAotCi1TZWUgdGhlIGZpbGUgQ09QWVJJR0hUIGZvciB0aGUgcmVzcGVjdGl2ZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4KLUlmIHRoZSBmaWxlIGlzIG1pc3NpbmcgY29udGFjdCBtZSBhdCBsZkBlbGVtZW50YWwubmV0Ci1hbmQgSSdsbCBzZW5kIHlvdSBhIGNvcHkuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotJElkOiBzZW5kc2VydmVyLmMsdiAxLjEgMjAwNC8xMS8xNCAwNzoyNjoyNiBwYXVsdXMgRXhwICQKLQotQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYsMTk5NyBMYXJzIEZlbm5lYmVyZwotCi1Db3B5cmlnaHQgMTk5MiBMaXZpbmdzdG9uIEVudGVycHJpc2VzLCBJbmMuCi0KLUNvcHlyaWdodCAxOTkyLDE5OTMsIDE5OTQsMTk5NSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbgotYW5kIE1lcml0IE5ldHdvcmssIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAotCi1TZWUgdGhlIGZpbGUgQ09QWVJJR0hUIGZvciB0aGUgcmVzcGVjdGl2ZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4KLUlmIHRoZSBmaWxlIGlzIG1pc3NpbmcgY29udGFjdCBtZSBhdCBsZkBlbGVtZW50YWwubmV0Ci1hbmQgSSdsbCBzZW5kIHlvdSBhIGNvcHkuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotJElkOiB1dGlsLmMsdiAxLjEgMjAwNC8xMS8xNCAwNzoyNjoyNiBwYXVsdXMgRXhwICQKLQotQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYsMTk5NyBMYXJzIEZlbm5lYmVyZwotCi1Db3B5cmlnaHQgMTk5MiBMaXZpbmdzdG9uIEVudGVycHJpc2VzLCBJbmMuCi0KLUNvcHlyaWdodCAxOTkyLDE5OTMsIDE5OTQsMTk5NSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbgotYW5kIE1lcml0IE5ldHdvcmssIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAotCi1TZWUgdGhlIGZpbGUgQ09QWVJJR0hUIGZvciB0aGUgcmVzcGVjdGl2ZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4KLUlmIHRoZSBmaWxlIGlzIG1pc3NpbmcgY29udGFjdCBtZSBhdCBsZkBlbGVtZW50YWwubmV0Ci1hbmQgSSdsbCBzZW5kIHlvdSBhIGNvcHkuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotKgotKiBjb21tb24uYwotKgotKiBJbXBsZW1lbnRhdGlvbiBvZiB1c2VyLXNwYWNlIFBQUG9FIHJlZGlyZWN0b3IgZm9yIExpbnV4LgotKgotKiBDb21tb24gZnVuY3Rpb25zIHVzZWQgYnkgUFBQb0UgY2xpZW50IGFuZCBzZXJ2ZXIKLSoKLSogQ29weXJpZ2h0IChDKSAyMDAwIGJ5IFJvYXJpbmcgUGVuZ3VpbiBTb2Z0d2FyZSBJbmMuCi0qCi0qIFRoaXMgcHJvZ3JhbSBtYXkgYmUgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VCi0qIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotKgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSoKLSogZGVidWcuYwotKgotKiBJbXBsZW1lbnRhdGlvbiBvZiB1c2VyLXNwYWNlIFBQUG9FIHJlZGlyZWN0b3IgZm9yIExpbnV4LgotKgotKiBGdW5jdGlvbnMgZm9yIHByaW50aW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotKgotKiBDb3B5cmlnaHQgKEMpIDIwMDAgYnkgUm9hcmluZyBQZW5ndWluIFNvZnR3YXJlIEluYy4KLSoKLSogVGhpcyBwcm9ncmFtIG1heSBiZSBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUKLSogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0qCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotKgotKiBkaXNjb3ZlcnkuYwotKgotKiBQZXJmb3JtIFBQUG9FIGRpc2NvdmVyeQotKgotKiBDb3B5cmlnaHQgKEMpIDE5OTkgYnkgUm9hcmluZyBQZW5ndWluIFNvZnR3YXJlIEluYy4KLSoKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0qCi0qIGlmLmMKLSoKLSogSW1wbGVtZW50YXRpb24gb2YgdXNlci1zcGFjZSBQUFBvRSByZWRpcmVjdG9yIGZvciBMaW51eC4KLSoKLSogRnVuY3Rpb25zIGZvciBvcGVuaW5nIGEgcmF3IHNvY2tldCBhbmQgcmVhZGluZy93cml0aW5nIHJhdyBFdGhlcm5ldCBmcmFtZXMuCi0qCi0qIENvcHlyaWdodCAoQykgMjAwMCBieSBSb2FyaW5nIFBlbmd1aW4gU29mdHdhcmUgSW5jLgotKgotKiBUaGlzIHByb2dyYW0gbWF5IGJlIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVQotKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSoKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0qCi0qIHBsdWdpbi5jCi0qCi0qIHBwcGQgcGx1Z2luIGZvciBrZXJuZWwtbW9kZSBQUFBvRSBvbiBMaW51eAotKgotKiBDb3B5cmlnaHQgKEMpIDIwMDEgYnkgUm9hcmluZyBQZW5ndWluIFNvZnR3YXJlIEluYy4sIE1pY2hhbCBPc3Ryb3dza2kKLSogYW5kIEphbWFsIEhhZGkgU2FsaW0uCi0qCi0qIE11Y2ggY29kZSBhbmQgbWFueSBpZGVhcyBkZXJpdmVkIGZyb20gcHBwb2UgcGx1Z2luIGJ5IE1pY2hhbAotKiBPc3Ryb3dza2kgYW5kIEphbWFsIEhhZGkgU2FsaW0sIHdoaWNoIGNhcnJpZXMgdGhpcyBjb3B5cmlnaHQ6Ci0qCi0qIENvcHlyaWdodCAyMDAwIE1pY2hhbCBPc3Ryb3dza2kgPG1vc3Ryb3dzQHN0eXgudXdhdGVybG9vLmNhPiwKLSogICAgICAgICAgICAgICAgSmFtYWwgSGFkaSBTYWxpbSA8aGFkaUBjeWJlcnVzLmNhPgotKiBCb3Jyb3dzIGhlYXZpbHkgZnJvbSB0aGUgUFBQb0FUTSBwbHVnaW4gYnkgTWl0Y2hlbGwgQmxhbmsgSnIuLAotKiB3aGljaCBpcyBiYXNlZCBpbiBwYXJ0IG9uIHdvcmsgZnJvbSBKZW5zIEF4Ym9lIGFuZCBQYXVsIE1hY2tlcnJhcy4KLSoKLSogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSoKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0qCi0qIHBwcG9lLmgKLSoKLSogRGVjbGFyYXRpb24gb2YgdmFyaW91cyBQUFBvRSBjb25zdGFudHMKLSoKLSogQ29weXJpZ2h0IChDKSAyMDAwIFJvYXJpbmcgUGVuZ3VpbiBTb2Z0d2FyZSBJbmMuCi0qCi0qIFRoaXMgcHJvZ3JhbSBtYXkgYmUgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VCi0qIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotKgotKiAkSWQ6IHBwcG9lLmgsdiAxLjQgMjAwOC8wNi8xNSAwNDozNTo1MCBwYXVsdXMgRXhwICQKLSoKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0qCi0qIHJhZGF0dHIuYwotKgotKiBBIHBsdWdpbiB3aGljaCBpcyBzdGFja2VkIG9uIHRvcCBvZiByYWRpdXMuc28uICBUaGlzIHBsdWdpbiB3cml0ZXMKLSogYWxsIFJBRElVUyBhdHRyaWJ1dGVzIGZyb20gdGhlIHNlcnZlcidzIGF1dGhlbnRpY2F0aW9uIGNvbmZpcm1hdGlvbgotKiBpbnRvIC92YXIvcnVuL3JhZGF0dHIucHBwTi4gIFRoZXNlIGF0dHJpYnV0ZXMgYXJlIGF2YWlsYWJsZSBmb3IKLSogY29uc3VtcHRpb24gYnkgL2V0Yy9wcHAvaXAte3VwLGRvd259IHNjcmlwdHMuCi0qCi0qIENvcHlyaWdodCAoQykgMjAwMiBSb2FyaW5nIFBlbmd1aW4gU29mdHdhcmUgSW5jLgotKgotKiBUaGlzIHBsdWdpbiBtYXkgYmUgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VCi0qIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotKgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSoKLSogcmFkaXVzLmMKLSoKLSogUkFESVVTIHBsdWdpbiBmb3IgcHBwZC4gIFBlcmZvcm1zIFBBUCwgQ0hBUCwgTVMtQ0hBUCwgTVMtQ0hBUHYyCi0qIGF1dGhlbnRpY2F0aW9uIHVzaW5nIFJBRElVUy4KLSoKLSogQ29weXJpZ2h0IChDKSAyMDAyIFJvYXJpbmcgUGVuZ3VpbiBTb2Z0d2FyZSBJbmMuCi0qCi0qIEJhc2VkIG9uIGEgcGF0Y2ggZm9yIGlwcHBkLCB3aGljaCBpczoKLSogICAgQ29weXJpZ2h0IChDKSAxOTk2LCBNYXRqYXogR29kZWMgPGdvZHlAZWxnby5zaT4KLSogICAgQ29weXJpZ2h0IChDKSAxOTk2LCBMYXJzIEZlbm5lYmVyZyA8aW41eTA1MEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+Ci0qICAgIENvcHlyaWdodCAoQykgMTk5NywgTWlndWVsIEEuTC4gUGFyYXogPG1hcEBpcGhpbC5uZXQ+Ci0qCi0qIFVzZXMgcmFkaXVzY2xpZW50IGxpYnJhcnksIHdoaWNoIGlzOgotKiAgICBDb3B5cmlnaHQgKEMpIDE5OTUsMTk5NiwxOTk3LDE5OTggTGFycyBGZW5uZWJlcmcgPGxmQGVsZW1lbnRhbC5uZXQ+Ci0qICAgIENvcHlyaWdodCAoQykgMjAwMiBSb2FyaW5nIFBlbmd1aW4gU29mdHdhcmUgSW5jLgotKgotKiBNUFBFIHN1cHBvcnQgaXMgYnkgUmFsZiBIb2ZtYW5uLCA8cmFsZi5ob2ZtYW5uQGVsdmlkby5uZXQ+LCB3aXRoCi0qIG1vZGlmaWNhdGlvbiBmcm9tIEZyYW5rIEN1c2FjaywgPGZyYW5rQGdvb2dsZS5jb20+LgotKgotKiBUaGlzIHBsdWdpbiBtYXkgYmUgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VCi0qIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotKgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSoKLSogcmFkcmVhbG1zLmMKLSoKLSogQSBwcHBkIHBsdWdpbiB3aGljaCBpcyBzdGFja2VkIG9uIHRvcCBvZiByYWRpdXMuc28uICBUaGlzIHBsdWdpbgotKiBhbGxvd3Mgc2VsZWN0aW9uIG9mIGFsdGVybmF0ZSBzZXQgb2Ygc2VydmVycyBiYXNlZCBvbiB0aGUgdXNlcidzIHJlYWxtLgotKgotKiBBdXRob3I6IEJlbiBNY0tlZWdhbiAgYmVuQG5ldHNlcnZlcnMuY28udWsKLSoKLSogQ29weXJpZ2h0IChDKSAyMDAyIE5ldHNlcnZlcnMKLSoKLSogVGhpcyBwbHVnaW4gbWF5IGJlIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVQotKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSoKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0qCi0qIHdpbmJpbmQuYwotKgotKiBXSU5CSU5EIHBsdWdpbiBmb3IgcHBwZC4gIFBlcmZvcm1zIFBBUCwgQ0hBUCwgTVMtQ0hBUCwgTVMtQ0hBUHYyCi0qIGF1dGhlbnRpY2F0aW9uIHVzaW5nIFdJTkJJTkQgdG8gY29udGFjdCBhIE5ULXN0eWxlIFBEQy4KLSoKLSogQmFzZWQgb24gdGhlIHN0cnVjdHVyZSBvZiB0aGUgcmFkaXVzIG1vZHVsZS4KLSoKLSogQ29weXJpZ2h0IChDKSAyMDAzIEFuZHJldyBCYXJ0bGV0IDxhYmFydGxldEBzYW1iYS5vcmc+Ci0qCi0qIENvcHlyaWdodCAxOTk5IFBhdWwgTWFja2VycmFzLCBBbGFuIEN1cnJ5LgotKiAocGlwZSByZWFkIGNvZGUgZnJvbSBwYXNzcHJvbXQuYykKLSoKLSogQ29weXJpZ2h0IChDKSAyMDAyIFJvYXJpbmcgUGVuZ3VpbiBTb2Z0d2FyZSBJbmMuCi0qCi0qIEJhc2VkIG9uIGEgcGF0Y2ggZm9yIGlwcHBkLCB3aGljaCBpczoKLSogICAgQ29weXJpZ2h0IChDKSAxOTk2LCBNYXRqYXogR29kZWMgPGdvZHlAZWxnby5zaT4KLSogICAgQ29weXJpZ2h0IChDKSAxOTk2LCBMYXJzIEZlbm5lYmVyZyA8aW41eTA1MEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+Ci0qICAgIENvcHlyaWdodCAoQykgMTk5NywgTWlndWVsIEEuTC4gUGFyYXogPG1hcEBpcGhpbC5uZXQ+Ci0qCi0qIFVzZXMgcmFkaXVzY2xpZW50IGxpYnJhcnksIHdoaWNoIGlzOgotKiAgICBDb3B5cmlnaHQgKEMpIDE5OTUsMTk5NiwxOTk3LDE5OTggTGFycyBGZW5uZWJlcmcgPGxmQGVsZW1lbnRhbC5uZXQ+Ci0qICAgIENvcHlyaWdodCAoQykgMjAwMiBSb2FyaW5nIFBlbmd1aW4gU29mdHdhcmUgSW5jLgotKgotKiBNUFBFIHN1cHBvcnQgaXMgYnkgUmFsZiBIb2ZtYW5uLCA8cmFsZi5ob2ZtYW5uQGVsdmlkby5uZXQ+LCB3aXRoCi0qIG1vZGlmaWNhdGlvbiBmcm9tIEZyYW5rIEN1c2FjaywgPGZyYW5rQGdvb2dsZS5jb20+LgotKgotKiBVcGRhdGVkIG9uIDIwMDMtMTItMTIgdG8gc3VwcG9ydCB1cGRhdGVkIFBQUCBwbHVnaW4gQVBJIGZyb20gbGF0ZXN0IENWUwotKiAgICBDb3B5cmlnaHQgKEMpIDIwMDMsIFNlYW4gRS4gTWlsbGljaGFtcCA8c2VhbiBhdCBicnVlbm9yIGRvdCBvcmc+Ci0qCi0qIFRoaXMgcGx1Z2luIG1heSBiZSBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUKLSogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0qCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLlwiIG1hbnVhbCBwYWdlIFtdIGZvciBwcHBkIDIuNAotLlwiICRJZDogcHBwZC44LHYgMS45MCAyMDA4LzAzLzI2IDEyOjA5OjQwIHBhdWx1cyBFeHAgJAotLlwiIFNIIHNlY3Rpb24gaGVhZGluZwotLlwiIFNTIHN1YnNlY3Rpb24gaGVhZGluZwotLlwiIExQIHBhcmFncmFwaAotLlwiIElQIGluZGVudGVkIHBhcmFncmFwaAotLlwiIFRQIGhhbmdpbmcgbGFiZWwKLS5cIgotLlwiIENvcHlyaWdodCAoYykgMTk5My0yMDAzIFBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPgotLlwiCi0uXCIgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0uXCIgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotLlwiIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0uXCIKLS5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1JTIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTCi0uXCIgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0uXCIgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotLlwiIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotLlwiIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0uXCIgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotLlNIIEFVVEhPUlMKLVBhdWwgTWFja2VycmFzIChwYXVsdXNAc2FtYmEub3JnKSwgYmFzZWQgb24gZWFybGllciB3b3JrIGJ5Ci1EcmV3IFBlcmtpbnMsCi1CcmFkIENsZW1lbnRzLAotS2FybCBGb3gsCi1HcmVnIENocmlzdHksCi1hbmQKLUJyYWQgUGFya2VyLgotCi0uU0ggQ09QWVJJR0hUCi1QcHBkIGlzIGNvcHlyaWdodGVkIGFuZCBtYWRlIGF2YWlsYWJsZSB1bmRlciBjb25kaXRpb25zIHdoaWNoIHByb3ZpZGUKLXRoYXQgaXQgbWF5IGJlIGNvcGllZCBhbmQgdXNlZCBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zIHByb3ZpZGVkIHRoYXQKLXRoZSBjb25kaXRpb25zIGxpc3RlZCBiZWxvdyBhcmUgbWV0LiAgUG9ydGlvbnMgb2YgcHBwZCBhcmUgY292ZXJlZCBieQotdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQgbm90aWNlczoKLS5MUAotQ29weXJpZ2h0IChjKSAxOTg0LTIwMDAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuIEFsbCByaWdodHMKLXJlc2VydmVkLgotLmJyCi1Db3B5cmlnaHQgKGMpIDE5OTMtMjAwNCBQYXVsIE1hY2tlcnJhcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5icgotQ29weXJpZ2h0IChjKSAxOTk1IFBlZHJvIFJvcXVlIE1hcnF1ZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLmJyCi1Db3B5cmlnaHQgKGMpIDE5OTUgRXJpYyBSb3NlbnF1aXN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5icgotQ29weXJpZ2h0IChjKSAxOTk5IFRvbW1pIEtvbXVsYWluZW4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLmJyCi1Db3B5cmlnaHQgKEMpIEFuZHJldyBUcmlkZ2VsbCAxOTk5Ci0uYnIKLUNvcHlyaWdodCAoYykgMjAwMCBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLmJyCi1Db3B5cmlnaHQgKGMpIDIwMDEgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5icgotQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS5MUAotVGhlIGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnRzLgotLkxQCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLS5MUAotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS5MUAotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgZGlzdHJpYnV0aW9uLgotLkxQCi0zLiBUaGUgbmFtZSAiQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciBwZXJtaXNzaW9uIG9yIGFueSBsZWdhbAotICAgZGV0YWlscywgcGxlYXNlIGNvbnRhY3QKLS5icgotICAgICBPZmZpY2Ugb2YgVGVjaG5vbG9neSBUcmFuc2ZlcgotLmJyCi0gICAgIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5Ci0uYnIKLSAgICAgNTAwMCBGb3JiZXMgQXZlbnVlCi0uYnIKLSAgICAgUGl0dHNidXJnaCwgUEEgIDE1MjEzLTM4OTAKLS5icgotICAgICAoNDEyKSAyNjgtNDM4NywgZmF4OiAoNDEyKSAyNjgtNzM5NQotLmJyCi0gICAgIHRlY2gtdHJhbnNmZXJAYW5kcmV3LmNtdS5lZHUKLS5MUAotM2IuIFRoZSBuYW1lKHMpIG9mIHRoZSBhdXRob3JzIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgdXNlZCB0bwotICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS5MUAotNC4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICAgYWNrbm93bGVkZ2VtZW50czoKLS5icgotICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQ29tcHV0aW5nIFNlcnZpY2VzCi0gICAgYXQgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkgKGh0dHA6Ly93d3cuY211LmVkdS9jb21wdXRpbmcvKS4iCi0uYnIKLSAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFBhdWwgTWFja2VycmFzCi0gICAgPHBhdWx1c0BzYW1iYS5vcmc+Ii4KLS5icgotICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgUGVkcm8gUm9xdWUgTWFycXVlcwotICAgIDxwZWRyb19tQHlhaG9vLmNvbT4iLgotLmJyCi0gICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBUb21taSBLb211bGFpbmVuCi0gICAgPFRvbW1pLktvbXVsYWluZW5AaWtpLmZpPiIuCi0uTFAKLUNBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi1BTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgQkUgTElBQkxFCi1GT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLS5MUAotVEhFIEFVVEhPUlMgT0YgVEhJUyBTT0ZUV0FSRSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi1BTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKLVNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Db3B5cmlnaHQgKEMpIDIwMDEgUm9hcmluZyBQZW5ndWluIFNvZnR3YXJlIEluYy4KLQotVGhpcyBwcm9ncmFtIG1heSBiZSBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0kSWQ6IE1ha2VmaWxlLmxpbnV4LHYgMS44IDIwMDgvMDYvMDkgMDg6MzQ6MjMgcGF1bHVzIEV4cCAkCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Db3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Db3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Db3B5cmlnaHQgKGMpIDE5OTQsIDE5OTUsIDE5OTYKLSAgIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLTEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0yLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLTMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQotICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQ29tcHV0ZXIgU3lzdGVtcwotICAgRW5naW5lZXJpbmcgR3JvdXAgYXQgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeS4KLTQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIG9mIHRoZSBMYWJvcmF0b3J5IG1heSBiZSB1c2VkCi0gICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi1JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi1GT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLU9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLUxJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLU9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLVNVQ0ggREFNQUdFLgotCi1AKCMpICRIZWFkZXI6IC9kYXRhL2N2cy9wcHAvaW5jbHVkZS9wY2FwLWludC5oLHYgMS4xIDIwMDAvMDgvMDEgMDE6Mzc6MjQgcGF1bHVzIEV4cCAkIChMQkwpCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ29weXJpZ2h0IDIwMDAgTWl0Y2hlbGwgQmxhbmsgSnIuCi1CYXNlZCBpbiBwYXJ0IG9uIHdvcmsgZnJvbSBKZW5zIEF4Ym9lIGFuZCBQYXVsIE1hY2tlcnJhcy4KLVVwZGF0ZWQgdG8gcHBwLTIuNC4xIGJ5IEJlcm5oYXJkIEthaW5kbAotCi1VcGRhdGVkIHRvIHBwcC0yLjQuMiBieSBEYXZpZCBXb29kaG91c2UgMjAwNC4KLSAtIGRpc2Nvbm5lY3QgbWV0aG9kIGFkZGVkCi0gLSByZW1vdmVfb3B0aW9ucygpIGFidXNlIHJlbW92ZWQuCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNvcHlyaWdodCAyMDAyIFJvYXJpbmcgUGVuZ3VpbiBTb2Z0d2FyZSBJbmMuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRGVmaW5pdGlvbnMgZm9yIHRjcCBjb21wcmVzc2lvbiByb3V0aW5lcy4KLQotJElkOiBzbGNvbXByZXNzLmgsdiAxLjQgMTk5NC8wOS8yMSAwNjo1MDowOCBwYXVsdXMgRXhwICQKLQotQ29weXJpZ2h0IChjKSAxOTg5IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCi1kdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAotYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAotZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAotYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkuICBUaGUgbmFtZSBvZiB0aGUKLVVuaXZlcnNpdHkgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi1mcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLVdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotICAgVmFuIEphY29ic29uICh2YW5AaGVsaW9zLmVlLmxibC5nb3YpLCBEZWMgMzEsIDE5ODk6Ci0gICAtIEluaXRpYWwgZGlzdHJpYnV0aW9uLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLURlZmluaXRpb25zIGZvciB0Y3AgY29tcHJlc3Npb24gcm91dGluZXMuCi0KLSRJZDogdmpjb21wcmVzcy5oLHYgMS4zIDE5OTYvMDUvMjggMDA6NTU6MzMgcGF1bHVzIEV4cCAkCi0KLUNvcHlyaWdodCAoYykgMTk4OSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLXByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFyZQotZHVwbGljYXRlZCBpbiBhbGwgc3VjaCBmb3JtcyBhbmQgdGhhdCBhbnkgZG9jdW1lbnRhdGlvbiwKLWFkdmVydGlzaW5nIG1hdGVyaWFscywgYW5kIG90aGVyIG1hdGVyaWFscyByZWxhdGVkIHRvIHN1Y2gKLWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGFja25vd2xlZGdlIHRoYXQgdGhlIHNvZnR3YXJlIHdhcyBkZXZlbG9wZWQKLWJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5LiAgVGhlIG5hbWUgb2YgdGhlCi1Vbml2ZXJzaXR5IG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLUlNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi1XQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLSAgIFZhbiBKYWNvYnNvbiAodmFuQGhlbGlvcy5lZS5sYmwuZ292KSwgRGVjIDMxLCAxOTg5OgotICAgLSBJbml0aWFsIGRpc3RyaWJ1dGlvbi4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1EZXJpdmVkIGZyb20gOgotCi0KLWlwY3AuYyAtIFBQUCBJUCBDb250cm9sIFByb3RvY29sLgotCi1Db3B5cmlnaHQgKGMpIDE5ODQtMjAwMCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLWFyZSBtZXQ6Ci0KLTEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLTIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAgIGRpc3RyaWJ1dGlvbi4KLQotMy4gVGhlIG5hbWUgIkNhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3IgcGVybWlzc2lvbiBvciBhbnkgbGVnYWwKLSAgIGRldGFpbHMsIHBsZWFzZSBjb250YWN0Ci0gICAgIE9mZmljZSBvZiBUZWNobm9sb2d5IFRyYW5zZmVyCi0gICAgIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5Ci0gICAgIDUwMDAgRm9yYmVzIEF2ZW51ZQotICAgICBQaXR0c2J1cmdoLCBQQSAgMTUyMTMtMzg5MAotICAgICAoNDEyKSAyNjgtNDM4NywgZmF4OiAoNDEyKSAyNjgtNzM5NQotICAgICB0ZWNoLXRyYW5zZmVyQGFuZHJldy5jbXUuZWR1Ci0KLTQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAgIGFja25vd2xlZGdtZW50OgotICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQ29tcHV0aW5nIFNlcnZpY2VzCi0gICAgYXQgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkgKGh0dHA6Ly93d3cuY211LmVkdS9jb21wdXRpbmcvKS4iCi0KLUNBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi1BTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgQkUgTElBQkxFCi1GT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotJElkOiBpcHY2Y3AuYyx2IDEuMjEgMjAwNS8wOC8yNSAyMzo1OTozNCBwYXVsdXMgRXhwICQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1EZXJpdmVkIGZyb20gOgotCi0KLWlwY3AuaCAtIElQIENvbnRyb2wgUHJvdG9jb2wgZGVmaW5pdGlvbnMuCi0KLUNvcHlyaWdodCAoYykgMTk4NC0yMDAwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgZGlzdHJpYnV0aW9uLgotCi0zLiBUaGUgbmFtZSAiQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciBwZXJtaXNzaW9uIG9yIGFueSBsZWdhbAotICAgZGV0YWlscywgcGxlYXNlIGNvbnRhY3QKLSAgICAgT2ZmaWNlIG9mIFRlY2hub2xvZ3kgVHJhbnNmZXIKLSAgICAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAgICAgNTAwMCBGb3JiZXMgQXZlbnVlCi0gICAgIFBpdHRzYnVyZ2gsIFBBICAxNTIxMy0zODkwCi0gICAgICg0MTIpIDI2OC00Mzg3LCBmYXg6ICg0MTIpIDI2OC03Mzk1Ci0gICAgIHRlY2gtdHJhbnNmZXJAYW5kcmV3LmNtdS5lZHUKLQotNC4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICAgYWNrbm93bGVkZ21lbnQ6Ci0gICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBDb21wdXRpbmcgU2VydmljZXMKLSAgICBhdCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSAoaHR0cDovL3d3dy5jbXUuZWR1L2NvbXB1dGluZy8pLiIKLQotQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi1USElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLUFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBCRSBMSUFCTEUKLUZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi1XSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0kSWQ6IGlwdjZjcC5oLHYgMS43IDIwMDIvMTIvMDQgMjM6MDM6MzIgcGF1bHVzIEV4cCAkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTW9kaWZpY2F0aW9ucyBieSBGcmFuayBDdXNhY2ssIGZyYW5rQGdvb2dsZS5jb20sIE1hcmNoIDIwMDIuCi0KLSAgSW1wbGVtZW50ZWQgTVMtQ0hBUHYyIGZ1bmN0aW9uYWxpdHksIGhlYXZpbHkgYmFzZWQgb24gc2FtcGxlCi0gIGltcGxlbWVudGF0aW9uIGluIFJGQyAyNzU5LiAgSW1wbGVtZW50ZWQgTVBQRSBmdW5jdGlvbmFsaXR5LAotICBoZWF2aWx5IGJhc2VkIG9uIHNhbXBsZSBpbXBsZW1lbnRhdGlvbiBpbiBSRkMgMzA3OS4KLQotQ29weXJpZ2h0IChjKSAyMDAyIEdvb2dsZSwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLWFyZSBtZXQ6Ci0KLTEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLTIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAgIGRpc3RyaWJ1dGlvbi4KLQotMy4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USEUgQVVUSE9SUyBPRiBUSElTIFNPRlRXQVJFIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi1USElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLUFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi1XSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVBlcmZvcm0gUFBQb0UgZGlzY292ZXJ5Ci0KLUNvcHlyaWdodCAoQykgMjAwMC0yMDAxIGJ5IFJvYXJpbmcgUGVuZ3VpbiBTb2Z0d2FyZSBJbmMuCi1Db3B5cmlnaHQgKEMpIDIwMDQgTWFyY28gZCdJdHJpIDxtZEBsaW51eC5pdD4KLQotVGhpcyBwcm9ncmFtIG1heSBiZSBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVNlZSB0aGUgcmVzcGVjdGl2ZSBzb3VyY2UgZmlsZXMgdG8gZmluZCBvdXQgd2hpY2ggY29weXJpZ2h0cyBhcHBseS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKEMpIDIwMDIgUm9hcmluZyBQZW5ndWluIFNvZnR3YXJlIEluYy4KLQotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci1wdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzCi1jb3B5cmlnaHQgYW5kIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBvbiBhbGwgY29waWVzIGFuZCBzdXBwb3J0aW5nCi1kb2N1bWVudGF0aW9uLCB0aGUgbmFtZSBvZiBSb2FyaW5nIFBlbmd1aW4gU29mdHdhcmUgSW5jLiBub3QgYmUgdXNlZAotaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBwcm9ncmFtCi13aXRob3V0IHNwZWNpZmljIHByaW9yIHBlcm1pc3Npb24sIGFuZCBub3RpY2UgYmUgZ2l2ZW4gaW4gc3VwcG9ydGluZwotZG9jdW1lbnRhdGlvbiB0aGF0IGNvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBpcyBieSBwZXJtaXNzaW9uIG9mCi1Sb2FyaW5nIFBlbmd1aW4gU29mdHdhcmUgSW5jLi4KLQotUm9hcmluZyBQZW5ndWluIFNvZnR3YXJlIEluYy4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQotc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCi13aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKEMpIDE5OTUsMTk5NiwxOTk3LDE5OTggTGFycyBGZW5uZWJlcmcgPGxmQGVsZW1lbnRhbC5uZXQ+Ci0KLVBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBjb3B5cmlnaHQgYW5kCi1wZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgb24gYWxsIGNvcGllcyBhbmQgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCB0aGUKLW5hbWUgb2YgTGFycyBGZW5uZWJlcmcgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8KLWRpc3RyaWJ1dGlvbiBvZiB0aGUgcHJvZ3JhbSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHBlcm1pc3Npb24sIGFuZCBub3RpY2UgYmUKLWdpdmVuIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiB0aGF0IGNvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBpcyBieQotcGVybWlzc2lvbiBvZiBMYXJzIEZlbm5lYmVyZy4KLQotTGFycyBGZW5uZWJlcmcgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzCi1zb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCi13YXJyYW50eS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgMTk5MiBMaXZpbmdzdG9uIEVudGVycHJpc2VzLCBJbmMuCi1MaXZpbmdzdG9uIEVudGVycHJpc2VzLCBJbmMuIDY5MjAgS29sbCBDZW50ZXIgUGFya3dheSBQbGVhc2FudG9uLCBDQSAgOTQ1NjYKLQotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci1wdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIGNvcHlyaWdodAotYW5kIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBvbiBhbGwgY29waWVzIGFuZCBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sCi10aGUgbmFtZSBvZiBMaXZpbmdzdG9uIEVudGVycHJpc2VzLCBJbmMuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCi1wdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHByb2dyYW0gd2l0aG91dCBzcGVjaWZpYwotcHJpb3IgcGVybWlzc2lvbiwgYW5kIG5vdGljZSBiZSBnaXZlbiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24gdGhhdAotY29weWluZyBhbmQgZGlzdHJpYnV0aW9uIGlzIGJ5IHBlcm1pc3Npb24gb2YgTGl2aW5nc3RvbiBFbnRlcnByaXNlcywgSW5jLgotCi1MaXZpbmdzdG9uIEVudGVycHJpc2VzLCBJbmMuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkKLW9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3MKLW9yIGltcGxpZWQgd2FycmFudHkuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVtDXSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbiBhbmQgTWVyaXQgTmV0d29yaywgSW5jLiAxOTkyLAotMTk5MywgMTk5NCwgMTk5NSBBbGwgUmlnaHRzIFJlc2VydmVkCi0KLVBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZAotdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCi1jb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCBkZXJpdmF0aXZlIHdvcmtzIG9yIG1vZGlmaWVkIHZlcnNpb25zIHRoZXJlb2YsCi1hbmQgdGhhdCBib3RoIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gYW5kIGRpc2NsYWltZXIKLW5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSCi1FWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBSRUdFTlRTIE9GIFRIRQotVU5JVkVSU0lUWSBPRiBNSUNISUdBTiBBTkQgTUVSSVQgTkVUV09SSywgSU5DLiBETyBOT1QgV0FSUkFOVCBUSEFUIFRIRQotRlVOQ1RJT05TIENPTlRBSU5FRCBJTiBUSEUgU09GVFdBUkUgV0lMTCBNRUVUIExJQ0VOU0VFJ1MgUkVRVUlSRU1FTlRTIE9SCi1USEFUIE9QRVJBVElPTiBXSUxMIEJFIFVOSU5URVJSVVBURUQgT1IgRVJST1IgRlJFRS4gIFRoZSBSZWdlbnRzIG9mIHRoZQotVW5pdmVyc2l0eSBvZiBNaWNoaWdhbiBhbmQgTWVyaXQgTmV0d29yaywgSW5jLiBzaGFsbCBub3QgYmUgbGlhYmxlIGZvciBhbnkKLXNwZWNpYWwsIGluZGlyZWN0LCBpbmNpZGVudGFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyB3aXRoIHJlc3BlY3QgdG8gYW55Ci1jbGFpbSBieSBMaWNlbnNlZSBvciBhbnkgdGhpcmQgcGFydHkgYXJpc2luZyBmcm9tIHVzZSBvZiB0aGUgc29mdHdhcmUuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoQykgMTk5MS0yLCBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBDcmVhdGVkIDE5OTEuCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1MaWNlbnNlIHRvIGNvcHkgYW5kIHVzZSB0aGlzIHNvZnR3YXJlIGlzIGdyYW50ZWQgcHJvdmlkZWQgdGhhdCBpdAotaXMgaWRlbnRpZmllZCBhcyB0aGUgIlJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlLURpZ2VzdAotQWxnb3JpdGhtIiBpbiBhbGwgbWF0ZXJpYWwgbWVudGlvbmluZyBvciByZWZlcmVuY2luZyB0aGlzIHNvZnR3YXJlCi1vciB0aGlzIGZ1bmN0aW9uLgotCi1MaWNlbnNlIGlzIGFsc28gZ3JhbnRlZCB0byBtYWtlIGFuZCB1c2UgZGVyaXZhdGl2ZSB3b3JrcyBwcm92aWRlZAotdGhhdCBzdWNoIHdvcmtzIGFyZSBpZGVudGlmaWVkIGFzICJkZXJpdmVkIGZyb20gdGhlIFJTQSBEYXRhCi1TZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtIiBpbiBhbGwgbWF0ZXJpYWwKLW1lbnRpb25pbmcgb3IgcmVmZXJlbmNpbmcgdGhlIGRlcml2ZWQgd29yay4KLQotUlNBIERhdGEgU2VjdXJpdHksIEluYy4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGNvbmNlcm5pbmcgZWl0aGVyCi10aGUgbWVyY2hhbnRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgb3IgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMKLXNvZnR3YXJlIGZvciBhbnkgcGFydGljdWxhciBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCi13aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eSBvZiBhbnkga2luZC4KLQotVGhlc2Ugbm90aWNlcyBtdXN0IGJlIHJldGFpbmVkIGluIGFueSBjb3BpZXMgb2YgYW55IHBhcnQgb2YgdGhpcwotZG9jdW1lbnRhdGlvbiBhbmQvb3Igc29mdHdhcmUuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1TeXN0ZW0tZGVwZW5kZW50IHByb2NlZHVyZXMgZm9yIHBwcGQgdW5kZXIgU29sYXJpcyAyLgotCi1QYXJ0cyByZS13cml0dGVuIGJ5IEFkaSBNYXNwdXRyYSA8YWRpLm1hc3B1dHJhQHN1bi5jb20+LCBiYXNlZCBvbgotdGhlIG9yaWdpbmFsIHN5cy1zdnI0LmMKLQotQ29weXJpZ2h0IChjKSAyMDAwIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotZG9jdW1lbnRhdGlvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0Ci1ub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLgotCi1TVU4gTUFLRVMgTk8gUkVQUkVTRU5UQVRJT04gT1IgV0FSUkFOVElFUyBBQk9VVCBUSEUgU1VJVEFCSUxJVFkgT0YKLVRIRSBTT0ZUV0FSRSwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAotVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEKLVBBUlRJQ1VMQVIgUFVSUE9TRSwgT1IgTk9OLUlORlJJTkdFTUVOVC4gIFNVTiBTSEFMTCBOT1QgQkUgTElBQkxFIEZPUgotQU5ZIERBTUFHRVMgU1VGRkVSRUQgQlkgTElDRU5TRUUgQVMgQSBSRVNVTFQgT0YgVVNJTkcsIE1PRElGWUlORyBPUgotRElTVFJJQlVUSU5HIFRISVMgU09GVFdBUkUgT1IgSVRTIERFUklWQVRJVkVTCi0KLUNvcHlyaWdodCAoYykgMTk5NS0yMDAyIFBhdWwgTWFja2VycmFzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi0zLiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gICBhY2tub3dsZWRnbWVudDoKLSAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFBhdWwgTWFja2VycmFzCi0gICAgPHBhdWx1c0BzYW1iYS5vcmc+Ii4KLQotVEhFIEFVVEhPUlMgT0YgVEhJUyBTT0ZUV0FSRSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi1BTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKLVNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotRGVyaXZlZCBmcm9tIG1haW4uYyBhbmQgcHBwZC5oLCB3aGljaCBhcmU6Ci0KLUNvcHlyaWdodCAoYykgMTk4NC0yMDAwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgZGlzdHJpYnV0aW9uLgotCi0zLiBUaGUgbmFtZSAiQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciBwZXJtaXNzaW9uIG9yIGFueSBsZWdhbAotICAgZGV0YWlscywgcGxlYXNlIGNvbnRhY3QKLSAgICAgT2ZmaWNlIG9mIFRlY2hub2xvZ3kgVHJhbnNmZXIKLSAgICAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAgICAgNTAwMCBGb3JiZXMgQXZlbnVlCi0gICAgIFBpdHRzYnVyZ2gsIFBBICAxNTIxMy0zODkwCi0gICAgICg0MTIpIDI2OC00Mzg3LCBmYXg6ICg0MTIpIDI2OC03Mzk1Ci0gICAgIHRlY2gtdHJhbnNmZXJAYW5kcmV3LmNtdS5lZHUKLQotNC4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICAgYWNrbm93bGVkZ21lbnQ6Ci0gICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBDb21wdXRpbmcgU2VydmljZXMKLSAgICBhdCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSAoaHR0cDovL3d3dy5jbXUuZWR1L2NvbXB1dGluZy8pLiIKLQotQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi1USElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLUFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBCRSBMSUFCTEUKLUZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi1XSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBmaWxlcyBhbnMuYywgYXRtLmgsIGF0bXJlcy5oLCBhdG1zYXAuaCwgbWlzYy5jLCB0ZXh0MmF0bS5jICBhbmQKLXRleHQycW9zLmMgYXJlIHRha2VuIGZyb20gdGhlIGxpbnV4LWF0bSBsaWJyYXJpZXMuICBUaGVzZSBhcmUKLUNvcHlyaWdodCAxOTk1LTIwMDAgRVBGTC1MUkMvSUNBLCBhbmQgYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgTGVzc2VyCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotCi1UaGUgZmlsZSBwcHBvYXRtLmMgY29udGFpbnMgaXRzIG93biBjb3B5cmlnaHQgbm90aWNlLCBhbmQgaXMgbGljZW5zZWQKLXVuZGVyIHRoZSBHUEwuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVXRpbGl0eSBwcm9ncmFtIGZvciBnZW5lcmF0aW5nIGVudHJpZXMgaW4gL2V0Yy9wcHAvc3JwLXNlY3JldHMKLQotQ29weXJpZ2h0IChjKSAyMDAxIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLU5vbi1leGNsdXNpdmUgcmlnaHRzIHRvIHJlZGlzdHJpYnV0ZSwgbW9kaWZ5LCB0cmFuc2xhdGUsIGFuZCB1c2UKLXRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIGluIHdob2xlIG9yIGluIHBhcnQsIGlzCi1oZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcwotZHVwbGljYXRlZCBpbiBhbnkgc291cmNlIGZvcm0sIGFuZCB0aGF0IG5laXRoZXIgdGhlIG5hbWUgb2YgdGhlCi1jb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgYXV0aG9yIGlzIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi1wcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZS4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLUlNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi1XQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLU9yaWdpbmFsIHZlcnNpb24gYnkgSmFtZXMgQ2FybHNvbgotCi1Vc2FnZToKLSAgIHNycC1lbnRyeSBbLWkgaW5kZXhdIFtjbGllbnRuYW1lXQotCi1JbmRleCwgaWYgc3VwcGxpZWQsIGlzIHRoZSBtb2R1bHVzL2dlbmVyYXRvciBpbmRleCBmcm9tCi0vZXRjL3RwYXNzd2QuY29uZi4gIElmIG5vdCBzdXBwbGllZCwgdGhlbiB0aGUgbGFzdCAoaGlnaGVzdAotbnVtYmVyZWQpIGVudHJ5IGZyb20gdGhhdCBmaWxlIGlzIHVzZWQuICBJZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0LAotdGhlbiB0aGUgZGVmYXVsdCAid2VsbCBrbm93biIgRUFQIFNSUC1TSEExIG1vZHVsdXMvZ2VuZXJhdG9yIGlzCi11c2VkLgotCi1UaGUgZGVmYXVsdCBtb2R1bHVzL2dlbmVyYXRvciBjYW4gYmUgcmVxdWVzdGVkIGFzIGluZGV4IDAuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYXV0aC5jIC0gUFBQIGF1dGhlbnRpY2F0aW9uIGFuZCBwaGFzZSBjb250cm9sLgotCi1Db3B5cmlnaHQgKGMpIDE5OTMtMjAwMiBQYXVsIE1hY2tlcnJhcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLWFyZSBtZXQ6Ci0KLTEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLTIuIFRoZSBuYW1lKHMpIG9mIHRoZSBhdXRob3JzIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgdXNlZCB0bwotICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotMy4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICAgYWNrbm93bGVkZ21lbnQ6Ci0gICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBQYXVsIE1hY2tlcnJhcwotICAgIDxwYXVsdXNAc2FtYmEub3JnPiIuCi0KLVRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLVRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi1TUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLVdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KLURlcml2ZWQgZnJvbSBtYWluLmMsIHdoaWNoIGlzOgotCi1Db3B5cmlnaHQgKGMpIDE5ODQtMjAwMCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLWFyZSBtZXQ6Ci0KLTEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLTIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAgIGRpc3RyaWJ1dGlvbi4KLQotMy4gVGhlIG5hbWUgIkNhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3IgcGVybWlzc2lvbiBvciBhbnkgbGVnYWwKLSAgIGRldGFpbHMsIHBsZWFzZSBjb250YWN0Ci0gICAgIE9mZmljZSBvZiBUZWNobm9sb2d5IFRyYW5zZmVyCi0gICAgIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5Ci0gICAgIDUwMDAgRm9yYmVzIEF2ZW51ZQotICAgICBQaXR0c2J1cmdoLCBQQSAgMTUyMTMtMzg5MAotICAgICAoNDEyKSAyNjgtNDM4NywgZmF4OiAoNDEyKSAyNjgtNzM5NQotICAgICB0ZWNoLXRyYW5zZmVyQGFuZHJldy5jbXUuZWR1Ci0KLTQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAgIGFja25vd2xlZGdtZW50OgotICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQ29tcHV0aW5nIFNlcnZpY2VzCi0gICAgYXQgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkgKGh0dHA6Ly93d3cuY211LmVkdS9jb21wdXRpbmcvKS4iCi0KLUNBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi1BTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgQkUgTElBQkxFCi1GT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jYmNwIC0gQ2FsbCBCYWNrIENvbmZpZ3VyYXRpb24gUHJvdG9jb2wuCi0KLUNvcHlyaWdodCAoYykgMTk5NSBQZWRybyBSb3F1ZSBNYXJxdWVzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLWFyZSBtZXQ6Ci0KLTEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLTIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAgIGRpc3RyaWJ1dGlvbi4KLQotMy4gVGhlIG5hbWVzIG9mIHRoZSBhdXRob3JzIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgdXNlZCB0bwotICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotNC4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICAgYWNrbm93bGVkZ21lbnQ6Ci0gICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBQZWRybyBSb3F1ZSBNYXJxdWVzCi0gICAgPHBlZHJvX21AeWFob28uY29tPiIKLQotVEhFIEFVVEhPUlMgT0YgVEhJUyBTT0ZUV0FSRSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi1BTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKLVNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jY3AuYyAtIFBQUCBDb21wcmVzc2lvbiBDb250cm9sIFByb3RvY29sLgotCi1Db3B5cmlnaHQgKGMpIDE5OTQtMjAwMiBQYXVsIE1hY2tlcnJhcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLWFyZSBtZXQ6Ci0KLTEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLTIuIFRoZSBuYW1lKHMpIG9mIHRoZSBhdXRob3JzIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgdXNlZCB0bwotICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotMy4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICAgYWNrbm93bGVkZ21lbnQ6Ci0gICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBQYXVsIE1hY2tlcnJhcwotICAgIDxwYXVsdXNAc2FtYmEub3JnPiIuCi0KLVRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLVRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi1TUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLVdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2NwLmggLSBEZWZpbml0aW9ucyBmb3IgUFBQIENvbXByZXNzaW9uIENvbnRyb2wgUHJvdG9jb2wuCi0KLUNvcHlyaWdodCAoYykgMTk5NC0yMDAyIFBhdWwgTWFja2VycmFzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi0zLiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gICBhY2tub3dsZWRnbWVudDoKLSAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFBhdWwgTWFja2VycmFzCi0gICAgPHBhdWx1c0BzYW1iYS5vcmc+Ii4KLQotVEhFIEFVVEhPUlMgT0YgVEhJUyBTT0ZUV0FSRSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi1BTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKLVNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotJElkOiBjY3AuaCx2IDEuMTIgMjAwNC8xMS8wNCAxMDowMjoyNiBwYXVsdXMgRXhwICQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jaGFwLW1kNS5jIC0gTmV3IENIQVAvTUQ1IGltcGxlbWVudGF0aW9uLgotCi1Db3B5cmlnaHQgKGMpIDIwMDMgUGF1bCBNYWNrZXJyYXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi1hcmUgbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0yLiBUaGUgbmFtZShzKSBvZiB0aGUgYXV0aG9ycyBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLTMuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAgIGFja25vd2xlZGdtZW50OgotICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgUGF1bCBNYWNrZXJyYXMKLSAgICA8cGF1bHVzQHNhbWJhLm9yZz4iLgotCi1USEUgQVVUSE9SUyBPRiBUSElTIFNPRlRXQVJFIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi1USElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLUFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi1XSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNoYXAtbWQ1LmggLSBOZXcgQ0hBUC9NRDUgaW1wbGVtZW50YXRpb24uCi0KLUNvcHlyaWdodCAoYykgMjAwMyBQYXVsIE1hY2tlcnJhcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLWFyZSBtZXQ6Ci0KLTEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLTIuIFRoZSBuYW1lKHMpIG9mIHRoZSBhdXRob3JzIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgdXNlZCB0bwotICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotMy4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICAgYWNrbm93bGVkZ21lbnQ6Ci0gICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBQYXVsIE1hY2tlcnJhcwotICAgIDxwYXVsdXNAc2FtYmEub3JnPiIuCi0KLVRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLVRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi1TUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLVdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2hhcC1uZXcuYyAtIE5ldyBDSEFQIGltcGxlbWVudGF0aW9uLgotCi1Db3B5cmlnaHQgKGMpIDIwMDMgUGF1bCBNYWNrZXJyYXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi1hcmUgbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0yLiBUaGUgbmFtZShzKSBvZiB0aGUgYXV0aG9ycyBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLTMuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAgIGFja25vd2xlZGdtZW50OgotICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgUGF1bCBNYWNrZXJyYXMKLSAgICA8cGF1bHVzQHNhbWJhLm9yZz4iLgotCi1USEUgQVVUSE9SUyBPRiBUSElTIFNPRlRXQVJFIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi1USElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLUFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi1XSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNoYXBfbXMuYyAtIE1pY3Jvc29mdCBNUy1DSEFQIGNvbXBhdGlibGUgaW1wbGVtZW50YXRpb24uCi0KLUNvcHlyaWdodCAoYykgMTk5NSBFcmljIFJvc2VucXVpc3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgZGlzdHJpYnV0aW9uLgotCi0zLiBUaGUgbmFtZShzKSBvZiB0aGUgYXV0aG9ycyBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLVRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi1TUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLVdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2hhcF9tcy5oIC0gQ2hhbGxlbmdlIEhhbmRzaGFrZSBBdXRoZW50aWNhdGlvbiBQcm90b2NvbCBkZWZpbml0aW9ucy4KLQotQ29weXJpZ2h0IChjKSAxOTk1IEVyaWMgUm9zZW5xdWlzdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi1hcmUgbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0yLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gICBkaXN0cmlidXRpb24uCi0KLTMuIFRoZSBuYW1lKHMpIG9mIHRoZSBhdXRob3JzIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgdXNlZCB0bwotICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotVEhFIEFVVEhPUlMgT0YgVEhJUyBTT0ZUV0FSRSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi1BTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKLVNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotJElkOiBjaGFwX21zLmgsdiAxLjEzIDIwMDQvMTEvMTUgMjI6MTM6MjYgcGF1bHVzIEV4cCAkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZGVtYW5kLmMgLSBTdXBwb3J0IHJvdXRpbmVzIGZvciBkZW1hbmQtZGlhbGxpbmcuCi0KLUNvcHlyaWdodCAoYykgMTk5Ni0yMDAyIFBhdWwgTWFja2VycmFzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi0zLiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gICBhY2tub3dsZWRnbWVudDoKLSAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFBhdWwgTWFja2VycmFzCi0gICAgPHBhdWx1c0BzYW1iYS5vcmc+Ii4KLQotVEhFIEFVVEhPUlMgT0YgVEhJUyBTT0ZUV0FSRSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi1BTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKLVNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1lYXAuYyAtIEV4dGVuc2libGUgQXV0aGVudGljYXRpb24gUHJvdG9jb2wgZm9yIFBQUCAoUkZDIDIyODQpCi0KLUNvcHlyaWdodCAoYykgMjAwMSBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1Ob24tZXhjbHVzaXZlIHJpZ2h0cyB0byByZWRpc3RyaWJ1dGUsIG1vZGlmeSwgdHJhbnNsYXRlLCBhbmQgdXNlCi10aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCBpbiB3aG9sZSBvciBpbiBwYXJ0LCBpcwotaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgaXMKLWR1cGxpY2F0ZWQgaW4gYW55IHNvdXJjZSBmb3JtLCBhbmQgdGhhdCBuZWl0aGVyIHRoZSBuYW1lIG9mIHRoZQotY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIGF1dGhvciBpcyB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUuCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi1JTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1PcmlnaW5hbCB2ZXJzaW9uIGJ5IEphbWVzIENhcmxzb24KLQotVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBFQVAgc3VwcG9ydHMgTUQ1LUNoYWxsZW5nZSBhbmQgU1JQLVNIQTEKLWF1dGhlbnRpY2F0aW9uIHN0eWxlcy4gIE5vdGUgdGhhdCBzdXBwb3J0IG9mIE1ENS1DaGFsbGVuZ2UgaXMgYQotcmVxdWlyZW1lbnQgb2YgUkZDIDIyODQsIGFuZCB0aGF0IGl0J3MgZXNzZW50aWFsbHkganVzdCBhCi1yZWltcGxlbWVudGF0aW9uIG9mIHJlZ3VsYXIgUkZDIDE5OTQgQ0hBUCB1c2luZyBFQVAgbWVzc2FnZXMuCi0KLUFzIGFuIGF1dGhlbnRpY2F0b3IgKCJzZXJ2ZXIiKSwgdGhlcmUgYXJlIG11bHRpcGxlIHBoYXNlcyBmb3IgZWFjaAotc3R5bGUuICBJbiB0aGUgZmlyc3QgcGhhc2Ugb2YgZWFjaCBzdHlsZSwgdGhlIHVuYXV0aGVudGljYXRlZCBwZWVyCi1uYW1lIGlzIHF1ZXJpZWQgdXNpbmcgdGhlIEVBUCBJZGVudGl0eSByZXF1ZXN0IHR5cGUuICBJZiB0aGUKLSJyZW1vdGVuYW1lIiBvcHRpb24gaXMgdXNlZCwgdGhlbiB0aGlzIHBoYXNlIGlzIHNraXBwZWQsIGJlY2F1c2UKLXRoZSBwZWVyJ3MgbmFtZSBpcyBwcmVzdW1lZCB0byBiZSBrbm93bi4KLQotRm9yIE1ENS1DaGFsbGVuZ2UsIHRoZXJlIGFyZSB0d28gcGhhc2VzLCBhbmQgdGhlIHNlY29uZCBwaGFzZQotY29uc2lzdHMgb2Ygc2VuZGluZyB0aGUgY2hhbGxlbmdlIGl0c2VsZiBhbmQgaGFuZGxpbmcgdGhlCi1hc3NvY2lhdGVkIHJlc3BvbnNlLgotCi1Gb3IgU1JQLVNIQTEsIHRoZXJlIGFyZSBmb3VyIHBoYXNlcy4gIFRoZSBzZWNvbmQgc2VuZHMgJ3MnLCAnTicsCi1hbmQgJ2cnLiAgVGhlIHJlcGx5IGNvbnRhaW5zICdBJy4gIFRoZSB0aGlyZCBzZW5kcyAnQicsIGFuZCB0aGUKLXJlcGx5IGNvbnRhaW5zICdNMScuICBUaGUgZm9ydGggc2VuZHMgdGhlICdNMicgdmFsdWUuCi0KLUFzIGFuIGF1dGhlbnRpY2F0ZWUgKCJjbGllbnQiKSwgdGhlcmUncyBqdXN0IGEgc2luZ2xlIHBoYXNlIC0tCi1yZXNwb25kaW5nIHRvIHRoZSBxdWVyaWVzIGdlbmVyYXRlZCBieSB0aGUgcGVlci4gIEVBUCBpcyBhbgotYXV0aGVudGljYXRvci1kcml2ZW4gcHJvdG9jb2wuCi0KLUJhc2VkIG9uIGRyYWZ0LWlldGYtcHBwZXh0LWVhcC1zcnAtMDMudHh0LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWVhcC5oIC0gRXh0ZW5zaWJsZSBBdXRoZW50aWNhdGlvbiBQcm90b2NvbCBmb3IgUFBQIChSRkMgMjI4NCkKLQotQ29weXJpZ2h0IChjKSAyMDAxIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLU5vbi1leGNsdXNpdmUgcmlnaHRzIHRvIHJlZGlzdHJpYnV0ZSwgbW9kaWZ5LCB0cmFuc2xhdGUsIGFuZCB1c2UKLXRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIGluIHdob2xlIG9yIGluIHBhcnQsIGlzCi1oZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcwotZHVwbGljYXRlZCBpbiBhbnkgc291cmNlIGZvcm0sIGFuZCB0aGF0IG5laXRoZXIgdGhlIG5hbWUgb2YgdGhlCi1jb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgYXV0aG9yIGlzIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi1wcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZS4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLUlNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi1XQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLU9yaWdpbmFsIHZlcnNpb24gYnkgSmFtZXMgQ2FybHNvbgotCi0kSWQ6IGVhcC5oLHYgMS4yIDIwMDMvMDYvMTEgMjM6NTY6MjYgcGF1bHVzIEV4cCAkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZWNwLmMgLSBQUFAgRW5jcnlwdGlvbiBDb250cm9sIFByb3RvY29sLgotCi1Db3B5cmlnaHQgKGMpIDIwMDIgR29vZ2xlLCBJbmMuCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgZGlzdHJpYnV0aW9uLgotCi0zLiBUaGUgbmFtZShzKSBvZiB0aGUgYXV0aG9ycyBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLVRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi1TUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLVdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KLURlcml2ZWQgZnJvbSBjY3AuYywgd2hpY2ggaXM6Ci0KLUNvcHlyaWdodCAoYykgMTk5NC0yMDAyIFBhdWwgTWFja2VycmFzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi0zLiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gICBhY2tub3dsZWRnbWVudDoKLSAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFBhdWwgTWFja2VycmFzCi0gICAgPHBhdWx1c0BzYW1iYS5vcmc+Ii4KLQotVEhFIEFVVEhPUlMgT0YgVEhJUyBTT0ZUV0FSRSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi1BTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKLVNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1lY3AuaCAtIERlZmluaXRpb25zIGZvciBQUFAgRW5jcnlwdGlvbiBDb250cm9sIFByb3RvY29sLgotCi1Db3B5cmlnaHQgKGMpIDIwMDIgR29vZ2xlLCBJbmMuCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgZGlzdHJpYnV0aW9uLgotCi0zLiBUaGUgbmFtZShzKSBvZiB0aGUgYXV0aG9ycyBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLVRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi1TUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLVdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KLSRJZDogZWNwLmgsdiAxLjIgMjAwMy8wMS8xMCAwNzoxMjozNiBmY3VzYWNrIEV4cCAkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZXVpNjQuYyAtIEVVSTY0IHJvdXRpbmVzIGZvciBJUHY2Q1AuCi0KLUNvcHlyaWdodCAoYykgMTk5OSBUb21taSBLb211bGFpbmVuLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLWFyZSBtZXQ6Ci0KLTEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLTIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAgIGRpc3RyaWJ1dGlvbi4KLQotMy4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi00LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gICBhY2tub3dsZWRnbWVudDoKLSAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFRvbW1pIEtvbXVsYWluZW4KLSAgICA8VG9tbWkuS29tdWxhaW5lbkBpa2kuZmk+Ii4KLQotVEhFIEFVVEhPUlMgT0YgVEhJUyBTT0ZUV0FSRSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi1BTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKLVNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotJElkOiBldWk2NC5jLHYgMS42IDIwMDIvMTIvMDQgMjM6MDM6MzIgcGF1bHVzIEV4cCAkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZXVpNjQuaCAtIEVVSTY0IHJvdXRpbmVzIGZvciBJUHY2Q1AuCi0KLUNvcHlyaWdodCAoYykgMTk5OSBUb21taSBLb211bGFpbmVuLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLWFyZSBtZXQ6Ci0KLTEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLTIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAgIGRpc3RyaWJ1dGlvbi4KLQotMy4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi00LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gICBhY2tub3dsZWRnbWVudDoKLSAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFRvbW1pIEtvbXVsYWluZW4KLSAgICA8VG9tbWkuS29tdWxhaW5lbkBpa2kuZmk+Ii4KLQotVEhFIEFVVEhPUlMgT0YgVEhJUyBTT0ZUV0FSRSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi1BTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKLVNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotJElkOiBldWk2NC5oLHYgMS42IDIwMDIvMTIvMDQgMjM6MDM6MzIgcGF1bHVzIEV4cCAkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZnNtLmMgLSB7TGluaywgSVB9IENvbnRyb2wgUHJvdG9jb2wgRmluaXRlIFN0YXRlIE1hY2hpbmUuCi0KLUNvcHlyaWdodCAoYykgMTk4NC0yMDAwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgZGlzdHJpYnV0aW9uLgotCi0zLiBUaGUgbmFtZSAiQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciBwZXJtaXNzaW9uIG9yIGFueSBsZWdhbAotICAgZGV0YWlscywgcGxlYXNlIGNvbnRhY3QKLSAgICAgT2ZmaWNlIG9mIFRlY2hub2xvZ3kgVHJhbnNmZXIKLSAgICAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAgICAgNTAwMCBGb3JiZXMgQXZlbnVlCi0gICAgIFBpdHRzYnVyZ2gsIFBBICAxNTIxMy0zODkwCi0gICAgICg0MTIpIDI2OC00Mzg3LCBmYXg6ICg0MTIpIDI2OC03Mzk1Ci0gICAgIHRlY2gtdHJhbnNmZXJAYW5kcmV3LmNtdS5lZHUKLQotNC4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICAgYWNrbm93bGVkZ21lbnQ6Ci0gICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBDb21wdXRpbmcgU2VydmljZXMKLSAgICBhdCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSAoaHR0cDovL3d3dy5jbXUuZWR1L2NvbXB1dGluZy8pLiIKLQotQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi1USElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLUFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBCRSBMSUFCTEUKLUZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi1XSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWZzbS5oIC0ge0xpbmssIElQfSBDb250cm9sIFByb3RvY29sIEZpbml0ZSBTdGF0ZSBNYWNoaW5lIGRlZmluaXRpb25zLgotCi1Db3B5cmlnaHQgKGMpIDE5ODQtMjAwMCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLWFyZSBtZXQ6Ci0KLTEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLTIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAgIGRpc3RyaWJ1dGlvbi4KLQotMy4gVGhlIG5hbWUgIkNhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3IgcGVybWlzc2lvbiBvciBhbnkgbGVnYWwKLSAgIGRldGFpbHMsIHBsZWFzZSBjb250YWN0Ci0gICAgIE9mZmljZSBvZiBUZWNobm9sb2d5IFRyYW5zZmVyCi0gICAgIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5Ci0gICAgIDUwMDAgRm9yYmVzIEF2ZW51ZQotICAgICBQaXR0c2J1cmdoLCBQQSAgMTUyMTMtMzg5MAotICAgICAoNDEyKSAyNjgtNDM4NywgZmF4OiAoNDEyKSAyNjgtNzM5NQotICAgICB0ZWNoLXRyYW5zZmVyQGFuZHJldy5jbXUuZWR1Ci0KLTQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAgIGFja25vd2xlZGdtZW50OgotICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQ29tcHV0aW5nIFNlcnZpY2VzCi0gICAgYXQgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkgKGh0dHA6Ly93d3cuY211LmVkdS9jb21wdXRpbmcvKS4iCi0KLUNBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi1BTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgQkUgTElBQkxFCi1GT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotJElkOiBmc20uaCx2IDEuMTAgMjAwNC8xMS8xMyAwMjoyODoxNSBwYXVsdXMgRXhwICQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pZl9wcHAuaCAtIFBvaW50LXRvLVBvaW50IFByb3RvY29sIGRlZmluaXRpb25zLgotCi1Db3B5cmlnaHQgKGMpIDE5ODQtMjAwMCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLWFyZSBtZXQ6Ci0KLTEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLTIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAgIGRpc3RyaWJ1dGlvbi4KLQotMy4gVGhlIG5hbWUgIkNhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3IgcGVybWlzc2lvbiBvciBhbnkgbGVnYWwKLSAgIGRldGFpbHMsIHBsZWFzZSBjb250YWN0Ci0gICAgIE9mZmljZSBvZiBUZWNobm9sb2d5IFRyYW5zZmVyCi0gICAgIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5Ci0gICAgIDUwMDAgRm9yYmVzIEF2ZW51ZQotICAgICBQaXR0c2J1cmdoLCBQQSAgMTUyMTMtMzg5MAotICAgICAoNDEyKSAyNjgtNDM4NywgZmF4OiAoNDEyKSAyNjgtNzM5NQotICAgICB0ZWNoLXRyYW5zZmVyQGFuZHJldy5jbXUuZWR1Ci0KLTQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAgIGFja25vd2xlZGdtZW50OgotICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQ29tcHV0aW5nIFNlcnZpY2VzCi0gICAgYXQgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkgKGh0dHA6Ly93d3cuY211LmVkdS9jb21wdXRpbmcvKS4iCi0KLUNBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi1BTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgQkUgTElBQkxFCi1GT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pcGNwLmMgLSBQUFAgSVAgQ29udHJvbCBQcm90b2NvbC4KLQotQ29weXJpZ2h0IChjKSAxOTg0LTIwMDAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi1hcmUgbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0yLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gICBkaXN0cmlidXRpb24uCi0KLTMuIFRoZSBuYW1lICJDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSIgbXVzdCBub3QgYmUgdXNlZCB0bwotICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHBlcm1pc3Npb24gb3IgYW55IGxlZ2FsCi0gICBkZXRhaWxzLCBwbGVhc2UgY29udGFjdAotICAgICBPZmZpY2Ugb2YgVGVjaG5vbG9neSBUcmFuc2ZlcgotICAgICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQotICAgICA1MDAwIEZvcmJlcyBBdmVudWUKLSAgICAgUGl0dHNidXJnaCwgUEEgIDE1MjEzLTM4OTAKLSAgICAgKDQxMikgMjY4LTQzODcsIGZheDogKDQxMikgMjY4LTczOTUKLSAgICAgdGVjaC10cmFuc2ZlckBhbmRyZXcuY211LmVkdQotCi00LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gICBhY2tub3dsZWRnbWVudDoKLSAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IENvbXB1dGluZyBTZXJ2aWNlcwotICAgIGF0IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IChodHRwOi8vd3d3LmNtdS5lZHUvY29tcHV0aW5nLykuIgotCi1DQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLVRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIENBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIEJFIExJQUJMRQotRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLVdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaXBjcC5oIC0gSVAgQ29udHJvbCBQcm90b2NvbCBkZWZpbml0aW9ucy4KLQotQ29weXJpZ2h0IChjKSAxOTg0LTIwMDAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi1hcmUgbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0yLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gICBkaXN0cmlidXRpb24uCi0KLTMuIFRoZSBuYW1lICJDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSIgbXVzdCBub3QgYmUgdXNlZCB0bwotICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHBlcm1pc3Npb24gb3IgYW55IGxlZ2FsCi0gICBkZXRhaWxzLCBwbGVhc2UgY29udGFjdAotICAgICBPZmZpY2Ugb2YgVGVjaG5vbG9neSBUcmFuc2ZlcgotICAgICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQotICAgICA1MDAwIEZvcmJlcyBBdmVudWUKLSAgICAgUGl0dHNidXJnaCwgUEEgIDE1MjEzLTM4OTAKLSAgICAgKDQxMikgMjY4LTQzODcsIGZheDogKDQxMikgMjY4LTczOTUKLSAgICAgdGVjaC10cmFuc2ZlckBhbmRyZXcuY211LmVkdQotCi00LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gICBhY2tub3dsZWRnbWVudDoKLSAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IENvbXB1dGluZyBTZXJ2aWNlcwotICAgIGF0IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IChodHRwOi8vd3d3LmNtdS5lZHUvY29tcHV0aW5nLykuIgotCi1DQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLVRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIENBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIEJFIExJQUJMRQotRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLVdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KLSRJZDogaXBjcC5oLHYgMS4xNCAyMDAyLzEyLzA0IDIzOjAzOjMyIHBhdWx1cyBFeHAgJAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWlwdjZjcC5jIC0gUFBQIElQVjYgQ29udHJvbCBQcm90b2NvbC4KLQotQ29weXJpZ2h0IChjKSAxOTk5IFRvbW1pIEtvbXVsYWluZW4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgZGlzdHJpYnV0aW9uLgotCi0zLiBUaGUgbmFtZShzKSBvZiB0aGUgYXV0aG9ycyBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLTQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAgIGFja25vd2xlZGdtZW50OgotICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgVG9tbWkgS29tdWxhaW5lbgotICAgIDxUb21taS5Lb211bGFpbmVuQGlraS5maT4iLgotCi1USEUgQVVUSE9SUyBPRiBUSElTIFNPRlRXQVJFIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi1USElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLUFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi1XSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWlwdjZjcC5oIC0gUFBQIElQVjYgQ29udHJvbCBQcm90b2NvbC4KLQotQ29weXJpZ2h0IChjKSAxOTk5IFRvbW1pIEtvbXVsYWluZW4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgZGlzdHJpYnV0aW9uLgotCi0zLiBUaGUgbmFtZShzKSBvZiB0aGUgYXV0aG9ycyBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLTQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAgIGFja25vd2xlZGdtZW50OgotICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgVG9tbWkgS29tdWxhaW5lbgotICAgIDxUb21taS5Lb211bGFpbmVuQGlraS5maT4iLgotCi1USEUgQVVUSE9SUyBPRiBUSElTIFNPRlRXQVJFIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi1USElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLUFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi1XSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWlweGNwLmMgLSBQUFAgSVBYIENvbnRyb2wgUHJvdG9jb2wuCi0KLUNvcHlyaWdodCAoYykgMTk4NC0yMDAwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgZGlzdHJpYnV0aW9uLgotCi0zLiBUaGUgbmFtZSAiQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciBwZXJtaXNzaW9uIG9yIGFueSBsZWdhbAotICAgZGV0YWlscywgcGxlYXNlIGNvbnRhY3QKLSAgICAgT2ZmaWNlIG9mIFRlY2hub2xvZ3kgVHJhbnNmZXIKLSAgICAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAgICAgNTAwMCBGb3JiZXMgQXZlbnVlCi0gICAgIFBpdHRzYnVyZ2gsIFBBICAxNTIxMy0zODkwCi0gICAgICg0MTIpIDI2OC00Mzg3LCBmYXg6ICg0MTIpIDI2OC03Mzk1Ci0gICAgIHRlY2gtdHJhbnNmZXJAYW5kcmV3LmNtdS5lZHUKLQotNC4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICAgYWNrbm93bGVkZ21lbnQ6Ci0gICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBDb21wdXRpbmcgU2VydmljZXMKLSAgICBhdCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSAoaHR0cDovL3d3dy5jbXUuZWR1L2NvbXB1dGluZy8pLiIKLQotQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi1USElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLUFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBCRSBMSUFCTEUKLUZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi1XSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWlweGNwLmggLSBJUFggQ29udHJvbCBQcm90b2NvbCBkZWZpbml0aW9ucy4KLQotQ29weXJpZ2h0IChjKSAxOTg0LTIwMDAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi1hcmUgbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0yLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gICBkaXN0cmlidXRpb24uCi0KLTMuIFRoZSBuYW1lICJDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSIgbXVzdCBub3QgYmUgdXNlZCB0bwotICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHBlcm1pc3Npb24gb3IgYW55IGxlZ2FsCi0gICBkZXRhaWxzLCBwbGVhc2UgY29udGFjdAotICAgICBPZmZpY2Ugb2YgVGVjaG5vbG9neSBUcmFuc2ZlcgotICAgICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQotICAgICA1MDAwIEZvcmJlcyBBdmVudWUKLSAgICAgUGl0dHNidXJnaCwgUEEgIDE1MjEzLTM4OTAKLSAgICAgKDQxMikgMjY4LTQzODcsIGZheDogKDQxMikgMjY4LTczOTUKLSAgICAgdGVjaC10cmFuc2ZlckBhbmRyZXcuY211LmVkdQotCi00LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gICBhY2tub3dsZWRnbWVudDoKLSAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IENvbXB1dGluZyBTZXJ2aWNlcwotICAgIGF0IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IChodHRwOi8vd3d3LmNtdS5lZHUvY29tcHV0aW5nLykuIgotCi1DQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLVRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIENBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIEJFIExJQUJMRQotRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLVdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KLSRJZDogaXB4Y3AuaCx2IDEuNSAyMDAyLzEyLzA0IDIzOjAzOjMyIHBhdWx1cyBFeHAgJAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWxjcC5jIC0gUFBQIExpbmsgQ29udHJvbCBQcm90b2NvbC4KLQotQ29weXJpZ2h0IChjKSAxOTg0LTIwMDAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi1hcmUgbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0yLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gICBkaXN0cmlidXRpb24uCi0KLTMuIFRoZSBuYW1lICJDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSIgbXVzdCBub3QgYmUgdXNlZCB0bwotICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHBlcm1pc3Npb24gb3IgYW55IGxlZ2FsCi0gICBkZXRhaWxzLCBwbGVhc2UgY29udGFjdAotICAgICBPZmZpY2Ugb2YgVGVjaG5vbG9neSBUcmFuc2ZlcgotICAgICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQotICAgICA1MDAwIEZvcmJlcyBBdmVudWUKLSAgICAgUGl0dHNidXJnaCwgUEEgIDE1MjEzLTM4OTAKLSAgICAgKDQxMikgMjY4LTQzODcsIGZheDogKDQxMikgMjY4LTczOTUKLSAgICAgdGVjaC10cmFuc2ZlckBhbmRyZXcuY211LmVkdQotCi00LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gICBhY2tub3dsZWRnbWVudDoKLSAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IENvbXB1dGluZyBTZXJ2aWNlcwotICAgIGF0IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IChodHRwOi8vd3d3LmNtdS5lZHUvY29tcHV0aW5nLykuIgotCi1DQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLVRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIENBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIEJFIExJQUJMRQotRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLVdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbGNwLmggLSBMaW5rIENvbnRyb2wgUHJvdG9jb2wgZGVmaW5pdGlvbnMuCi0KLUNvcHlyaWdodCAoYykgMTk4NC0yMDAwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgZGlzdHJpYnV0aW9uLgotCi0zLiBUaGUgbmFtZSAiQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciBwZXJtaXNzaW9uIG9yIGFueSBsZWdhbAotICAgZGV0YWlscywgcGxlYXNlIGNvbnRhY3QKLSAgICAgT2ZmaWNlIG9mIFRlY2hub2xvZ3kgVHJhbnNmZXIKLSAgICAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAgICAgNTAwMCBGb3JiZXMgQXZlbnVlCi0gICAgIFBpdHRzYnVyZ2gsIFBBICAxNTIxMy0zODkwCi0gICAgICg0MTIpIDI2OC00Mzg3LCBmYXg6ICg0MTIpIDI2OC03Mzk1Ci0gICAgIHRlY2gtdHJhbnNmZXJAYW5kcmV3LmNtdS5lZHUKLQotNC4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICAgYWNrbm93bGVkZ21lbnQ6Ci0gICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBDb21wdXRpbmcgU2VydmljZXMKLSAgICBhdCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSAoaHR0cDovL3d3dy5jbXUuZWR1L2NvbXB1dGluZy8pLiIKLQotQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi1USElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLUFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBCRSBMSUFCTEUKLUZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi1XSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0kSWQ6IGxjcC5oLHYgMS4yMCAyMDA0LzExLzE0IDIyOjUzOjQyIGNhcmxzb25qIEV4cCAkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbWFnaWMuYyAtIFBQUCBNYWdpYyBOdW1iZXIgcm91dGluZXMuCi0KLUNvcHlyaWdodCAoYykgMTk4NC0yMDAwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgZGlzdHJpYnV0aW9uLgotCi0zLiBUaGUgbmFtZSAiQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciBwZXJtaXNzaW9uIG9yIGFueSBsZWdhbAotICAgZGV0YWlscywgcGxlYXNlIGNvbnRhY3QKLSAgICAgT2ZmaWNlIG9mIFRlY2hub2xvZ3kgVHJhbnNmZXIKLSAgICAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAgICAgNTAwMCBGb3JiZXMgQXZlbnVlCi0gICAgIFBpdHRzYnVyZ2gsIFBBICAxNTIxMy0zODkwCi0gICAgICg0MTIpIDI2OC00Mzg3LCBmYXg6ICg0MTIpIDI2OC03Mzk1Ci0gICAgIHRlY2gtdHJhbnNmZXJAYW5kcmV3LmNtdS5lZHUKLQotNC4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICAgYWNrbm93bGVkZ21lbnQ6Ci0gICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBDb21wdXRpbmcgU2VydmljZXMKLSAgICBhdCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSAoaHR0cDovL3d3dy5jbXUuZWR1L2NvbXB1dGluZy8pLiIKLQotQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi1USElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLUFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBCRSBMSUFCTEUKLUZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi1XSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW1hZ2ljLmggLSBQUFAgTWFnaWMgTnVtYmVyIGRlZmluaXRpb25zLgotCi1Db3B5cmlnaHQgKGMpIDE5ODQtMjAwMCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLWFyZSBtZXQ6Ci0KLTEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLTIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAgIGRpc3RyaWJ1dGlvbi4KLQotMy4gVGhlIG5hbWUgIkNhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3IgcGVybWlzc2lvbiBvciBhbnkgbGVnYWwKLSAgIGRldGFpbHMsIHBsZWFzZSBjb250YWN0Ci0gICAgIE9mZmljZSBvZiBUZWNobm9sb2d5IFRyYW5zZmVyCi0gICAgIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5Ci0gICAgIDUwMDAgRm9yYmVzIEF2ZW51ZQotICAgICBQaXR0c2J1cmdoLCBQQSAgMTUyMTMtMzg5MAotICAgICAoNDEyKSAyNjgtNDM4NywgZmF4OiAoNDEyKSAyNjgtNzM5NQotICAgICB0ZWNoLXRyYW5zZmVyQGFuZHJldy5jbXUuZWR1Ci0KLTQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAgIGFja25vd2xlZGdtZW50OgotICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQ29tcHV0aW5nIFNlcnZpY2VzCi0gICAgYXQgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkgKGh0dHA6Ly93d3cuY211LmVkdS9jb21wdXRpbmcvKS4iCi0KLUNBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi1BTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgQkUgTElBQkxFCi1GT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotJElkOiBtYWdpYy5oLHYgMS41IDIwMDMvMDYvMTEgMjM6NTY6MjYgcGF1bHVzIEV4cCAkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbWFpbi5jIC0gUG9pbnQtdG8tUG9pbnQgUHJvdG9jb2wgbWFpbiBtb2R1bGUKLQotQ29weXJpZ2h0IChjKSAxOTg0LTIwMDAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi1hcmUgbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0yLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gICBkaXN0cmlidXRpb24uCi0KLTMuIFRoZSBuYW1lICJDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSIgbXVzdCBub3QgYmUgdXNlZCB0bwotICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHBlcm1pc3Npb24gb3IgYW55IGxlZ2FsCi0gICBkZXRhaWxzLCBwbGVhc2UgY29udGFjdAotICAgICBPZmZpY2Ugb2YgVGVjaG5vbG9neSBUcmFuc2ZlcgotICAgICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQotICAgICA1MDAwIEZvcmJlcyBBdmVudWUKLSAgICAgUGl0dHNidXJnaCwgUEEgIDE1MjEzLTM4OTAKLSAgICAgKDQxMikgMjY4LTQzODcsIGZheDogKDQxMikgMjY4LTczOTUKLSAgICAgdGVjaC10cmFuc2ZlckBhbmRyZXcuY211LmVkdQotCi00LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gICBhY2tub3dsZWRnbWVudDoKLSAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IENvbXB1dGluZyBTZXJ2aWNlcwotICAgIGF0IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IChodHRwOi8vd3d3LmNtdS5lZHUvY29tcHV0aW5nLykuIgotCi1DQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLVRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIENBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIEJFIExJQUJMRQotRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLVdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KLUNvcHlyaWdodCAoYykgMTk5OS0yMDA0IFBhdWwgTWFja2VycmFzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi0zLiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gICBhY2tub3dsZWRnbWVudDoKLSAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFBhdWwgTWFja2VycmFzCi0gICAgPHBhdWx1c0BzYW1iYS5vcmc+Ii4KLQotVEhFIEFVVEhPUlMgT0YgVEhJUyBTT0ZUV0FSRSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi1BTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKLVNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1taW5jb25uLmMgLSBwcHBkIHBsdWdpbiB0byBpbXBsZW1lbnQgYSBgbWluY29ubmVjdCcgb3B0aW9uLgotCi1Db3B5cmlnaHQgKGMpIDE5OTkgUGF1bCBNYWNrZXJyYXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi1hcmUgbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0yLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gICBkaXN0cmlidXRpb24uCi0KLTMuIFRoZSBuYW1lKHMpIG9mIHRoZSBhdXRob3JzIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgdXNlZCB0bwotICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotNC4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICAgYWNrbm93bGVkZ21lbnQ6Ci0gICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBQYXVsIE1hY2tlcnJhcwotICAgIDxwYXVsdXNAc2FtYmEub3JnPiIuCi0KLVRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLVRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi1TUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLVdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbXBwZS5oIC0gRGVmaW5pdGlvbnMgZm9yIE1QUEUKLQotQ29weXJpZ2h0IChjKSAyMDA4IFBhdWwgTWFja2VycmFzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgZGlzdHJpYnV0aW9uLgotCi0zLiBUaGUgbmFtZShzKSBvZiB0aGUgYXV0aG9ycyBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLTQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAgIGFja25vd2xlZGdtZW50OgotICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgUGF1bCBNYWNrZXJyYXMKLSAgICA8cGF1bHVzQHNhbWJhLm9yZz4iLgotCi1USEUgQVVUSE9SUyBPRiBUSElTIFNPRlRXQVJFIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi1USElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLUFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi1XSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW9wdGlvbnMuYyAtIGhhbmRsZXMgb3B0aW9uIHByb2Nlc3NpbmcgZm9yIFBQUC4KLQotQ29weXJpZ2h0IChjKSAxOTg0LTIwMDAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi1hcmUgbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0yLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gICBkaXN0cmlidXRpb24uCi0KLTMuIFRoZSBuYW1lICJDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSIgbXVzdCBub3QgYmUgdXNlZCB0bwotICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHBlcm1pc3Npb24gb3IgYW55IGxlZ2FsCi0gICBkZXRhaWxzLCBwbGVhc2UgY29udGFjdAotICAgICBPZmZpY2Ugb2YgVGVjaG5vbG9neSBUcmFuc2ZlcgotICAgICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQotICAgICA1MDAwIEZvcmJlcyBBdmVudWUKLSAgICAgUGl0dHNidXJnaCwgUEEgIDE1MjEzLTM4OTAKLSAgICAgKDQxMikgMjY4LTQzODcsIGZheDogKDQxMikgMjY4LTczOTUKLSAgICAgdGVjaC10cmFuc2ZlckBhbmRyZXcuY211LmVkdQotCi00LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gICBhY2tub3dsZWRnbWVudDoKLSAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IENvbXB1dGluZyBTZXJ2aWNlcwotICAgIGF0IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IChodHRwOi8vd3d3LmNtdS5lZHUvY29tcHV0aW5nLykuIgotCi1DQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLVRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIENBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIEJFIExJQUJMRQotRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLVdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFzc3Byb21wdC5jIC0gcHBwZCBwbHVnaW4gdG8gaW52b2tlIGFuIGV4dGVybmFsIFBBUCBwYXNzd29yZCBwcm9tcHRlcgotCi1Db3B5cmlnaHQgMTk5OSBQYXVsIE1hY2tlcnJhcywgQWxhbiBDdXJyeS4KLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcHBwLWNvbXAuaCAtIERlZmluaXRpb25zIGZvciBkb2luZyBQUFAgcGFja2V0IGNvbXByZXNzaW9uLgotCi1Db3B5cmlnaHQgKGMpIDE5ODQgUGF1bCBNYWNrZXJyYXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi1hcmUgbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0yLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gICBkaXN0cmlidXRpb24uCi0KLTMuIFRoZSBuYW1lKHMpIG9mIHRoZSBhdXRob3JzIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgdXNlZCB0bwotICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotNC4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICAgYWNrbm93bGVkZ21lbnQ6Ci0gICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBQYXVsIE1hY2tlcnJhcwotICAgIDxwYXVsdXNAc2FtYmEub3JnPiIuCi0KLVRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLVRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi1TUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLVdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KLSRJZDogcHBwLWNvbXAuaCx2IDEuMTMgMjAwMi8xMi8wNiAwOTo0OToxNSBwYXVsdXMgRXhwICQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wcHBfZGVmcy5oIC0gUFBQIGRlZmluaXRpb25zLgotCi1Db3B5cmlnaHQgKGMpIDE5ODQgUGF1bCBNYWNrZXJyYXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi1hcmUgbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0yLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gICBkaXN0cmlidXRpb24uCi0KLTMuIFRoZSBuYW1lKHMpIG9mIHRoZSBhdXRob3JzIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgdXNlZCB0bwotICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotNC4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICAgYWNrbm93bGVkZ21lbnQ6Ci0gICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBQYXVsIE1hY2tlcnJhcwotICAgIDxwYXVsdXNAc2FtYmEub3JnPiIuCi0KLVRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLVRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi1TUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLVdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcHBwY3J5cHQuYyAtIFBQUC9ERVMgbGlua2FnZSBmb3IgTVMtQ0hBUCBhbmQgRUFQIFNSUC1TSEExCi0KLUV4dHJhY3RlZCBmcm9tIGNoYXBfbXMuYyBieSBKYW1lcyBDYXJsc29uLgotCi1Db3B5cmlnaHQgKGMpIDE5OTUgRXJpYyBSb3NlbnF1aXN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLWFyZSBtZXQ6Ci0KLTEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLTIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAgIGRpc3RyaWJ1dGlvbi4KLQotMy4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USEUgQVVUSE9SUyBPRiBUSElTIFNPRlRXQVJFIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi1USElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLUFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi1XSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBwcGQuaCAtIFBQUCBkYWVtb24gZ2xvYmFsIGRlY2xhcmF0aW9ucy4KLQotQ29weXJpZ2h0IChjKSAxOTg0LTIwMDAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi1hcmUgbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0yLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gICBkaXN0cmlidXRpb24uCi0KLTMuIFRoZSBuYW1lICJDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSIgbXVzdCBub3QgYmUgdXNlZCB0bwotICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHBlcm1pc3Npb24gb3IgYW55IGxlZ2FsCi0gICBkZXRhaWxzLCBwbGVhc2UgY29udGFjdAotICAgICBPZmZpY2Ugb2YgVGVjaG5vbG9neSBUcmFuc2ZlcgotICAgICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQotICAgICA1MDAwIEZvcmJlcyBBdmVudWUKLSAgICAgUGl0dHNidXJnaCwgUEEgIDE1MjEzLTM4OTAKLSAgICAgKDQxMikgMjY4LTQzODcsIGZheDogKDQxMikgMjY4LTczOTUKLSAgICAgdGVjaC10cmFuc2ZlckBhbmRyZXcuY211LmVkdQotCi00LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gICBhY2tub3dsZWRnbWVudDoKLSAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IENvbXB1dGluZyBTZXJ2aWNlcwotICAgIGF0IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IChodHRwOi8vd3d3LmNtdS5lZHUvY29tcHV0aW5nLykuIgotCi1DQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLVRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIENBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIEJFIExJQUJMRQotRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLVdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KLSRJZDogcHBwZC5oLHYgMS45NiAyMDA4LzA2LzIzIDExOjQ3OjE4IHBhdWx1cyBFeHAgJAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBwcGlvLmggLSBpb2N0bCBhbmQgb3RoZXIgbWlzYy4gZGVmaW5pdGlvbnMgZm9yIFNUUkVBTVMgbW9kdWxlcy4KLQotQ29weXJpZ2h0IChjKSAxOTk0IFBhdWwgTWFja2VycmFzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgZGlzdHJpYnV0aW9uLgotCi0zLiBUaGUgbmFtZShzKSBvZiB0aGUgYXV0aG9ycyBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLTQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAgIGFja25vd2xlZGdtZW50OgotICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgUGF1bCBNYWNrZXJyYXMKLSAgICA8cGF1bHVzQHNhbWJhLm9yZz4iLgotCi1USEUgQVVUSE9SUyBPRiBUSElTIFNPRlRXQVJFIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi1USElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLUFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi1XSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0kSWQ6IHBwcGlvLmgsdiAxLjkgMjAwMi8xMi8wNiAwOTo0OToxNSBwYXVsdXMgRXhwICQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zZXNzaW9uLmMgLSBQUFAgc2Vzc2lvbiBjb250cm9sLgotCi1Db3B5cmlnaHQgKGMpIDIwMDcgRGllZ28gUml2ZXJhLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi0zLiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gICBhY2tub3dsZWRnbWVudDoKLSAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFBhdWwgTWFja2VycmFzCi0gICAgPHBhdWx1c0BzYW1iYS5vcmc+Ii4KLQotVEhFIEFVVEhPUlMgT0YgVEhJUyBTT0ZUV0FSRSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi1BTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKLVNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zZXNzaW9uLmMgLSBQUFAgc2Vzc2lvbiBjb250cm9sLgotCi1Db3B5cmlnaHQgKGMpIDIwMDcgRGllZ28gUml2ZXJhLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi0zLiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gICBhY2tub3dsZWRnbWVudDoKLSAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFBhdWwgTWFja2VycmFzCi0gICAgPHBhdWx1c0BzYW1iYS5vcmc+Ii4KLQotVEhFIEFVVEhPUlMgT0YgVEhJUyBTT0ZUV0FSRSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi1BTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKLVNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotRGVyaXZlZCBmcm9tIGF1dGguYywgd2hpY2ggaXM6Ci0KLUNvcHlyaWdodCAoYykgMTk4NC0yMDAwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgZGlzdHJpYnV0aW9uLgotCi0zLiBUaGUgbmFtZSAiQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciBwZXJtaXNzaW9uIG9yIGFueSBsZWdhbAotICAgZGV0YWlscywgcGxlYXNlIGNvbnRhY3QKLSAgICAgT2ZmaWNlIG9mIFRlY2hub2xvZ3kgVHJhbnNmZXIKLSAgICAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAgICAgNTAwMCBGb3JiZXMgQXZlbnVlCi0gICAgIFBpdHRzYnVyZ2gsIFBBICAxNTIxMy0zODkwCi0gICAgICg0MTIpIDI2OC00Mzg3LCBmYXg6ICg0MTIpIDI2OC03Mzk1Ci0gICAgIHRlY2gtdHJhbnNmZXJAYW5kcmV3LmNtdS5lZHUKLQotNC4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICAgYWNrbm93bGVkZ21lbnQ6Ci0gICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBDb21wdXRpbmcgU2VydmljZXMKLSAgICBhdCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSAoaHR0cDovL3d3dy5jbXUuZWR1L2NvbXB1dGluZy8pLiIKLQotQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi1USElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLUFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBCRSBMSUFCTEUKLUZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi1XSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN5cy1saW51eC5jIC0gU3lzdGVtLWRlcGVuZGVudCBwcm9jZWR1cmVzIGZvciBzZXR0aW5nIHVwCi1QUFAgaW50ZXJmYWNlcyBvbiBMaW51eCBzeXN0ZW1zCi0KLUNvcHlyaWdodCAoYykgMTk5NC0yMDA0IFBhdWwgTWFja2VycmFzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi0zLiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gICBhY2tub3dsZWRnbWVudDoKLSAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFBhdWwgTWFja2VycmFzCi0gICAgPHBhdWx1c0BzYW1iYS5vcmc+Ii4KLQotVEhFIEFVVEhPUlMgT0YgVEhJUyBTT0ZUV0FSRSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi1BTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKLVNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotRGVyaXZlZCBmcm9tIG1haW4uYyBhbmQgcHBwZC5oLCB3aGljaCBhcmU6Ci0KLUNvcHlyaWdodCAoYykgMTk4NC0yMDAwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgZGlzdHJpYnV0aW9uLgotCi0zLiBUaGUgbmFtZSAiQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciBwZXJtaXNzaW9uIG9yIGFueSBsZWdhbAotICAgZGV0YWlscywgcGxlYXNlIGNvbnRhY3QKLSAgICAgT2ZmaWNlIG9mIFRlY2hub2xvZ3kgVHJhbnNmZXIKLSAgICAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAgICAgNTAwMCBGb3JiZXMgQXZlbnVlCi0gICAgIFBpdHRzYnVyZ2gsIFBBICAxNTIxMy0zODkwCi0gICAgICg0MTIpIDI2OC00Mzg3LCBmYXg6ICg0MTIpIDI2OC03Mzk1Ci0gICAgIHRlY2gtdHJhbnNmZXJAYW5kcmV3LmNtdS5lZHUKLQotNC4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICAgYWNrbm93bGVkZ21lbnQ6Ci0gICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBDb21wdXRpbmcgU2VydmljZXMKLSAgICBhdCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSAoaHR0cDovL3d3dy5jbXUuZWR1L2NvbXB1dGluZy8pLiIKLQotQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi1USElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLUFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBCRSBMSUFCTEUKLUZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi1XSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXR0eS5jIC0gY29kZSBmb3IgaGFuZGxpbmcgc2VyaWFsIHBvcnRzIGluIHBwcGQuCi0KLUNvcHlyaWdodCAoQykgMjAwMC0yMDA0IFBhdWwgTWFja2VycmFzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi0zLiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gICBhY2tub3dsZWRnbWVudDoKLSAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFBhdWwgTWFja2VycmFzCi0gICAgPHBhdWx1c0BzYW1iYS5vcmc+Ii4KLQotVEhFIEFVVEhPUlMgT0YgVEhJUyBTT0ZUV0FSRSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi1BTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKLVNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotUG9ydGlvbnMgZGVyaXZlZCBmcm9tIG1haW4uYywgd2hpY2ggaXM6Ci0KLUNvcHlyaWdodCAoYykgMTk4NC0yMDAwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgZGlzdHJpYnV0aW9uLgotCi0zLiBUaGUgbmFtZSAiQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciBwZXJtaXNzaW9uIG9yIGFueSBsZWdhbAotICAgZGV0YWlscywgcGxlYXNlIGNvbnRhY3QKLSAgICAgT2ZmaWNlIG9mIFRlY2hub2xvZ3kgVHJhbnNmZXIKLSAgICAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAgICAgNTAwMCBGb3JiZXMgQXZlbnVlCi0gICAgIFBpdHRzYnVyZ2gsIFBBICAxNTIxMy0zODkwCi0gICAgICg0MTIpIDI2OC00Mzg3LCBmYXg6ICg0MTIpIDI2OC03Mzk1Ci0gICAgIHRlY2gtdHJhbnNmZXJAYW5kcmV3LmNtdS5lZHUKLQotNC4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICAgYWNrbm93bGVkZ21lbnQ6Ci0gICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBDb21wdXRpbmcgU2VydmljZXMKLSAgICBhdCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSAoaHR0cDovL3d3dy5jbXUuZWR1L2NvbXB1dGluZy8pLiIKLQotQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi1USElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLUFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBCRSBMSUFCTEUKLUZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi1XSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXVwYXAuYyAtIFVzZXIvUGFzc3dvcmQgQXV0aGVudGljYXRpb24gUHJvdG9jb2wuCi0KLUNvcHlyaWdodCAoYykgMTk4NC0yMDAwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgZGlzdHJpYnV0aW9uLgotCi0zLiBUaGUgbmFtZSAiQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciBwZXJtaXNzaW9uIG9yIGFueSBsZWdhbAotICAgZGV0YWlscywgcGxlYXNlIGNvbnRhY3QKLSAgICAgT2ZmaWNlIG9mIFRlY2hub2xvZ3kgVHJhbnNmZXIKLSAgICAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAgICAgNTAwMCBGb3JiZXMgQXZlbnVlCi0gICAgIFBpdHRzYnVyZ2gsIFBBICAxNTIxMy0zODkwCi0gICAgICg0MTIpIDI2OC00Mzg3LCBmYXg6ICg0MTIpIDI2OC03Mzk1Ci0gICAgIHRlY2gtdHJhbnNmZXJAYW5kcmV3LmNtdS5lZHUKLQotNC4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICAgYWNrbm93bGVkZ21lbnQ6Ci0gICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBDb21wdXRpbmcgU2VydmljZXMKLSAgICBhdCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSAoaHR0cDovL3d3dy5jbXUuZWR1L2NvbXB1dGluZy8pLiIKLQotQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi1USElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLUFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBCRSBMSUFCTEUKLUZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi1XSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXVwYXAuaCAtIFVzZXIvUGFzc3dvcmQgQXV0aGVudGljYXRpb24gUHJvdG9jb2wgZGVmaW5pdGlvbnMuCi0KLUNvcHlyaWdodCAoYykgMTk4NC0yMDAwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgZGlzdHJpYnV0aW9uLgotCi0zLiBUaGUgbmFtZSAiQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciBwZXJtaXNzaW9uIG9yIGFueSBsZWdhbAotICAgZGV0YWlscywgcGxlYXNlIGNvbnRhY3QKLSAgICAgT2ZmaWNlIG9mIFRlY2hub2xvZ3kgVHJhbnNmZXIKLSAgICAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAgICAgNTAwMCBGb3JiZXMgQXZlbnVlCi0gICAgIFBpdHRzYnVyZ2gsIFBBICAxNTIxMy0zODkwCi0gICAgICg0MTIpIDI2OC00Mzg3LCBmYXg6ICg0MTIpIDI2OC03Mzk1Ci0gICAgIHRlY2gtdHJhbnNmZXJAYW5kcmV3LmNtdS5lZHUKLQotNC4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICAgYWNrbm93bGVkZ21lbnQ6Ci0gICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBDb21wdXRpbmcgU2VydmljZXMKLSAgICBhdCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSAoaHR0cDovL3d3dy5jbXUuZWR1L2NvbXB1dGluZy8pLiIKLQotQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi1USElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLUFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBCRSBMSUFCTEUKLUZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi1XSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0kSWQ6IHVwYXAuaCx2IDEuOCAyMDAyLzEyLzA0IDIzOjAzOjMzIHBhdWx1cyBFeHAgJAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXV0aWxzLmMgLSB2YXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIHVzZWQgaW4gcHBwZC4KLQotQ29weXJpZ2h0IChjKSAxOTk5LTIwMDIgUGF1bCBNYWNrZXJyYXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi1hcmUgbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0yLiBUaGUgbmFtZShzKSBvZiB0aGUgYXV0aG9ycyBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLTMuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAgIGFja25vd2xlZGdtZW50OgotICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgUGF1bCBNYWNrZXJyYXMKLSAgICA8cGF1bHVzQHNhbWJhLm9yZz4iLgotCi1USEUgQVVUSE9SUyBPRiBUSElTIFNPRlRXQVJFIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi1USElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLUFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi1XSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KZGlmZiAtLWdpdCBhL01FVEFEQVRBIGIvTUVUQURBVEEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NTUzZTEuLjAwMDAwMDAKLS0tIGEvTUVUQURBVEEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1uYW1lOiAicHBwIgotZGVzY3JpcHRpb246ICJwcHAgKFBhdWwncyBQUFAgUGFja2FnZSkgaXMgYW4gb3BlbiBzb3VyY2UgcGFja2FnZSB3aGljaCBpbXBsZW1lbnRzIHRoZSBQb2ludC10by1Qb2ludCBQcm90b2NvbCAoUFBQKSBvbiBMaW51eCBhbmQgU29sYXJpcyBzeXN0ZW1zLiIKLXRoaXJkX3BhcnR5IHsKLSAgdXJsIHsKLSAgICB0eXBlOiBIT01FUEFHRQotICAgIHZhbHVlOiAiaHR0cHM6Ly9wcHAuc2FtYmEub3JnLyIKLSAgfQotICB1cmwgewotICAgIHR5cGU6IEFSQ0hJVkUKLSAgICB2YWx1ZTogImh0dHBzOi8vZnRwLnNhbWJhLm9yZy9wdWIvcHBwL3BwcC0yLjQuNy50YXIuZ3oiCi0gIH0KLSAgdmVyc2lvbjogInBwcC0yLjQuNyIKLSAgbGljZW5zZV90eXBlOiBSRVNUUklDVEVECi0gIGxhc3RfdXBncmFkZV9kYXRlIHsKLSAgICB5ZWFyOiAyMDE0Ci0gICAgbW9udGg6IDEyCi0gICAgZGF5OiA4Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL09XTkVSUyBiL09XTkVSUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI0NjgwZS4uMDAwMDAwMAotLS0gYS9PV05FUlMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXNldCBub3BhcmVudAotZmlsZTpwbGF0Zm9ybS9wYWNrYWdlcy9tb2R1bGVzL0Nvbm5lY3Rpdml0eTptYWluOi9PV05FUlNfY29yZV9uZXR3b3JraW5nCmRpZmYgLS1naXQgYS9wcHBkL0FuZHJvaWQuYnAgYi9wcHBkL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NzVhZWIuLjAwMDAwMDAKLS0tIGEvcHBwZC9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIHsKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZXh0ZXJuYWxfcHBwX3BwcGRfbGljZW5zZSJdLAotfQotCi0vLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlIHRoYXQgdG9vayB0aGUgYXBwcm9hY2ggb2YKLS8vICdhcHBseSBldmVyeSBsaWNlbnNlIGZvdW5kIHRvIGV2ZXJ5IHRhcmdldCcuIFdoaWxlIHRoaXMgbWFrZXMgc3VyZSB3ZSByZXNwZWN0Ci0vLyBldmVyeSBsaWNlbnNlIHJlc3RyaWN0aW9uLCBpdCBtYXkgbm90IGJlIGVudGlyZWx5IGNvcnJlY3QuCi0vLwotLy8gZS5nLiBHUEwgaW4gYW4gTUlUIHByb2plY3QgbWlnaHQgb25seSBhcHBseSB0byB0aGUgY29udHJpYi8gZGlyZWN0b3J5LgotLy8KLS8vIFBsZWFzZSBjb25zaWRlciBzcGxpdHRpbmcgdGhlIHNpbmdsZSBsaWNlbnNlIGJlbG93IGludG8gbXVsdGlwbGUgbGljZW5zZXMsCi0vLyB0YWtpbmcgY2FyZSBub3QgdG8gbG9zZSBhbnkgbGljZW5zZV9raW5kIGluZm9ybWF0aW9uLCBhbmQgb3ZlcnJpZGluZyB0aGUKLS8vIGRlZmF1bHQgbGljZW5zZSB1c2luZyB0aGUgJ2xpY2Vuc2VzOiBbLi4uXScgcHJvcGVydHkgb24gdGFyZ2V0cyBhcyBuZWVkZWQuCi0vLwotLy8gRm9yIHVudXNlZCBmaWxlcywgY29uc2lkZXIgY3JlYXRpbmcgYSAnZmlsZUdyb3VwJyB3aXRoICIvL3Zpc2liaWxpdHk6cHJpdmF0ZSIKLS8vIHRvIGF0dGFjaCB0aGUgbGljZW5zZSB0bywgYW5kIGluY2x1ZGluZyBhIGNvbW1lbnQgd2hldGhlciB0aGUgZmlsZXMgbWF5IGJlCi0vLyB1c2VkIGluIHRoZSBjdXJyZW50IHByb2plY3QuCi0vLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi1saWNlbnNlIHsKLSAgICBuYW1lOiAiZXh0ZXJuYWxfcHBwX3BwcGRfbGljZW5zZSIsCi0gICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCi0gICAgbGljZW5zZV9raW5kczogWwotICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItMEJTRCIsCi0gICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKLSAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUJTRCIsCi0gICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1HUEwiLAotICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItR1BMLTIuMCIsCi0gICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1MR1BMIiwKLSAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLU1JVCIsCi0gICAgICAgICJsZWdhY3lfbm90aWNlIiwKLSAgICAgICAgImxlZ2FjeV91bmVuY3VtYmVyZWQiLAotICAgIF0sCi0gICAgbGljZW5zZV90ZXh0OiBbCi0gICAgICAgICJOT1RJQ0UiLAotICAgIF0sCi19Ci0KLWNjX2RlZmF1bHRzIHsKLSAgICBuYW1lOiAicHBwX2RlZmF1bHRzIiwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1EQ0hBUE1TPTEiLAotICAgICAgICAiLURNUFBFPTEiLAotICAgICAgICAiLURJTkVUNj0xIiwKLSAgICAgICAgIi1EVVNFX09QRU5TU0w9MSIsCi0gICAgICAgICItV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIiwKLSAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICAgICAgIi1Xbm8tcG9pbnRlci1zaWduIiwKLSAgICAgICAgIi1EUExVR0lOIiwKLSAgICBdLAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCi19Ci0KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogInBwcGQtc291cmNlcyIsCi0gICAgc3JjczogWwotICAgICAgICAiYXV0aC5jIiwKLSAgICAgICAgImNjcC5jIiwKLSAgICAgICAgImNoYXAtbWQ1LmMiLAotICAgICAgICAiY2hhcC1uZXcuYyIsCi0gICAgICAgICJjaGFwX21zLmMiLAotICAgICAgICAiZGVtYW5kLmMiLAotICAgICAgICAiZWFwLmMiLAotICAgICAgICAiZWNwLmMiLAotICAgICAgICAiZXVpNjQuYyIsCi0gICAgICAgICJmc20uYyIsCi0gICAgICAgICJpcGNwLmMiLAotICAgICAgICAiaXB2NmNwLmMiLAotICAgICAgICAibGNwLmMiLAotICAgICAgICAibWFnaWMuYyIsCi0gICAgICAgICJtYWluLmMiLAotICAgICAgICAib3B0aW9ucy5jIiwKLSAgICAgICAgInBwcGNyeXB0LmMiLAotICAgICAgICAicHBwb3guYyIsCi0gICAgICAgICJzZXNzaW9uLmMiLAotICAgICAgICAic3lzLWxpbnV4LmMiLAotICAgICAgICAidHR5LmMiLAotICAgICAgICAidXBhcC5jIiwKLSAgICAgICAgInV0aWxzLmMiLAotICAgIF0sCi19Ci0KLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGlicHBwZCIsCi0gICAgZGVmYXVsdHM6IFsicHBwX2RlZmF1bHRzIl0sCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICI6cHBwZC1zb3VyY2VzIiwKLSAgICBdLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgIi4iLAotICAgICAgICAiaW5jbHVkZSIsCi0gICAgXSwKLQotICAgIC8vIG9wdGlvbnMuYzo2MjM6MjE6IGVycm9yOiBwYXNzaW5nICdjb25zdCBjaGFyIConIHRvIHBhcmFtZXRlciBvZgotICAgIC8vIHR5cGUgJ2NoYXIgKicgZGlzY2FyZHMgcXVhbGlmaWVycy4KLSAgICAvLyBbLVdlcnJvciwtV2luY29tcGF0aWJsZS1wb2ludGVyLXR5cGVzLWRpc2NhcmRzLXF1YWxpZmllcnNdCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliZGwiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJjcnlwdG8iLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1EbWFpbj1tYWluX2xvb3AiLAotICAgICAgICAiLVduby1lbXB0eS1ib2R5IiwKLSAgICAgICAgIi1Xbm8tYXR0cmlidXRlcyIsCi0gICAgICAgICItV25vLXNpZ24tY29tcGFyZSIsCi0gICAgICAgICItV25vLWluY29tcGF0aWJsZS1wb2ludGVyLXR5cGVzLWRpc2NhcmRzLXF1YWxpZmllcnMiLAotICAgIF0sCi0KLSAgICBsZGZsYWdzOiBbIi1yZHluYW1pYyJdLAotICAgIHJlcXVpcmVkOiBbCi0gICAgICAgICJwcHBvbDJ0cC1hbmRyb2lkIiwKLSAgICAgICAgInBwcG9wcHRwLWFuZHJvaWQiLAotICAgIF0sCi19Ci0KLWNjX2JpbmFyeSB7Ci0gICAgbmFtZTogInBwcGQiLAotICAgIGRlZmF1bHRzOiBbInBwcF9kZWZhdWx0cyJdLAotCi0gICAgc3JjczogWwotICAgICAgICAiOnBwcGQtc291cmNlcyIsCi0gICAgXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJkbCIsCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmNyeXB0byIsCi0gICAgXSwKLQotICAgIGxkZmxhZ3M6IFsiLXJkeW5hbWljIl0sCi0KLSAgICBjZmxhZ3M6IFsiLVduby1pbmNvbXBhdGlibGUtcG9pbnRlci10eXBlcy1kaXNjYXJkcy1xdWFsaWZpZXJzIl0sCi0KLSAgICByZXF1aXJlZDogWwotICAgICAgICAicHBwb2wydHAtYW5kcm9pZCIsCi0gICAgICAgICJwcHBvcHB0cC1hbmRyb2lkIiwKLSAgICBdLAotfQotCi1jY19saWJyYXJ5X3NoYXJlZCB7Ci0gICAgbmFtZTogInBwcG9sMnRwLWFuZHJvaWQiLAotICAgIGRlZmF1bHRzOiBbInBwcF9kZWZhdWx0cyJdLAotICAgIHNyY3M6IFsicGx1Z2lucy9wcHBvbDJ0cC1hbmRyb2lkL3BwcG9sMnRwLWFuZHJvaWQuYyJdLAotICAgIGFsbG93X3VuZGVmaW5lZF9zeW1ib2xzOiB0cnVlLAotfQotCi1jY19saWJyYXJ5X3NoYXJlZCB7Ci0gICAgbmFtZTogInBwcG9wcHRwLWFuZHJvaWQiLAotICAgIGRlZmF1bHRzOiBbInBwcF9kZWZhdWx0cyJdLAotICAgIHNyY3M6IFsicGx1Z2lucy9wcHBvcHB0cC1hbmRyb2lkL3BwcG9wcHRwLWFuZHJvaWQuYyJdLAotICAgIGFsbG93X3VuZGVmaW5lZF9zeW1ib2xzOiB0cnVlLAotfQpkaWZmIC0tZ2l0IGEvcHBwZC9NT0RVTEVfTElDRU5TRV9CU0QgYi9wcHBkL01PRFVMRV9MSUNFTlNFX0JTRApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9wcHBkL01PRFVMRV9MSUNFTlNFX0JTRAorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9wcHBkL01ha2VmaWxlLmxpbnV4IGIvcHBwZC9NYWtlZmlsZS5saW51eApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE5NGVhNS4uMDAwMDAwMAotLS0gYS9wcHBkL01ha2VmaWxlLmxpbnV4CisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLSMKLSMgcHBwZCBtYWtlZmlsZSBmb3IgTGludXgKLSMgJElkOiBNYWtlZmlsZS5saW51eCx2IDEuNzAgMjAwNy8wNi8xOSAwMjowODozNCBjYXJsc29uaiBFeHAgJAotIwotCi0jIERlZmF1bHQgaW5zdGFsbGF0aW9uIGxvY2F0aW9ucwotREVTVERJUiA9ICQoSU5TVFJPT1QpQERFU1RESVJACi1CSU5ESVIgPSAkKERFU1RESVIpL3NiaW4KLU1BTkRJUiA9ICQoREVTVERJUikvc2hhcmUvbWFuL21hbjgKLUlOQ0RJUiA9ICQoREVTVERJUikvaW5jbHVkZQotCi1UQVJHRVRTID0gcHBwZAotCi1QUFBEU1JDUyA9IG1haW4uYyBtYWdpYy5jIGZzbS5jIGxjcC5jIGlwY3AuYyB1cGFwLmMgY2hhcC1uZXcuYyBtZDUuYyBjY3AuYyBcCi0JICAgZWNwLmMgaXB4Y3AuYyBhdXRoLmMgb3B0aW9ucy5jIHN5cy1saW51eC5jIG1kNC5jIGNoYXBfbXMuYyBcCi0JICAgZGVtYW5kLmMgdXRpbHMuYyB0dHkuYyBlYXAuYyBjaGFwLW1kNS5jIHNlc3Npb24uYwotCi1IRUFERVJTID0gY2NwLmggc2Vzc2lvbi5oIGNoYXAtbmV3LmggZWNwLmggZnNtLmggaXBjcC5oIFwKLQlpcHhjcC5oIGxjcC5oIG1hZ2ljLmggbWQ1LmggcGF0Y2hsZXZlbC5oIHBhdGhuYW1lcy5oIHBwcGQuaCBcCi0JdXBhcC5oIGVhcC5oCi0KLU1BTlBBR0VTID0gcHBwZC44Ci1QUFBET0JKUyA9IG1haW4ubyBtYWdpYy5vIGZzbS5vIGxjcC5vIGlwY3AubyB1cGFwLm8gY2hhcC1uZXcubyBtZDUubyBjY3AubyBcCi0JICAgZWNwLm8gYXV0aC5vIG9wdGlvbnMubyBkZW1hbmQubyB1dGlscy5vIHN5cy1saW51eC5vIGlweGNwLm8gdHR5Lm8gXAotCSAgIGVhcC5vIGNoYXAtbWQ1Lm8gc2Vzc2lvbi5vCi0KLSMKLSMgaW5jbHVkZSBkZXBlbmRlbmNpZXMgaWYgcHJlc2VudAotaWZlcSAoLmRlcGVuZCwkKHdpbGRjYXJkIC5kZXBlbmQpKQotaW5jbHVkZSAuZGVwZW5kCi1lbmRpZgotCi0jIENDID0gZ2NjCi0jCi1DT1BUUyA9IC1PMiAtcGlwZSAtV2FsbCAtZwotTElCUyA9Ci0KLSMgVW5jb21tZW50IHRoZSBuZXh0IDIgbGluZXMgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBNaWNyb3NvZnQncwotIyBNUy1DSEFQIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sLiAgQWxzbywgZWRpdCBwbHVnaW5zL3JhZGl1cy9NYWtlZmlsZS5saW51eC4KLUNIQVBNUz15Ci1VU0VfQ1JZUFQ9eQotIyBBbHRlcm5hdGl2ZWx5LCBpZiB5b3Ugd2FudCB0byB1c2UgT3BlblNTTCBmb3IgREVTIGZ1bmN0aW9ucywgY29tbWVudCBvdXQKLSMgVVNFX0NSWVBULCBhYm92ZSwgYW5kIHVuY29tbWVudCB0aGlzIGxpbmUuCi0jVVNFX09QRU5TU0w9eQotIyBEb24ndCB1c2UgTVNMQU5NQU4gdW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSdyZSBkb2luZy4KLSNNU0xBTk1BTj15Ci0jIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgTVBQRS4gIENIQVBNUyAoYWJvdmUpIG11c3QKLSMgYWxzbyBiZSBlbmFibGVkLiAgQWxzbywgZWRpdCBwbHVnaW5zL3JhZGl1cy9NYWtlZmlsZS5saW51eC4KLU1QUEU9eQotCi0jIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgUFBQIHBhY2tldCBmaWx0ZXJpbmcuCi0jIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGUgbGlicGNhcCBsaWJyYXJ5IGFuZCBoZWFkZXJzIGJlIGluc3RhbGxlZAotIyBhbmQgdGhhdCB0aGUga2VybmVsIGRyaXZlciBzdXBwb3J0IFBQUCBwYWNrZXQgZmlsdGVyaW5nLgotRklMVEVSPXkKLQotIyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBlbmFibGUgbXVsdGlsaW5rIFBQUCAoZW5hYmxlZCBieSBkZWZhdWx0KQotIyBMaW51eCBkaXN0cmlidXRpb25zOiBQbGVhc2UgbGVhdmUgbXVsdGlsaW5rIEVOQUJMRUQgaW4geW91ciBidWlsZHMKLSMgb2YgcHBwZCEKLUhBVkVfTVVMVElMSU5LPXkKLQotIyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBlbmFibGUgdGhlIFREQiBkYXRhYmFzZSAoZW5hYmxlZCBieSBkZWZhdWx0LikKLSMgSWYgeW91IGVuYWJsZSBtdWx0aWxpbmssIHRoZW4gVERCIGlzIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCBhbHNvLgotIyBMaW51eCBkaXN0cmlidXRpb25zOiBQbGVhc2UgbGVhdmUgVERCIEVOQUJMRUQgaW4geW91ciBidWlsZHMuCi1VU0VfVERCPXkKLQotSEFTX1NIQURPVz15Ci0jVVNFX1BBTT15Ci1IQVZFX0lORVQ2PXkKLQotIyBFbmFibGUgcGx1Z2lucwotUExVR0lOPXkKLQotIyBFbmFibGUgTWljcm9zb2Z0IHByb3ByaWV0YXJ5IENhbGxiYWNrIENvbnRyb2wgUHJvdG9jb2wKLSNDQkNQPXkKLQotIyBFbmFibGUgRUFQIFNSUC1TSEExIGF1dGhlbnRpY2F0aW9uIChyZXF1aXJlcyBsaWJzcnApCi0jVVNFX1NSUD15Ci0KLSMgVXNlIGxpYnV0aWwKLVVTRV9MSUJVVElMPXkKLQotTUFYT0NURVRTPXkKLQotSU5DTFVERV9ESVJTPSAtSS4uL2luY2x1ZGUKLQotQ09NUElMRV9GTEFHUz0gLURIQVZFX1BBVEhTX0ggLURJUFhfQ0hBTkdFIC1ESEFWRV9NTUFQCi0KLUNGTEFHUz0gJChDT1BUUykgJChDT01QSUxFX0ZMQUdTKSAkKElOQ0xVREVfRElSUykgJy1EREVTVERJUj0iQERFU1RESVJAIicKLQotaWZkZWYgQ0hBUE1TCi1DRkxBR1MgICArPSAtRENIQVBNUz0xCi1ORUVEREVTPXkKLVBQUERPQkpTICs9IG1kNC5vIGNoYXBfbXMubwotSEVBREVSUwkrPSBtZDQuaCBjaGFwX21zLmgKLWlmZGVmIE1TTEFOTUFOCi1DRkxBR1MgICArPSAtRE1TTEFOTUFOPTEKLWVuZGlmCi1pZmRlZiBNUFBFCi1DRkxBR1MgICArPSAtRE1QUEU9MQotZW5kaWYKLWVuZGlmCi0KLSMgRUFQIFNSUC1TSEExCi1pZmRlZiBVU0VfU1JQCi1DRkxBR1MJKz0gLURVU0VfU1JQIC1ET1BFTlNTTCAtSS91c3IvbG9jYWwvc3NsL2luY2x1ZGUKLUxJQlMJKz0gLWxzcnAgLUwvdXNyL2xvY2FsL3NzbC9saWIgLWxjcnlwdG8KLVRBUkdFVFMJKz0gc3JwLWVudHJ5Ci1FWFRSQUlOU1RBTEwgPSAkKElOU1RBTEwpIC1zIC1jIC1tIDU1NSBzcnAtZW50cnkgJChCSU5ESVIpL3NycC1lbnRyeQotTUFOUEFHRVMgKz0gc3JwLWVudHJ5LjgKLUVYVFJBQ0xFQU4gKz0gc3JwLWVudHJ5Lm8KLU5FRURERVM9eQotZWxzZQotIyBPcGVuU1NMIGhhcyBhbiBpbnRlZ3JhdGVkIHZlcnNpb24gb2YgU0hBLTEsIGFuZCBpdHMgaW1wbGVtZW50YXRpb24KLSMgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhpcyBsb2NhbCBTSEEtMSBpbXBsZW1lbnRhdGlvbi4gIFdlIG11c3QgdXNlCi0jIG9uZSBvciB0aGUgb3RoZXIsIG5vdCBib3RoLgotUFBQRFNSQ1MgKz0gc2hhMS5jCi1IRUFERVJTICs9IHNoYTEuaAotUFBQRE9CSlMgKz0gc2hhMS5vCi1lbmRpZgotCi1pZmRlZiBIQVNfU0hBRE9XCi1DRkxBR1MgICArPSAtREhBU19TSEFET1cKLSNMSUJTICAgICArPSAtbHNoYWRvdyAkKExJQlMpCi1lbmRpZgotCi1pZm5lcSAoJCh3aWxkY2FyZCAvdXNyL2luY2x1ZGUvY3J5cHQuaCksKQotQ0ZMQUdTICArPSAtREhBVkVfQ1JZUFRfSD0xCi1MSUJTICAgKz0gLWxjcnlwdAotZW5kaWYKLQotaWZkZWYgVVNFX0xJQlVUSUwKLUNGTEFHUwkrPSAtREhBVkVfTE9HV1RNUD0xCi1MSUJTCSs9IC1sdXRpbAotZW5kaWYKLQotaWZkZWYgTkVFRERFUwotaWZkZWYgVVNFX09QRU5TU0wKLUNGTEFHUyAgICs9IC1EVVNFX09QRU5TU0w9MQotTElCUyAgICAgKz0gLWxjcnlwdG8KLWVsc2UKLWlmbmRlZiBVU0VfQ1JZUFQKLUNGTEFHUyAgICs9IC1EVVNFX0xJQkRFUz0xCi1MSUJTICAgICArPSAtbGRlcwotZWxzZQotQ0ZMQUdTICAgKz0gLURVU0VfQ1JZUFQ9MQotTElCUyAgICAgKz0gLWxjcnlwdAotZW5kaWYKLWVuZGlmCi1QUFBET0JKUyArPSBwcHBjcnlwdC5vCi1IRUFERVJTICs9IHBwcGNyeXB0LmgKLWVuZGlmCi0KLSMgRm9yICJQbHVnZ2FibGUgQXV0aGVudGljYXRpb24gTW9kdWxlcyIsIHNlZSBmdHAucmVkaGF0LmNvbTovcHViL3BhbS8uCi1pZmRlZiBVU0VfUEFNCi1DRkxBR1MgICArPSAtRFVTRV9QQU0KLUxJQlMgICAgICs9IC1scGFtIC1sZGwKLWVuZGlmCi0KLSMgTXVsdGktbGlubmsKLWlmZGVmIEhBVkVfTVVMVElMSU5LCi0JIyBNdWx0aWxpbmsgaW1wbGllcyB0aGUgdXNlIG9mIFREQgotCVVTRV9UREI9eQotCi0JQ0ZMQUdTICs9IC1ESEFWRV9NVUxUSUxJTksKLQlQUFBEU1JDUyArPSBtdWx0aWxpbmsuYwotCVBQUERPQkpTICs9IG11bHRpbGluay5vCi1lbmRpZgotCi0jIFREQgotaWZkZWYgVVNFX1REQgotCUNGTEFHUyArPSAtRFVTRV9UREI9MQotCVBQUERTUkNTICs9IHRkYi5jIHNwaW5sb2NrLmMKLQlQUFBET0JKUyArPSB0ZGIubyBzcGlubG9jay5vCi0JSEVBREVSUyArPSB0ZGIuaCBzcGlubG9jay5oCi1lbmRpZgotCi0jIExvY2sgbGlicmFyeSBiaW5hcnkgZm9yIExpbnV4IGlzIGluY2x1ZGVkIGluICdsaW51eCcgc3ViZGlyZWN0b3J5LgotaWZkZWYgTE9DS0xJQgotTElCUyAgICAgKz0gLWxsb2NrCi1DRkxBR1MgICArPSAtRExPQ0tMSUI9MQotZW5kaWYKLQotaWZkZWYgUExVR0lOCi1DRkxBR1MJKz0gLURQTFVHSU4KLUxERkxBR1MJKz0gLVdsLC1FCi1MSUJTCSs9IC1sZGwKLWVuZGlmCi0KLWlmZGVmIEZJTFRFUgotaWZuZXEgKCQod2lsZGNhcmQgL3Vzci9pbmNsdWRlL3BjYXAtYnBmLmgpLCkKLUxJQlMgICAgKz0gLWxwY2FwCi1DRkxBR1MgICs9IC1EUFBQX0ZJTFRFUgotZW5kaWYKLWVuZGlmCi0KLWlmZGVmIEhBVkVfSU5FVDYKLSAgICAgUFBQRFNSQ1MgKz0gaXB2NmNwLmMgZXVpNjQuYwotICAgICBIRUFERVJTICArPSBpcHY2Y3AuaCBldWk2NC5oCi0gICAgIFBQUERPQkpTICs9IGlwdjZjcC5vIGV1aTY0Lm8KLSAgICAgQ0ZMQUdTICAgKz0gLURJTkVUNj0xCi1lbmRpZgotCi1pZmRlZiBDQkNQCi0gICAgIFBQUERTUkNTICs9IGNiY3AuYwotICAgICBQUFBET0JKUyArPSBjYmNwLm8KLSAgICAgQ0ZMQUdTICs9IC1EQ0JDUF9TVVBQT1JUCi0gICAgIEhFQURFUlMgKz0gY2JjcC5oCi1lbmRpZgotCi1pZmRlZiBNQVhPQ1RFVFMKLSAgICAgQ0ZMQUdTICs9IC1ETUFYT0NURVRTCi1lbmRpZgotCi1JTlNUQUxMPSBpbnN0YWxsCi0KLWFsbDogJChUQVJHRVRTKQotCi1pbnN0YWxsOiBwcHBkCi0JbWtkaXIgLXAgJChCSU5ESVIpICQoTUFORElSKQotCSQoRVhUUkFJTlNUQUxMKQotCSQoSU5TVEFMTCkgLXMgLWMgLW0gNTU1IHBwcGQgJChCSU5ESVIpL3BwcGQKLQlpZiBjaGdycCBwcHB1c2VycyAkKEJJTkRJUikvcHBwZCAyPi9kZXYvbnVsbDsgdGhlbiBcCi0JICBjaG1vZCBvLXJ4LHUrcyAkKEJJTkRJUikvcHBwZDsgZmkKLQkkKElOU1RBTEwpIC1jIC1tIDQ0NCBwcHBkLjggJChNQU5ESVIpCi0KLXBwcGQ6ICQoUFBQRE9CSlMpCi0JJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gcHBwZCAkKFBQUERPQkpTKSAkKExJQlMpCi0KLXNycC1lbnRyeToJc3JwLWVudHJ5LmMKLQkkKENDKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkQCBzcnAtZW50cnkuYyAkKExJQlMpCi0KLWluc3RhbGwtZGV2ZWw6Ci0JbWtkaXIgLXAgJChJTkNESVIpL3BwcGQKLQkkKElOU1RBTEwpIC1jIC1tIDY0NCAkKEhFQURFUlMpICQoSU5DRElSKS9wcHBkCi0KLWNsZWFuOgotCXJtIC1mICQoUFBQRE9CSlMpICQoRVhUUkFDTEVBTikgJChUQVJHRVRTKSAqfiAjKiBjb3JlCi0KLWRlcGVuZDoKLQkkKENQUCkgLU0gJChDRkxBR1MpICQoUFBQRFNSQ1MpID4uZGVwZW5kCmRpZmYgLS1naXQgYS9wcHBkL01ha2VmaWxlLnNvbDIgYi9wcHBkL01ha2VmaWxlLnNvbDIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YjZiNjIuLjAwMDAwMDAKLS0tIGEvcHBwZC9NYWtlZmlsZS5zb2wyCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgcHBwZCB1bmRlciBTb2xhcmlzIDIuCi0jICRJZDogTWFrZWZpbGUuc29sMix2IDEuMzAgMjAwOC8wMS8zMCAxNDoyNjo1MiBjYXJsc29uaiBFeHAgJAotIwotCi1pbmNsdWRlIC4uL01ha2VkZWZzLmNvbQotCi1DRkxBR1MJPSAgLUkuLi9pbmNsdWRlIC1EU1ZSNCAtRFNPTDIgJChDT1BUUykgJy1EREVTVERJUj0iQERFU1RESVJAIicKLUxJQlMJPSAtbHNvY2tldCAtbG5zbAotCi1PQkpTCT0gIG1haW4ubyBtYWdpYy5vIGZzbS5vIGxjcC5vIGlwY3AubyB1cGFwLm8gY2hhcC1uZXcubyBlYXAubyBtZDUubyBcCi0JdHR5Lm8gY2NwLm8gZWNwLm8gYXV0aC5vIG9wdGlvbnMubyBkZW1hbmQubyB1dGlscy5vIHN5cy1zb2xhcmlzLm8gXAotCWNoYXAtbWQ1Lm8gc2Vzc2lvbi5vCi0KLSMgU29sYXJpcyB1c2VzIHNoYWRvdyBwYXNzd29yZHMKLUNGTEFHUwkrPSAtREhBU19TSEFET1cKLQotIwotIyBDb21tZW50IHRoZSBmb2xsb3dpbmcgb3V0IHRvIGRpc2FibGUgcGx1Z2lucwotIwotQ0ZMQUdTCSs9IC1EUExVR0lOCi1MSUJTCSs9IC1sZGwKLQotIwotIyBTb2xhcmlzIDggYW5kIGFib3ZlIGFjY29tb2RhdGVzIC92YXIvcnVuLCBzbyB1bmNvbW1lbnQgdGhlCi0jIGZvbGxvd2luZyB0byBwbGFjZSBwcHBkIHByb2Nlc3MgSURzIG9uIHRoYXQgbG9jYXRpb24KLSMKLSNDRkxBR1MgKz0gLURfUEFUSF9WQVJSVU49JyIvdmFyL3J1bi8iJwotCi0jCi0jIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIHRvIGVuYWJsZSBJUHY2Ci0jCi0jIFNvbGFyaXMgOCBhbmQgb24gaW5jbHVkZXMgc3VwcG9ydCBmb3IgSVB2NgotIwotQ0ZMQUdTCSs9IC1ESU5FVDYKLU9CSlMJKz0gaXB2NmNwLm8gZXVpNjQubwotCi0jIFVuY29tbWVudCB0byBlbmFibGUgTVMtQ0hBUAotQ0ZMQUdTICs9IC1EVVNFX0NSWVBUIC1EQ0hBUE1TIC1ETVNMQU5NQU4gLURIQVZFX0NSWVBUX0gKLU9CSlMgKz0gY2hhcF9tcy5vIHBwcGNyeXB0Lm8gbWQ0Lm8gc2hhMS5vCi0KLSMgVW5jb21tZW50IGZvciBDQkNQCi0jQ0ZMQUdTICs9IC1EQ0JDUF9TVVBQT1JUCi0jT0JKUyArPSBjYmNwLm8KLQotIyBVbmNvbW1lbnQgZm9yIFBBTQotI0NGTEFHUyArPSAtRFVTRV9QQU0KLSNMSUJTICs9IC1scGFtCi0KLSMKLSMgTWFrZSB0YXJnZXRzCi0jCi1hbGw6IHBwcGQKLQotcHBwZDoJJChPQkpTKQotCSQoQ0MpIC1vIHBwcGQgJChPQkpTKSAkKExJQlMpCi0KLWluc3RhbGw6Ci0JJChJTlNUQUxMKSAtZiAkKEJJTkRJUikgLW0gNDc1NSAtdSByb290IHBwcGQKLQkkKElOU1RBTEwpIC1mICQoTUFORElSKS9tYW44IC1tIDQ0NCBwcHBkLjgKLQotY2xlYW46Ci0Jcm0gLWYgJChPQkpTKSBwcHBkICp+IGNvcmUgeS50YWIuYyB5LnRhYi5oCmRpZmYgLS1naXQgYS9wcHBkL05PVElDRSBiL3BwcGQvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzhlYjYxLi4wMDAwMDAwCi0tLSBhL3BwcGQvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgUGF1bCBNYWNrZXJyYXMgPHBhdWx1c0BzYW1iYS5vcmc+Ci1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IENvbXB1dGluZyBTZXJ2aWNlcyBhdCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSAoaHR0cDovL3d3dy5jbXUuZWR1L2NvbXB1dGluZy8pLgotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBQZWRybyBSb3F1ZSBNYXJxdWVzIDxwZWRyb19tQHlhaG9vLmNvbT4KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgVG9tbWkgS29tdWxhaW5lbiA8VG9tbWkuS29tdWxhaW5lbkBpa2kuZmk+Ci0KLUNvcHlyaWdodCAoYykgMTk4NC0yMDAwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgZGlzdHJpYnV0aW9uLgotCi0zLiBUaGUgbmFtZSAiQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciBwZXJtaXNzaW9uIG9yIGFueSBsZWdhbAotICAgZGV0YWlscywgcGxlYXNlIGNvbnRhY3QKLSAgICAgT2ZmaWNlIG9mIFRlY2hub2xvZ3kgVHJhbnNmZXIKLSAgICAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAgICAgNTAwMCBGb3JiZXMgQXZlbnVlCi0gICAgIFBpdHRzYnVyZ2gsIFBBICAxNTIxMy0zODkwCi0gICAgICg0MTIpIDI2OC00Mzg3LCBmYXg6ICg0MTIpIDI2OC03Mzk1Ci0gICAgIHRlY2gtdHJhbnNmZXJAYW5kcmV3LmNtdS5lZHUKLQotNC4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICAgYWNrbm93bGVkZ21lbnQ6Ci0gICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBDb21wdXRpbmcgU2VydmljZXMKLSAgICBhdCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSAoaHR0cDovL3d3dy5jbXUuZWR1L2NvbXB1dGluZy8pLiIKLQotQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi1USElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLUFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBCRSBMSUFCTEUKLUZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi1XSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi1Db3B5cmlnaHQgKGMpIDE5OTUgUGVkcm8gUm9xdWUgTWFycXVlcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi1hcmUgbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0yLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gICBkaXN0cmlidXRpb24uCi0KLTMuIFRoZSBuYW1lcyBvZiB0aGUgYXV0aG9ycyBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLTQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAgIGFja25vd2xlZGdtZW50OgotICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgUGVkcm8gUm9xdWUgTWFycXVlcwotICAgIDxwZWRyb19tQHlhaG9vLmNvbT4iCi0KLVRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLVRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi1TUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLVdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KLUNvcHlyaWdodCAoQykgMjAwMC0yMDA0IFBhdWwgTWFja2VycmFzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotQ29weXJpZ2h0IChjKSAxOTk0LTIwMDIgUGF1bCBNYWNrZXJyYXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi1Db3B5cmlnaHQgKGMpIDIwMDMgUGF1bCBNYWNrZXJyYXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi1Db3B5cmlnaHQgKGMpIDE5OTYtMjAwMiBQYXVsIE1hY2tlcnJhcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLUNvcHlyaWdodCAoYykgMTk5OS0yMDA0IFBhdWwgTWFja2VycmFzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgUGF1bCBNYWNrZXJyYXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi1Db3B5cmlnaHQgKGMpIDE5OTktMjAwMiBQYXVsIE1hY2tlcnJhcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLWFyZSBtZXQ6Ci0KLTEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLTIuIFRoZSBuYW1lKHMpIG9mIHRoZSBhdXRob3JzIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgdXNlZCB0bwotICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotMy4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICAgYWNrbm93bGVkZ21lbnQ6Ci0gICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBQYXVsIE1hY2tlcnJhcwotICAgIDxwYXVsdXNAc2FtYmEub3JnPiIuCi0KLVRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLVRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi1TUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLVdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KLUNvcHlyaWdodCAoYykgMTk5NSBFcmljIFJvc2VucXVpc3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLWFyZSBtZXQ6Ci0KLTEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLTIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAgIGRpc3RyaWJ1dGlvbi4KLQotMy4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USEUgQVVUSE9SUyBPRiBUSElTIFNPRlRXQVJFIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi1USElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLUFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi1XSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0KLUNvcHlyaWdodCAoQykgMTk5MCwgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1MaWNlbnNlIHRvIGNvcHkgYW5kIHVzZSB0aGlzIHNvZnR3YXJlIGlzIGdyYW50ZWQgcHJvdmlkZWQgdGhhdCAgICAKLWl0IGlzIGlkZW50aWZpZWQgYXMgdGhlICJSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZS0gICAgIAotRGlnZXN0IEFsZ29yaXRobSIgaW4gYWxsIG1hdGVyaWFsIG1lbnRpb25pbmcgb3IgcmVmZXJlbmNpbmcgdGhpcyAgCi1zb2Z0d2FyZSBvciB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTGljZW5zZSBpcyBhbHNvIGdyYW50ZWQgdG8gbWFrZSBhbmQgdXNlIGRlcml2YXRpdmUgd29ya3MgICAgICAgICAgCi1wcm92aWRlZCB0aGF0IHN1Y2ggd29ya3MgYXJlIGlkZW50aWZpZWQgYXMgImRlcml2ZWQgZnJvbSB0aGUgUlNBICAKLURhdGEgU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobSIgaW4gYWxsICAgICAgICAgIAotbWF0ZXJpYWwgbWVudGlvbmluZyBvciByZWZlcmVuY2luZyB0aGUgZGVyaXZlZCB3b3JrLiAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLVJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBjb25jZXJuaW5nICAgICAgIAotZWl0aGVyIHRoZSBtZXJjaGFudGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBvciB0aGUgc3VpdGFiaWxpdHkgICAgCi1vZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcGFydGljdWxhciBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzICAKLWlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eSBvZiBhbnkga2luZC4gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1UaGVzZSBub3RpY2VzIG11c3QgYmUgcmV0YWluZWQgaW4gYW55IGNvcGllcyBvZiBhbnkgcGFydCBvZiB0aGlzICAKLWRvY3VtZW50YXRpb24gYW5kL29yIHNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi1Db3B5cmlnaHQgKGMpIDIwMDEgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotTm9uLWV4Y2x1c2l2ZSByaWdodHMgdG8gcmVkaXN0cmlidXRlLCBtb2RpZnksIHRyYW5zbGF0ZSwgYW5kIHVzZQotdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcywgaW4gd2hvbGUgb3IgaW4gcGFydCwgaXMKLWhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGlzCi1kdXBsaWNhdGVkIGluIGFueSBzb3VyY2UgZm9ybSwgYW5kIHRoYXQgbmVpdGhlciB0aGUgbmFtZSBvZiB0aGUKLWNvcHlyaWdodCBob2xkZXIgbm9yIHRoZSBhdXRob3IgaXMgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLXByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLVdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotQ29weXJpZ2h0IChjKSAxOTk5IFRvbW1pIEtvbXVsYWluZW4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgZGlzdHJpYnV0aW9uLgotCi0zLiBUaGUgbmFtZShzKSBvZiB0aGUgYXV0aG9ycyBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLTQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAgIGFja25vd2xlZGdtZW50OgotICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgVG9tbWkgS29tdWxhaW5lbgotICAgIDxUb21taS5Lb211bGFpbmVuQGlraS5maT4iLgotCi1USEUgQVVUSE9SUyBPRiBUSElTIFNPRlRXQVJFIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi1USElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLUFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi1XSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLUFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi1Db3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYsIDE5OTcgRnJhbmNpcy5EdXBvbnRAaW5yaWEuZnIsIElOUklBIFJvY3F1ZW5jb3VydCwKLUFsYWluLkR1cmFuZEBpbWFnLmZyLCBJTUFHLAotSmVhbi1MdWMuUmljaGllckBpbWFnLmZyLCBJTUFHLUxTUi4KLQotQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5IEZyYW5jaXMuRHVwb250QGlucmlhLmZyLCBHSUUgRFlBREUsCi1BbGFpbi5EdXJhbmRAaW1hZy5mciwgSU1BRywKLUplYW4tTHVjLlJpY2hpZXJAaW1hZy5mciwgSU1BRy1MU1IuCi0KLUNlIHRyYXZhaWwgYSDpdOkgZmFpdCBhdSBzZWluIGR1IEdJRSBEWUFERSAoR3JvdXBlbWVudCBkJ0ludOly6nQKLcljb25vbWlxdWUgYXlhbnQgcG91ciBtZW1icmVzIEJVTEwgUy5BLiBldCBsJ0lOUklBKS4KLQotQ2UgbG9naWNpZWwgaW5mb3JtYXRpcXVlIGVzdCBkaXNwb25pYmxlIGF1eCBjb25kaXRpb25zCi11c3VlbGxlcyBkYW5zIGxhIHJlY2hlcmNoZSwgYydlc3Qt4C1kaXJlIHF1J2lsIHBldXQKLep0cmUgdXRpbGlz6SwgY29waeksIG1vZGlmaeksIGRpc3RyaWJ16SDgIGwndW5pcXVlCi1jb25kaXRpb24gcXVlIGNlIHRleHRlIHNvaXQgY29uc2VydukgYWZpbiBxdWUKLWwnb3JpZ2luZSBkZSBjZSBsb2dpY2llbCBzb2l0IHJlY29ubnVlLgotCi1MZSBub20gZGUgbCdJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlCi1ldCBlbiBBdXRvbWF0aXF1ZSAoSU5SSUEpLCBkZSBsJ0lNQUcsIG91IGQndW5lIHBlcnNvbm5lIG1vcmFsZQotb3UgcGh5c2lxdWUgYXlhbnQgcGFydGljaXDpIOAgbCfpbGFib3JhdGlvbiBkZSBjZSBsb2dpY2llbCBuZSBwZXV0Ci3qdHJlIHV0aWxpc+kgc2FucyBzb24gYWNjb3JkIHBy6WFsYWJsZSBleHBsaWNpdGUuCi0KLUNlIGxvZ2ljaWVsIGVzdCBmb3VybmkgdGVsIHF1ZWwgc2FucyBhdWN1bmUgZ2FyYW50aWUsCi1zdXBwb3J0IG91IHJlc3BvbnNhYmlsaXTpIGQnYXVjdW5lIHNvcnRlLgotQ2UgbG9naWNpZWwgZXN0IGTpcml26SBkZSBzb3VyY2VzIGQnb3JpZ2luZQotIlVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBhdCBCZXJrZWxleSIgZXQKLSJEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiIgY291dmVydGVzIHBhciBkZXMgY29weXJpZ2h0cy4KLQotTCdJbnN0aXR1dCBkJ0luZm9ybWF0aXF1ZSBldCBkZSBNYXRo6W1hdGlxdWVzIEFwcGxpcXXpZXMgZGUgR3Jlbm9ibGUgKElNQUcpCi1lc3QgdW5lIGbpZOlyYXRpb24gZCd1bml06XMgbWl4dGVzIGRlIHJlY2hlcmNoZSBkdSBDTlJTLCBkZSBsJ0luc3RpdHV0IE5hdGlvbmFsCi1Qb2x5dGVjaG5pcXVlIGRlIEdyZW5vYmxlIGV0IGRlIGwnVW5pdmVyc2l06SBKb3NlcGggRm91cmllciByZWdyb3VwYW50Ci1zZXB0IGxhYm9yYXRvaXJlcyBkb250IGxlIGxhYm9yYXRvaXJlIExvZ2ljaWVscywgU3lzdOhtZXMsIFLpc2VhdXggKExTUikuCi0KLVRoaXMgd29yayBoYXMgYmVlbiBkb25lIGluIHRoZSBjb250ZXh0IG9mIEdJRSBEWUFERSAoam9pbnQgUiAmIEQgdmVudHVyZQotYmV0d2VlbiBCVUxMIFMuQS4gYW5kIElOUklBKS4KLQotVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgd2l0aCB1c3VhbCAicmVzZWFyY2giIHRlcm1zCi13aXRoIHRoZSBhaW0gb2YgcmV0YWluIGNyZWRpdHMgb2YgdGhlIHNvZnR3YXJlLiAKLVBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci1wdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLWNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMsCi1hbmQgdGhlIG5hbWUgb2YgSU5SSUEsIElNQUcsIG9yIGFueSBjb250cmlidXRvciBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZwotb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhpcyBtYXRlcmlhbCB3aXRob3V0IHRoZSBwcmlvciBleHBsaWNpdAotcGVybWlzc2lvbi4gVGhlIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBhbnkKLXdhcnJhbnRpZXMsIHN1cHBvcnQgb3IgbGlhYmlsaXRpZXMgb2YgYW55IGtpbmQuCi1UaGlzIHNvZnR3YXJlIGlzIGRlcml2ZWQgZnJvbSBzb3VyY2UgY29kZSBmcm9tCi0iVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhIGF0IEJlcmtlbGV5IiBhbmQKLSJEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiIgcHJvdGVjdGVkIGJ5IGNvcHlyaWdodHMuCi0KLUdyZW5vYmxlJ3MgSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UgYW5kIEFwcGxpZWQgTWF0aGVtYXRpY3MgKElNQUcpCi1pcyBhIGZlZGVyYXRpb24gb2Ygc2V2ZW4gcmVzZWFyY2ggdW5pdHMgZnVuZGVkIGJ5IHRoZSBDTlJTLCBOYXRpb25hbAotUG9seXRlY2huaWMgSW5zdGl0dXRlIG9mIEdyZW5vYmxlIGFuZCBVbml2ZXJzaXR5IEpvc2VwaCBGb3VyaWVyLgotVGhlIHJlc2VhcmNoIHVuaXQgaW4gU29mdHdhcmUsIFN5c3RlbXMsIE5ldHdvcmtzIChMU1IpIGlzIG1lbWJlciBvZiBJTUFHLgpkaWZmIC0tZ2l0IGEvcHBwZC9SRUFETUUuZ29vZ2xlIGIvcHBwZC9SRUFETUUuZ29vZ2xlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjI0OWYwLi4wMDAwMDAwCi0tLSBhL3BwcGQvUkVBRE1FLmdvb2dsZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTm90ZXM6Ci1SZW1vdmVkIG11bHRpbGluay5jLCBzcGlubG9jay5bY2hdLCB0ZGIuW2NoXSBhcyB0aGV5IGFyZSB1bnVzZWQuCmRpZmYgLS1naXQgYS9wcHBkL1JFQURNRS5wcHBvbDJ0cCBiL3BwcGQvUkVBRE1FLnBwcG9sMnRwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODI1NDhhLi4wMDAwMDAwCi0tLSBhL3BwcGQvUkVBRE1FLnBwcG9sMnRwCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotUFBQb0wyVFAtQW5kcm9pZCBwbHVnaW4KLT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgUFBQb0wyVFAtQW5kcm9pZCBwbHVnaW4gd2FzIHdyaXR0ZW4gZm9yIEFPU1AgcHJvamVjdCBmcm9tIHNjcmF0Y2guIEl0IGhhcwotbm90aGluZyB0byBkbyB3aXRoIHBwcG9sMnRwIHBsdWdpbiBmcm9tIHVwc3RyZWFtIHBwcCBwcm9qZWN0IFsxXS4KLQotVGhpcyBwbHVnaW4gYWRkcyBzdXBwb3J0IGZvciB1cHN0cmVhbSBrZXJuZWwgTDJUUCBpbXBsZW1lbnRhdGlvbiBpbiBwcHBkCi1kYWVtb24uIE9ubHkgTEFDIHBhcnQgb2YgTDJUUCBpcyBpbXBsZW1lbnRlZCwgYXMgd2UgZG9uJ3QgdXNlIEFuZHJvaWQgZGV2aWNlcwotaW4gTE5TIG1vZGUuCi0KLUluIGdlbmVyYWwgY2FzZSwgdGhlIGV4ZWN1dGlvbiBmbG93IGZvciBWUE4gc3RhcnR1cCBvbiBBbmRyb2lkIGRldmljZXMgaXM6Ci0gMS4gUnVuIElQU2VjIGNsaWVudCAocmFjb29uKQotIDIuIFJ1biBMMlRQIGNsaWVudCAobXRwZCkKLSAzLiBtdHBkIG9idGFpbnMgInJlbW90ZSB0dW5uZWwgSUQiIGFuZCAicmVtb3RlIHNlc3Npb24gSUQiIGZyb20gTDJUUCBzZXJ2ZXIKLSA0LiBtdHBkIGNyZWF0ZXMgTDJUUCBzb2NrZXRzIChzZWUgWzJdIGZvciBkZXRhaWxzKToKLSAgICAtIHR1bm5lbCBtYW5hZ2VtZW50IFBQUG9YIHNvY2tldAotICAgIC0gc2Vzc2lvbiBQUFBvWCBkYXRhIHNvY2tldAotIDUuIG10cGQgcnVucyBwcHBkLCBwYXNzaW5nIGFyZ3VtZW50cyBmb3IgcHBwb2wydHAtYW5kcm9pZCBwbHVnaW4KLSA2LiBwcHBkIGRsb3BlbigpIHBwcG9sMnRwLWFuZHJvaWQgcGx1Z2luIChiZWNhdXNlIGl0IHJlY2VpdmVzIGNvcnJlc3BvbmRpbmdcCi0gICAgYXJndW1lbnRzIGZyb20gbXRwZCkKLQotTWFpbiB0YXNrIG9mIHRoaXMgcGx1Z2luIGlzIHRvIG9idGFpbiBzZXNzaW9uX2ZkIHNvY2tldCBmcm9tIG10cGQgYW5kIHBhc3MgaXQKLWJhY2sgdG8gcHBwZCB3aGVuIC5jb25uZWN0KCkgY2FsbGJhY2sgaXMgZXhlY3V0ZWQuIEluIHRoaXMgcmVzcGVjdCBpdCdzIHNpbWlsYXIKLXRvIG9sZCBwcHBveC5jIGltcGxlbWVudGF0aW9uLiBUaGUgZGlmZmVyZW5jZXMgYXJlIG5leHQ6Ci0gMS4gcHBwb2wydHAtYW5kcm9pZCBhbHNvIG9idGFpbnMgdGhlIHNlY29uZCBzb2NrZXQgKGZvciB0dW5uZWwgbWFuYWdlbWVudCkKLSAgICB3aGljaCBhbGxvd3MgdXMgdG8gaGFuZGxlIGl0IHByb3Blcmx5Ci0gMi4gcHBwb2wydHAtYW5kcm9pZCBoYW5kbGVzIHRoZSBzZXR0aW5nIG9mIE1UVS9NUlUgc2l6ZSAod2hpY2ggY2FuIGJlIHBhc3NlZAotICAgIHRvIHRoZSBwbHVnaW4gd2l0aCBwcHBkIHBhcmFtZXRlcnMpIHZpYSBrZXJuZWwgTDJUUCBpbXBsZW1lbnRhdGlvbgotIDMuIHBwcG9sMnRwLWFuZHJvaWQgcGx1Z2luIGlzIGFjdHVhbGx5IGxvYWRlZCBkeW5hbWljYWxseSB3aXRoIGRsb3BlbigpLAotICAgIGFzIG9wcG9zZWQgdG8gcHBwb3guYyB3aGljaCBpcyBoYXJkLWNvZGVkIGludG8gcHBwZCBjb2RlCi0KLVsxXSBodHRwczovL2dpdGh1Yi5jb20vcGF1bHVzbWFjay9wcHAKLVsyXSBodHRwczovL3d3dy5rZXJuZWwub3JnL2RvYy9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbDJ0cC50eHQKZGlmZiAtLWdpdCBhL3BwcGQvUkVBRE1FLnBwcG9wcHRwIGIvcHBwZC9SRUFETUUucHBwb3BwdHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMjQ1NzguLjAwMDAwMDAKLS0tIGEvcHBwZC9SRUFETUUucHBwb3BwdHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1QUFBvUFBUUC1BbmRyb2lkIHBsdWdpbgotPT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwbHVnaW4gd2FzIHdyaXR0ZW4gZm9yIEFPU1AgcHJvamVjdCBmcm9tIHNjcmF0Y2guIEl0IGhhcyBub3RoaW5nIHRvIGRvIHdpdGgKLWFjY2VsLXBwdHAgcGx1Z2luIFsxXS4KLQotVGhpcyBwbHVnaW4gYWRkcyBzdXBwb3J0IGZvciB1cHN0cmVhbSBrZXJuZWwgUFBUUCBpbXBsZW1lbnRhdGlvbiBpbiBwcHBkIGRhZW1vbi4KLU9ubHkgUE5TIChjbGllbnQpIHBhcnQgb2YgUFBUUCBpcyBpbXBsZW1lbnRlZCwgYXMgd2UgZG9uJ3QgdXNlIEFuZHJvaWQgZGV2aWNlcwotaW4gUEFDIG1vZGUuCi0KLUluIGdlbmVyYWwgY2FzZSwgdGhlIGV4ZWN1dGlvbiBmbG93IGZvciBWUE4gc3RhcnR1cCBvbiBBbmRyb2lkIGRldmljZXMgaXM6Ci0gMS4gUnVuIFBQVFAgY2xpZW50IChtdHBkKQotIDIuIG10cGQgb2J0YWlucyByZW1vdGUgQ2FsbCBJRCBvbiBPQ1JQIChPdXRnb2luZy1DYWxsLVJlcGx5KSBwYWNrZXQKLSAzLiBtdHBkIGNyZWF0ZXMgUFBUUCBzb2NrZXQKLSA0LiBtdHBkIHJ1bnMgcHBwZCwgcGFzc2luZyBQUFRQIHNvY2tldCBhcyB0byBwcHBvcHB0cC1hbmRyb2lkIChhcyBwYXJhbWV0ZXIpCi0gNS4gcHBwZCBkbG9wZW4oKSBwcHBvcHB0cC1hbmRyb2lkIHBsdWdpbiAoYmVjYXVzZSBpdCByZWNlaXZlZCBjb3JyZXNwb25kaW5nCi0gICAgYXJndW1lbnRzIGZyb20gbXRwZCkKLQotTWFpbiB0YXNrIG9mIHRoaXMgcGx1Z2luIGlzIHRvIG9idGFpbiBQUFRQIHNvY2tldCBGRCBmcm9tIG10cGQgYW5kIHBhc3MgaXQKLWJhY2sgdG8gcHBwZCB3aGVuIC5jb25uZWN0KCkgY2FsbGJhY2sgaXMgZXhlY3V0ZWQuCi0KLUFsbCBjb250cm9sIHBhY2tldHMgYXJlIGhhbmRsZWQgaW4gbXRwZC4gUFBQIHBhY2tldHMgKGxpa2UgTENQKSBhcmUgaGFuZGxlZCBpbgotcHBwZC4gRGF0YSBwYWNrZXRzIGFyZSBoYW5kbGVkIGJ5IGtlcm5lbCBQUFRQIGRyaXZlci4KLQotWzFdIGh0dHA6Ly9hY2NlbC1wcHRwLnNvdXJjZWZvcmdlLm5ldC8KZGlmZiAtLWdpdCBhL3BwcGQvYXV0aC5jIGIvcHBwZC9hdXRoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MzJjZjUuLjAwMDAwMDAKLS0tIGEvcHBwZC9hdXRoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzY1ICswLDAgQEAKLS8qCi0gKiBhdXRoLmMgLSBQUFAgYXV0aGVudGljYXRpb24gYW5kIHBoYXNlIGNvbnRyb2wuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTkzLTIwMDIgUGF1bCBNYWNrZXJyYXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBUaGUgbmFtZShzKSBvZiB0aGUgYXV0aG9ycyBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogMy4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBQYXVsIE1hY2tlcnJhcwotICogICAgIDxwYXVsdXNAc2FtYmEub3JnPiIuCi0gKgotICogVEhFIEFVVEhPUlMgT0YgVEhJUyBTT0ZUV0FSRSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotICogVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi0gKiBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi0gKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi0gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqCi0gKiBEZXJpdmVkIGZyb20gbWFpbi5jLCB3aGljaCBpczoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODQtMjAwMCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgbmFtZSAiQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciBwZXJtaXNzaW9uIG9yIGFueSBsZWdhbAotICogICAgZGV0YWlscywgcGxlYXNlIGNvbnRhY3QKLSAqICAgICAgT2ZmaWNlIG9mIFRlY2hub2xvZ3kgVHJhbnNmZXIKLSAqICAgICAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAqICAgICAgNTAwMCBGb3JiZXMgQXZlbnVlCi0gKiAgICAgIFBpdHRzYnVyZ2gsIFBBICAxNTIxMy0zODkwCi0gKiAgICAgICg0MTIpIDI2OC00Mzg3LCBmYXg6ICg0MTIpIDI2OC03Mzk1Ci0gKiAgICAgIHRlY2gtdHJhbnNmZXJAYW5kcmV3LmNtdS5lZHUKLSAqCi0gKiA0LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IENvbXB1dGluZyBTZXJ2aWNlcwotICogICAgIGF0IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IChodHRwOi8vd3d3LmNtdS5lZHUvY29tcHV0aW5nLykuIgotICoKLSAqIENBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotICogVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi0gKiBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi0gKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi0gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jZGVmaW5lIFJDU0lECSIkSWQ6IGF1dGguYyx2IDEuMTE3IDIwMDgvMDcvMDEgMTI6Mjc6NTYgcGF1bHVzIEV4cCAkIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHB3ZC5oPgotI2luY2x1ZGUgPGdycC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPHV0bXAuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2lmIGRlZmluZWQoX1BBVEhfTEFTVExPRykgJiYgZGVmaW5lZChfX2xpbnV4X18pCi0jaW5jbHVkZSA8bGFzdGxvZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLQotCi0jaWZkZWYgSEFTX1NIQURPVwotI2luY2x1ZGUgPHNoYWRvdy5oPgotI2lmbmRlZiBQV19QUFAKLSNkZWZpbmUgUFdfUFBQIFBXX0xPR0lOCi0jZW5kaWYKLSNlbmRpZgotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2luY2x1ZGUgInBwcGQuaCIKLSNpbmNsdWRlICJmc20uaCIKLSNpbmNsdWRlICJsY3AuaCIKLSNpbmNsdWRlICJjY3AuaCIKLSNpbmNsdWRlICJlY3AuaCIKLSNpbmNsdWRlICJpcGNwLmgiCi0jaW5jbHVkZSAidXBhcC5oIgotI2luY2x1ZGUgImNoYXAtbmV3LmgiCi0jaW5jbHVkZSAiZWFwLmgiCi0jaWZkZWYgQ0JDUF9TVVBQT1JUCi0jaW5jbHVkZSAiY2JjcC5oIgotI2VuZGlmCi0jaW5jbHVkZSAicGF0aG5hbWVzLmgiCi0jaW5jbHVkZSAic2Vzc2lvbi5oIgotCi1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdID0gUkNTSUQ7Ci0KLS8qIEJpdHMgaW4gc2Nhbl9hdXRoZmlsZSByZXR1cm4gdmFsdWUgKi8KLSNkZWZpbmUgTk9OV0lMRF9TRVJWRVIJMQotI2RlZmluZSBOT05XSUxEX0NMSUVOVAkyCi0KLSNkZWZpbmUgSVNXSUxEKHdvcmQpCSh3b3JkWzBdID09ICcqJyAmJiB3b3JkWzFdID09IDApCi0KLS8qIFRoZSBuYW1lIGJ5IHdoaWNoIHRoZSBwZWVyIGF1dGhlbnRpY2F0ZWQgaXRzZWxmIHRvIHVzLiAqLwotY2hhciBwZWVyX2F1dGhuYW1lW01BWE5BTUVMRU5dOwotCi0vKiBSZWNvcmRzIHdoaWNoIGF1dGhlbnRpY2F0aW9uIG9wZXJhdGlvbnMgaGF2ZW4ndCBjb21wbGV0ZWQgeWV0LiAqLwotc3RhdGljIGludCBhdXRoX3BlbmRpbmdbTlVNX1BQUF07Ci0KLS8qIFJlY29yZHMgd2hpY2ggYXV0aGVudGljYXRpb24gb3BlcmF0aW9ucyBoYXZlIGJlZW4gY29tcGxldGVkLiAqLwotaW50IGF1dGhfZG9uZVtOVU1fUFBQXTsKLQotLyogTGlzdCBvZiBhZGRyZXNzZXMgd2hpY2ggdGhlIHBlZXIgbWF5IHVzZS4gKi8KLXN0YXRpYyBzdHJ1Y3QgcGVybWl0dGVkX2lwICphZGRyZXNzZXNbTlVNX1BQUF07Ci0KLS8qIFdvcmRsaXN0IGdpdmluZyBhZGRyZXNzZXMgd2hpY2ggdGhlIHBlZXIgbWF5IHVzZQotICAgd2l0aG91dCBhdXRoZW50aWNhdGluZyBpdHNlbGYuICovCi1zdGF0aWMgc3RydWN0IHdvcmRsaXN0ICpub2F1dGhfYWRkcnM7Ci0KLS8qIFJlbW90ZSB0ZWxlcGhvbmUgbnVtYmVyLCBpZiBhdmFpbGFibGUgKi8KLWNoYXIgcmVtb3RlX251bWJlcltNQVhOQU1FTEVOXTsKLQotLyogV29yZGxpc3QgZ2l2aW5nIHJlbW90ZSB0ZWxlcGhvbmUgbnVtYmVycyB3aGljaCBtYXkgY29ubmVjdC4gKi8KLXN0YXRpYyBzdHJ1Y3Qgd29yZGxpc3QgKnBlcm1pdHRlZF9udW1iZXJzOwotCi0vKiBFeHRyYSBvcHRpb25zIHRvIGFwcGx5LCBmcm9tIHRoZSBzZWNyZXRzIGZpbGUgZW50cnkgZm9yIHRoZSBwZWVyLiAqLwotc3RhdGljIHN0cnVjdCB3b3JkbGlzdCAqZXh0cmFfb3B0aW9uczsKLQotLyogTnVtYmVyIG9mIG5ldHdvcmsgcHJvdG9jb2xzIHdoaWNoIHdlIGhhdmUgb3BlbmVkLiAqLwotc3RhdGljIGludCBudW1fbnBfb3BlbjsKLQotLyogTnVtYmVyIG9mIG5ldHdvcmsgcHJvdG9jb2xzIHdoaWNoIGhhdmUgY29tZSB1cC4gKi8KLXN0YXRpYyBpbnQgbnVtX25wX3VwOwotCi0vKiBTZXQgaWYgd2UgZ290IHRoZSBjb250ZW50cyBvZiBwYXNzd2RbXSBmcm9tIHRoZSBwYXAtc2VjcmV0cyBmaWxlLiAqLwotc3RhdGljIGludCBwYXNzd2RfZnJvbV9maWxlOwotCi0vKiBTZXQgaWYgd2UgcmVxdWlyZSBhdXRoZW50aWNhdGlvbiBvbmx5IGJlY2F1c2Ugd2UgaGF2ZSBhIGRlZmF1bHQgcm91dGUuICovCi1zdGF0aWMgYm9vbCBkZWZhdWx0X2F1dGg7Ci0KLS8qIEhvb2sgdG8gZW5hYmxlIGEgcGx1Z2luIHRvIGNvbnRyb2wgdGhlIGlkbGUgdGltZSBsaW1pdCAqLwotaW50ICgqaWRsZV90aW1lX2hvb2spIF9fUCgoc3RydWN0IHBwcF9pZGxlICopKSA9IE5VTEw7Ci0KLS8qIEhvb2sgZm9yIGEgcGx1Z2luIHRvIHNheSB3aGV0aGVyIHdlIGNhbiBwb3NzaWJseSBhdXRoZW50aWNhdGUgYW55IHBlZXIgKi8KLWludCAoKnBhcF9jaGVja19ob29rKSBfX1AoKHZvaWQpKSA9IE5VTEw7Ci0KLS8qIEhvb2sgZm9yIGEgcGx1Z2luIHRvIGNoZWNrIHRoZSBQQVAgdXNlciBhbmQgcGFzc3dvcmQgKi8KLWludCAoKnBhcF9hdXRoX2hvb2spIF9fUCgoY2hhciAqdXNlciwgY2hhciAqcGFzc3dkLCBjaGFyICoqbXNncCwKLQkJCSAgc3RydWN0IHdvcmRsaXN0ICoqcGFkZHJzLAotCQkJICBzdHJ1Y3Qgd29yZGxpc3QgKipwb3B0cykpID0gTlVMTDsKLQotLyogSG9vayBmb3IgYSBwbHVnaW4gdG8ga25vdyBhYm91dCB0aGUgUEFQIHVzZXIgbG9nb3V0ICovCi12b2lkICgqcGFwX2xvZ291dF9ob29rKSBfX1AoKHZvaWQpKSA9IE5VTEw7Ci0KLS8qIEhvb2sgZm9yIGEgcGx1Z2luIHRvIGdldCB0aGUgUEFQIHBhc3N3b3JkIGZvciBhdXRoZW50aWNhdGluZyB1cyAqLwotaW50ICgqcGFwX3Bhc3N3ZF9ob29rKSBfX1AoKGNoYXIgKnVzZXIsIGNoYXIgKnBhc3N3ZCkpID0gTlVMTDsKLQotLyogSG9vayBmb3IgYSBwbHVnaW4gdG8gc2F5IGlmIHdlIGNhbiBwb3NzaWJseSBhdXRoZW50aWNhdGUgYSBwZWVyIHVzaW5nIENIQVAgKi8KLWludCAoKmNoYXBfY2hlY2tfaG9vaykgX19QKCh2b2lkKSkgPSBOVUxMOwotCi0vKiBIb29rIGZvciBhIHBsdWdpbiB0byBnZXQgdGhlIENIQVAgcGFzc3dvcmQgZm9yIGF1dGhlbnRpY2F0aW5nIHVzICovCi1pbnQgKCpjaGFwX3Bhc3N3ZF9ob29rKSBfX1AoKGNoYXIgKnVzZXIsIGNoYXIgKnBhc3N3ZCkpID0gTlVMTDsKLQotLyogSG9vayBmb3IgYSBwbHVnaW4gdG8gc2F5IHdoZXRoZXIgaXQgaXMgT0sgaWYgdGhlIHBlZXIKLSAgIHJlZnVzZXMgdG8gYXV0aGVudGljYXRlLiAqLwotaW50ICgqbnVsbF9hdXRoX2hvb2spIF9fUCgoc3RydWN0IHdvcmRsaXN0ICoqcGFkZHJzLAotCQkJICAgc3RydWN0IHdvcmRsaXN0ICoqcG9wdHMpKSA9IE5VTEw7Ci0KLWludCAoKmFsbG93ZWRfYWRkcmVzc19ob29rKSBfX1AoKHVfaW50MzJfdCBhZGRyKSkgPSBOVUxMOwotCi0jaWZkZWYgSEFWRV9NVUxUSUxJTksKLS8qIEhvb2sgZm9yIHBsdWdpbiB0byBoZWFyIHdoZW4gYW4gaW50ZXJmYWNlIGpvaW5zIGEgbXVsdGlsaW5rIGJ1bmRsZSAqLwotdm9pZCAoKm11bHRpbGlua19qb2luX2hvb2spIF9fUCgodm9pZCkpID0gTlVMTDsKLSNlbmRpZgotCi0vKiBBIG5vdGlmaWVyIGZvciB3aGVuIHRoZSBwZWVyIGhhcyBhdXRoZW50aWNhdGVkIGl0c2VsZiwKLSAgIGFuZCB3ZSBhcmUgcHJvY2VlZGluZyB0byB0aGUgbmV0d29yayBwaGFzZS4gKi8KLXN0cnVjdCBub3RpZmllciAqYXV0aF91cF9ub3RpZmllciA9IE5VTEw7Ci0KLS8qIEEgbm90aWZpZXIgZm9yIHdoZW4gdGhlIGxpbmsgZ29lcyBkb3duLiAqLwotc3RydWN0IG5vdGlmaWVyICpsaW5rX2Rvd25fbm90aWZpZXIgPSBOVUxMOwotCi0vKgotICogVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IHN0YXJ0IGFuIGF1dGgtdXAvZG93bgotICogc2NyaXB0IHdoaWxlIG9uZSBpcyBhbHJlYWR5IHJ1bm5pbmcuCi0gKi8KLWVudW0gc2NyaXB0X3N0YXRlIHsKLSAgICBzX2Rvd24sCi0gICAgc191cAotfTsKLQotc3RhdGljIGVudW0gc2NyaXB0X3N0YXRlIGF1dGhfc3RhdGUgPSBzX2Rvd247Ci1zdGF0aWMgZW51bSBzY3JpcHRfc3RhdGUgYXV0aF9zY3JpcHRfc3RhdGUgPSBzX2Rvd247Ci1zdGF0aWMgcGlkX3QgYXV0aF9zY3JpcHRfcGlkID0gMDsKLQotLyoKLSAqIE9wdGlvbiB2YXJpYWJsZXMuCi0gKi8KLWJvb2wgdXNlbG9naW4gPSAwOwkJLyogVXNlIC9ldGMvcGFzc3dkIGZvciBjaGVja2luZyBQQVAgKi8KLWJvb2wgc2Vzc2lvbl9tZ210ID0gMDsJCS8qIERvIHNlc3Npb24gbWFuYWdlbWVudCAobG9naW4gcmVjb3JkcykgKi8KLWJvb2wgY3J5cHRwYXAgPSAwOwkJLyogUGFzc3dvcmRzIGluIHBhcC1zZWNyZXRzIGFyZSBlbmNyeXB0ZWQgKi8KLWJvb2wgcmVmdXNlX3BhcCA9IDA7CQkvKiBEb24ndCB3YW5uYSBhdXRoLiBvdXJzZWx2ZXMgd2l0aCBQQVAgKi8KLWJvb2wgcmVmdXNlX2NoYXAgPSAwOwkJLyogRG9uJ3Qgd2FubmEgYXV0aC4gb3Vyc2VsdmVzIHdpdGggQ0hBUCAqLwotYm9vbCByZWZ1c2VfZWFwID0gMDsJCS8qIERvbid0IHdhbm5hIGF1dGguIG91cnNlbHZlcyB3aXRoIEVBUCAqLwotI2lmZGVmIENIQVBNUwotYm9vbCByZWZ1c2VfbXNjaGFwID0gMDsJCS8qIERvbid0IHdhbm5hIGF1dGguIG91cnNlbHZlcyB3aXRoIE1TLUNIQVAgKi8KLWJvb2wgcmVmdXNlX21zY2hhcF92MiA9IDA7CS8qIERvbid0IHdhbm5hIGF1dGguIG91cnNlbHZlcyB3aXRoIE1TLUNIQVB2MiAqLwotI2Vsc2UKLWJvb2wgcmVmdXNlX21zY2hhcCA9IDE7CQkvKiBEb24ndCB3YW5uYSBhdXRoLiBvdXJzZWx2ZXMgd2l0aCBNUy1DSEFQICovCi1ib29sIHJlZnVzZV9tc2NoYXBfdjIgPSAxOwkvKiBEb24ndCB3YW5uYSBhdXRoLiBvdXJzZWx2ZXMgd2l0aCBNUy1DSEFQdjIgKi8KLSNlbmRpZgotYm9vbCB1c2Vob3N0bmFtZSA9IDA7CQkvKiBVc2UgaG9zdG5hbWUgZm9yIG91cl9uYW1lICovCi1ib29sIGF1dGhfcmVxdWlyZWQgPSAwOwkJLyogQWx3YXlzIHJlcXVpcmUgYXV0aGVudGljYXRpb24gZnJvbSBwZWVyICovCi1ib29sIGFsbG93X2FueV9pcCA9IDA7CQkvKiBBbGxvdyBwZWVyIHRvIHVzZSBhbnkgSVAgYWRkcmVzcyAqLwotYm9vbCBleHBsaWNpdF9yZW1vdGUgPSAwOwkvKiBVc2VyIHNwZWNpZmllZCBleHBsaWNpdCByZW1vdGUgbmFtZSAqLwotYm9vbCBleHBsaWNpdF91c2VyID0gMDsJCS8qIFNldCBpZiAidXNlciIgb3B0aW9uIHN1cHBsaWVkICovCi1ib29sIGV4cGxpY2l0X3Bhc3N3ZCA9IDA7CS8qIFNldCBpZiAicGFzc3dvcmQiIG9wdGlvbiBzdXBwbGllZCAqLwotY2hhciByZW1vdGVfbmFtZVtNQVhOQU1FTEVOXTsJLyogUGVlcidzIG5hbWUgZm9yIGF1dGhlbnRpY2F0aW9uICovCi0KLXN0YXRpYyBjaGFyICp1YWZuYW1lOwkJLyogbmFtZSBvZiBtb3N0IHJlY2VudCArdWEgZmlsZSAqLwotCi1leHRlcm4gY2hhciAqY3J5cHQgX19QKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotCi0vKiBQcm90b3R5cGVzIGZvciBwcm9jZWR1cmVzIGxvY2FsIHRvIHRoaXMgZmlsZS4gKi8KLQotc3RhdGljIHZvaWQgbmV0d29ya19waGFzZSBfX1AoKGludCkpOwotc3RhdGljIHZvaWQgY2hlY2tfaWRsZSBfX1AoKHZvaWQgKikpOwotc3RhdGljIHZvaWQgY29ubmVjdF90aW1lX2V4cGlyZWQgX19QKCh2b2lkICopKTsKLXN0YXRpYyBpbnQgIG51bGxfbG9naW4gX19QKChpbnQpKTsKLXN0YXRpYyBpbnQgIGdldF9wYXBfcGFzc3dkIF9fUCgoY2hhciAqKSk7Ci1zdGF0aWMgaW50ICBoYXZlX3BhcF9zZWNyZXQgX19QKChpbnQgKikpOwotc3RhdGljIGludCAgaGF2ZV9jaGFwX3NlY3JldCBfX1AoKGNoYXIgKiwgY2hhciAqLCBpbnQsIGludCAqKSk7Ci1zdGF0aWMgaW50ICBoYXZlX3NycF9zZWNyZXQgX19QKChjaGFyICpjbGllbnQsIGNoYXIgKnNlcnZlciwgaW50IG5lZWRfaXAsCi0gICAgaW50ICpsYWNrc19pcHApKTsKLXN0YXRpYyBpbnQgIGlwX2FkZHJfY2hlY2sgX19QKCh1X2ludDMyX3QsIHN0cnVjdCBwZXJtaXR0ZWRfaXAgKikpOwotc3RhdGljIGludCAgc2Nhbl9hdXRoZmlsZSBfX1AoKEZJTEUgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwKLQkJCSAgICAgICBzdHJ1Y3Qgd29yZGxpc3QgKiosIHN0cnVjdCB3b3JkbGlzdCAqKiwKLQkJCSAgICAgICBjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgZnJlZV93b3JkbGlzdCBfX1AoKHN0cnVjdCB3b3JkbGlzdCAqKSk7Ci1zdGF0aWMgdm9pZCBhdXRoX3NjcmlwdCBfX1AoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgYXV0aF9zY3JpcHRfZG9uZSBfX1AoKHZvaWQgKikpOwotc3RhdGljIHZvaWQgc2V0X2FsbG93ZWRfYWRkcnMgX19QKChpbnQsIHN0cnVjdCB3b3JkbGlzdCAqLCBzdHJ1Y3Qgd29yZGxpc3QgKikpOwotc3RhdGljIGludCAgc29tZV9pcF9vayBfX1AoKHN0cnVjdCB3b3JkbGlzdCAqKSk7Ci1zdGF0aWMgaW50ICBzZXR1cGFwZmlsZSBfX1AoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgIHByaXZncm91cCBfX1AoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgIHNldF9ub2F1dGhfYWRkciBfX1AoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgIHNldF9wZXJtaXR0ZWRfbnVtYmVyIF9fUCgoY2hhciAqKikpOwotc3RhdGljIHZvaWQgY2hlY2tfYWNjZXNzIF9fUCgoRklMRSAqLCBjaGFyICopKTsKLXN0YXRpYyBpbnQgIHdvcmRsaXN0X2NvdW50IF9fUCgoc3RydWN0IHdvcmRsaXN0ICopKTsKLQotI2lmZGVmIE1BWE9DVEVUUwotc3RhdGljIHZvaWQgY2hlY2tfbWF4b2N0ZXRzIF9fUCgodm9pZCAqKSk7Ci0jZW5kaWYKLQotLyoKLSAqIEF1dGhlbnRpY2F0aW9uLXJlbGF0ZWQgb3B0aW9ucy4KLSAqLwotb3B0aW9uX3QgYXV0aF9vcHRpb25zW10gPSB7Ci0gICAgeyAiYXV0aCIsIG9fYm9vbCwgJmF1dGhfcmVxdWlyZWQsCi0gICAgICAiUmVxdWlyZSBhdXRoZW50aWNhdGlvbiBmcm9tIHBlZXIiLCBPUFRfUFJJTyB8IDEgfSwKLSAgICB7ICJub2F1dGgiLCBvX2Jvb2wsICZhdXRoX3JlcXVpcmVkLAotICAgICAgIkRvbid0IHJlcXVpcmUgcGVlciB0byBhdXRoZW50aWNhdGUiLCBPUFRfUFJJT1NVQiB8IE9QVF9QUklWLAotICAgICAgJmFsbG93X2FueV9pcCB9LAotICAgIHsgInJlcXVpcmUtcGFwIiwgb19ib29sLCAmbGNwX3dhbnRvcHRpb25zWzBdLm5lZ191cGFwLAotICAgICAgIlJlcXVpcmUgUEFQIGF1dGhlbnRpY2F0aW9uIGZyb20gcGVlciIsCi0gICAgICBPUFRfUFJJT1NVQiB8IDEsICZhdXRoX3JlcXVpcmVkIH0sCi0gICAgeyAiK3BhcCIsIG9fYm9vbCwgJmxjcF93YW50b3B0aW9uc1swXS5uZWdfdXBhcCwKLSAgICAgICJSZXF1aXJlIFBBUCBhdXRoZW50aWNhdGlvbiBmcm9tIHBlZXIiLAotICAgICAgT1BUX0FMSUFTIHwgT1BUX1BSSU9TVUIgfCAxLCAmYXV0aF9yZXF1aXJlZCB9LAotICAgIHsgInJlcXVpcmUtY2hhcCIsIG9fYm9vbCwgJmF1dGhfcmVxdWlyZWQsCi0gICAgICAiUmVxdWlyZSBDSEFQIGF1dGhlbnRpY2F0aW9uIGZyb20gcGVlciIsCi0gICAgICBPUFRfUFJJT1NVQiB8IE9QVF9BMk9SIHwgTURUWVBFX01ENSwKLSAgICAgICZsY3Bfd2FudG9wdGlvbnNbMF0uY2hhcF9tZHR5cGUgfSwKLSAgICB7ICIrY2hhcCIsIG9fYm9vbCwgJmF1dGhfcmVxdWlyZWQsCi0gICAgICAiUmVxdWlyZSBDSEFQIGF1dGhlbnRpY2F0aW9uIGZyb20gcGVlciIsCi0gICAgICBPUFRfQUxJQVMgfCBPUFRfUFJJT1NVQiB8IE9QVF9BMk9SIHwgTURUWVBFX01ENSwKLSAgICAgICZsY3Bfd2FudG9wdGlvbnNbMF0uY2hhcF9tZHR5cGUgfSwKLSNpZmRlZiBDSEFQTVMKLSAgICB7ICJyZXF1aXJlLW1zY2hhcCIsIG9fYm9vbCwgJmF1dGhfcmVxdWlyZWQsCi0gICAgICAiUmVxdWlyZSBNUy1DSEFQIGF1dGhlbnRpY2F0aW9uIGZyb20gcGVlciIsCi0gICAgICBPUFRfUFJJT1NVQiB8IE9QVF9BMk9SIHwgTURUWVBFX01JQ1JPU09GVCwKLSAgICAgICZsY3Bfd2FudG9wdGlvbnNbMF0uY2hhcF9tZHR5cGUgfSwKLSAgICB7ICIrbXNjaGFwIiwgb19ib29sLCAmYXV0aF9yZXF1aXJlZCwKLSAgICAgICJSZXF1aXJlIE1TLUNIQVAgYXV0aGVudGljYXRpb24gZnJvbSBwZWVyIiwKLSAgICAgIE9QVF9BTElBUyB8IE9QVF9QUklPU1VCIHwgT1BUX0EyT1IgfCBNRFRZUEVfTUlDUk9TT0ZULAotICAgICAgJmxjcF93YW50b3B0aW9uc1swXS5jaGFwX21kdHlwZSB9LAotICAgIHsgInJlcXVpcmUtbXNjaGFwLXYyIiwgb19ib29sLCAmYXV0aF9yZXF1aXJlZCwKLSAgICAgICJSZXF1aXJlIE1TLUNIQVB2MiBhdXRoZW50aWNhdGlvbiBmcm9tIHBlZXIiLAotICAgICAgT1BUX1BSSU9TVUIgfCBPUFRfQTJPUiB8IE1EVFlQRV9NSUNST1NPRlRfVjIsCi0gICAgICAmbGNwX3dhbnRvcHRpb25zWzBdLmNoYXBfbWR0eXBlIH0sCi0gICAgeyAiK21zY2hhcC12MiIsIG9fYm9vbCwgJmF1dGhfcmVxdWlyZWQsCi0gICAgICAiUmVxdWlyZSBNUy1DSEFQdjIgYXV0aGVudGljYXRpb24gZnJvbSBwZWVyIiwKLSAgICAgIE9QVF9BTElBUyB8IE9QVF9QUklPU1VCIHwgT1BUX0EyT1IgfCBNRFRZUEVfTUlDUk9TT0ZUX1YyLAotICAgICAgJmxjcF93YW50b3B0aW9uc1swXS5jaGFwX21kdHlwZSB9LAotI2VuZGlmCi0KLSAgICB7ICJyZWZ1c2UtcGFwIiwgb19ib29sLCAmcmVmdXNlX3BhcCwKLSAgICAgICJEb24ndCBhZ3JlZSB0byBhdXRoIHRvIHBlZXIgd2l0aCBQQVAiLCAxIH0sCi0gICAgeyAiLXBhcCIsIG9fYm9vbCwgJnJlZnVzZV9wYXAsCi0gICAgICAiRG9uJ3QgYWxsb3cgUEFQIGF1dGhlbnRpY2F0aW9uIHdpdGggcGVlciIsIE9QVF9BTElBUyB8IDEgfSwKLSAgICB7ICJyZWZ1c2UtY2hhcCIsIG9fYm9vbCwgJnJlZnVzZV9jaGFwLAotICAgICAgIkRvbid0IGFncmVlIHRvIGF1dGggdG8gcGVlciB3aXRoIENIQVAiLAotICAgICAgT1BUX0EyQ0xSQiB8IE1EVFlQRV9NRDUsCi0gICAgICAmbGNwX2FsbG93b3B0aW9uc1swXS5jaGFwX21kdHlwZSB9LAotICAgIHsgIi1jaGFwIiwgb19ib29sLCAmcmVmdXNlX2NoYXAsCi0gICAgICAiRG9uJ3QgYWxsb3cgQ0hBUCBhdXRoZW50aWNhdGlvbiB3aXRoIHBlZXIiLAotICAgICAgT1BUX0FMSUFTIHwgT1BUX0EyQ0xSQiB8IE1EVFlQRV9NRDUsCi0gICAgICAmbGNwX2FsbG93b3B0aW9uc1swXS5jaGFwX21kdHlwZSB9LAotI2lmZGVmIENIQVBNUwotICAgIHsgInJlZnVzZS1tc2NoYXAiLCBvX2Jvb2wsICZyZWZ1c2VfbXNjaGFwLAotICAgICAgIkRvbid0IGFncmVlIHRvIGF1dGggdG8gcGVlciB3aXRoIE1TLUNIQVAiLAotICAgICAgT1BUX0EyQ0xSQiB8IE1EVFlQRV9NSUNST1NPRlQsCi0gICAgICAmbGNwX2FsbG93b3B0aW9uc1swXS5jaGFwX21kdHlwZSB9LAotICAgIHsgIi1tc2NoYXAiLCBvX2Jvb2wsICZyZWZ1c2VfbXNjaGFwLAotICAgICAgIkRvbid0IGFsbG93IE1TLUNIQVAgYXV0aGVudGljYXRpb24gd2l0aCBwZWVyIiwKLSAgICAgIE9QVF9BTElBUyB8IE9QVF9BMkNMUkIgfCBNRFRZUEVfTUlDUk9TT0ZULAotICAgICAgJmxjcF9hbGxvd29wdGlvbnNbMF0uY2hhcF9tZHR5cGUgfSwKLSAgICB7ICJyZWZ1c2UtbXNjaGFwLXYyIiwgb19ib29sLCAmcmVmdXNlX21zY2hhcF92MiwKLSAgICAgICJEb24ndCBhZ3JlZSB0byBhdXRoIHRvIHBlZXIgd2l0aCBNUy1DSEFQdjIiLAotICAgICAgT1BUX0EyQ0xSQiB8IE1EVFlQRV9NSUNST1NPRlRfVjIsCi0gICAgICAmbGNwX2FsbG93b3B0aW9uc1swXS5jaGFwX21kdHlwZSB9LAotICAgIHsgIi1tc2NoYXAtdjIiLCBvX2Jvb2wsICZyZWZ1c2VfbXNjaGFwX3YyLAotICAgICAgIkRvbid0IGFsbG93IE1TLUNIQVB2MiBhdXRoZW50aWNhdGlvbiB3aXRoIHBlZXIiLAotICAgICAgT1BUX0FMSUFTIHwgT1BUX0EyQ0xSQiB8IE1EVFlQRV9NSUNST1NPRlRfVjIsCi0gICAgICAmbGNwX2FsbG93b3B0aW9uc1swXS5jaGFwX21kdHlwZSB9LAotI2VuZGlmCi0KLSAgICB7ICJyZXF1aXJlLWVhcCIsIG9fYm9vbCwgJmxjcF93YW50b3B0aW9uc1swXS5uZWdfZWFwLAotICAgICAgIlJlcXVpcmUgRUFQIGF1dGhlbnRpY2F0aW9uIGZyb20gcGVlciIsIE9QVF9QUklPU1VCIHwgMSwKLSAgICAgICZhdXRoX3JlcXVpcmVkIH0sCi0gICAgeyAicmVmdXNlLWVhcCIsIG9fYm9vbCwgJnJlZnVzZV9lYXAsCi0gICAgICAiRG9uJ3QgYWdyZWUgdG8gYXV0aGVudGljYXRlIHRvIHBlZXIgd2l0aCBFQVAiLCAxIH0sCi0KLSAgICB7ICJuYW1lIiwgb19zdHJpbmcsIG91cl9uYW1lLAotICAgICAgIlNldCBsb2NhbCBuYW1lIGZvciBhdXRoZW50aWNhdGlvbiIsCi0gICAgICBPUFRfUFJJTyB8IE9QVF9QUklWIHwgT1BUX1NUQVRJQywgTlVMTCwgTUFYTkFNRUxFTiB9LAotCi0gICAgeyAiK3VhIiwgb19zcGVjaWFsLCAodm9pZCAqKXNldHVwYXBmaWxlLAotICAgICAgIkdldCBQQVAgdXNlciBhbmQgcGFzc3dvcmQgZnJvbSBmaWxlIiwKLSAgICAgIE9QVF9QUklPIHwgT1BUX0EyU1RSVkFMLCAmdWFmbmFtZSB9LAotCi0gICAgeyAidXNlciIsIG9fc3RyaW5nLCB1c2VyLAotICAgICAgIlNldCBuYW1lIGZvciBhdXRoIHdpdGggcGVlciIsIE9QVF9QUklPIHwgT1BUX1NUQVRJQywKLSAgICAgICZleHBsaWNpdF91c2VyLCBNQVhOQU1FTEVOIH0sCi0KLSAgICB7ICJwYXNzd29yZCIsIG9fc3RyaW5nLCBwYXNzd2QsCi0gICAgICAiUGFzc3dvcmQgZm9yIGF1dGhlbnRpY2F0aW5nIHVzIHRvIHRoZSBwZWVyIiwKLSAgICAgIE9QVF9QUklPIHwgT1BUX1NUQVRJQyB8IE9QVF9ISURFLAotICAgICAgJmV4cGxpY2l0X3Bhc3N3ZCwgTUFYU0VDUkVUTEVOIH0sCi0KLSAgICB7ICJ1c2Vob3N0bmFtZSIsIG9fYm9vbCwgJnVzZWhvc3RuYW1lLAotICAgICAgIk11c3QgdXNlIGhvc3RuYW1lIGZvciBhdXRoZW50aWNhdGlvbiIsIDEgfSwKLQotICAgIHsgInJlbW90ZW5hbWUiLCBvX3N0cmluZywgcmVtb3RlX25hbWUsCi0gICAgICAiU2V0IHJlbW90ZSBuYW1lIGZvciBhdXRoZW50aWNhdGlvbiIsIE9QVF9QUklPIHwgT1BUX1NUQVRJQywKLSAgICAgICZleHBsaWNpdF9yZW1vdGUsIE1BWE5BTUVMRU4gfSwKLQotICAgIHsgImxvZ2luIiwgb19ib29sLCAmdXNlbG9naW4sCi0gICAgICAiVXNlIHN5c3RlbSBwYXNzd29yZCBkYXRhYmFzZSBmb3IgUEFQIiwgT1BUX0EyQ09QWSB8IDEgLAotICAgICAgJnNlc3Npb25fbWdtdCB9LAotICAgIHsgImVuYWJsZS1zZXNzaW9uIiwgb19ib29sLCAmc2Vzc2lvbl9tZ210LAotICAgICAgIkVuYWJsZSBzZXNzaW9uIGFjY291bnRpbmcgZm9yIHJlbW90ZSBwZWVycyIsIE9QVF9QUklWIHwgMSB9LAotCi0gICAgeyAicGFwY3J5cHQiLCBvX2Jvb2wsICZjcnlwdHBhcCwKLSAgICAgICJQQVAgcGFzc3dvcmRzIGFyZSBlbmNyeXB0ZWQiLCAxIH0sCi0KLSAgICB7ICJwcml2Z3JvdXAiLCBvX3NwZWNpYWwsICh2b2lkICopcHJpdmdyb3VwLAotICAgICAgIkFsbG93IGdyb3VwIG1lbWJlcnMgdG8gdXNlIHByaXZpbGVnZWQgb3B0aW9ucyIsIE9QVF9QUklWIHwgT1BUX0EyTElTVCB9LAotCi0gICAgeyAiYWxsb3ctaXAiLCBvX3NwZWNpYWwsICh2b2lkICopc2V0X25vYXV0aF9hZGRyLAotICAgICAgIlNldCBJUCBhZGRyZXNzKGVzKSB3aGljaCBjYW4gYmUgdXNlZCB3aXRob3V0IGF1dGhlbnRpY2F0aW9uIiwKLSAgICAgIE9QVF9QUklWIHwgT1BUX0EyTElTVCB9LAotCi0gICAgeyAicmVtb3RlbnVtYmVyIiwgb19zdHJpbmcsIHJlbW90ZV9udW1iZXIsCi0gICAgICAiU2V0IHJlbW90ZSB0ZWxlcGhvbmUgbnVtYmVyIGZvciBhdXRoZW50aWNhdGlvbiIsIE9QVF9QUklPIHwgT1BUX1NUQVRJQywKLSAgICAgIE5VTEwsIE1BWE5BTUVMRU4gfSwKLQotICAgIHsgImFsbG93LW51bWJlciIsIG9fc3BlY2lhbCwgKHZvaWQgKilzZXRfcGVybWl0dGVkX251bWJlciwKLSAgICAgICJTZXQgdGVsZXBob25lIG51bWJlcihzKSB3aGljaCBhcmUgYWxsb3dlZCB0byBjb25uZWN0IiwKLSAgICAgIE9QVF9QUklWIHwgT1BUX0EyTElTVCB9LAotCi0gICAgeyBOVUxMIH0KLX07Ci0KLS8qCi0gKiBzZXR1cGFwZmlsZSAtIHNwZWNpZmllcyBVUEFQIGluZm8gZm9yIGF1dGhlbnRpY2F0aW5nIHdpdGggcGVlci4KLSAqLwotc3RhdGljIGludAotc2V0dXBhcGZpbGUoYXJndikKLSAgICBjaGFyICoqYXJndjsKLXsKLSAgICBGSUxFICp1ZmlsZTsKLSAgICBpbnQgbDsKLSAgICB1aWRfdCBldWlkOwotICAgIGNoYXIgdVtNQVhOQU1FTEVOXSwgcFtNQVhTRUNSRVRMRU5dOwotICAgIGNoYXIgKmZuYW1lOwotCi0gICAgbGNwX2FsbG93b3B0aW9uc1swXS5uZWdfdXBhcCA9IDE7Ci0KLSAgICAvKiBvcGVuIHVzZXIgaW5mbyBmaWxlICovCi0gICAgZm5hbWUgPSBzdHJkdXAoKmFyZ3YpOwotICAgIGlmIChmbmFtZSA9PSBOVUxMKQotCW5vdm0oIit1YSBmaWxlIG5hbWUiKTsKLSAgICBldWlkID0gZ2V0ZXVpZCgpOwotICAgIGlmIChzZXRldWlkKGdldHVpZCgpKSA9PSAtMSkgewotCW9wdGlvbl9lcnJvcigidW5hYmxlIHRvIHJlc2V0IHVpZCBiZWZvcmUgb3BlbmluZyAlczogJW0iLCBmbmFtZSk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIHVmaWxlID0gZm9wZW4oZm5hbWUsICJyIik7Ci0gICAgaWYgKHNldGV1aWQoZXVpZCkgPT0gLTEpCi0JZmF0YWwoInVuYWJsZSB0byByZWdhaW4gcHJpdmlsZWdlczogJW0iKTsKLSAgICBpZiAodWZpbGUgPT0gTlVMTCkgewotCW9wdGlvbl9lcnJvcigidW5hYmxlIHRvIG9wZW4gdXNlciBsb2dpbiBkYXRhIGZpbGUgJXMiLCBmbmFtZSk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGNoZWNrX2FjY2Vzcyh1ZmlsZSwgZm5hbWUpOwotICAgIHVhZm5hbWUgPSBmbmFtZTsKLQotICAgIC8qIGdldCB1c2VybmFtZSAqLwotICAgIGlmIChmZ2V0cyh1LCBNQVhOQU1FTEVOIC0gMSwgdWZpbGUpID09IE5VTEwKLQl8fCBmZ2V0cyhwLCBNQVhTRUNSRVRMRU4gLSAxLCB1ZmlsZSkgPT0gTlVMTCkgewotCWZjbG9zZSh1ZmlsZSk7Ci0Jb3B0aW9uX2Vycm9yKCJ1bmFibGUgdG8gcmVhZCB1c2VyIGxvZ2luIGRhdGEgZmlsZSAlcyIsIGZuYW1lKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgZmNsb3NlKHVmaWxlKTsKLQotICAgIC8qIGdldCByaWQgb2YgbmV3bGluZXMgKi8KLSAgICBsID0gc3RybGVuKHUpOwotICAgIGlmIChsID4gMCAmJiB1W2wtMV0gPT0gJ1xuJykKLQl1W2wtMV0gPSAwOwotICAgIGwgPSBzdHJsZW4ocCk7Ci0gICAgaWYgKGwgPiAwICYmIHBbbC0xXSA9PSAnXG4nKQotCXBbbC0xXSA9IDA7Ci0KLSAgICBpZiAob3ZlcnJpZGVfdmFsdWUoInVzZXIiLCBvcHRpb25fcHJpb3JpdHksIGZuYW1lKSkgewotCXN0cmxjcHkodXNlciwgdSwgc2l6ZW9mKHVzZXIpKTsKLQlleHBsaWNpdF91c2VyID0gMTsKLSAgICB9Ci0gICAgaWYgKG92ZXJyaWRlX3ZhbHVlKCJwYXNzd2QiLCBvcHRpb25fcHJpb3JpdHksIGZuYW1lKSkgewotCXN0cmxjcHkocGFzc3dkLCBwLCBzaXplb2YocGFzc3dkKSk7Ci0JZXhwbGljaXRfcGFzc3dkID0gMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKDEpOwotfQotCi0KLS8qCi0gKiBwcml2Z3JvdXAgLSBhbGxvdyBtZW1iZXJzIG9mIHRoZSBncm91cCB0byBoYXZlIHByaXZpbGVnZWQgYWNjZXNzLgotICovCi1zdGF0aWMgaW50Ci1wcml2Z3JvdXAoYXJndikKLSAgICBjaGFyICoqYXJndjsKLXsKLSAgICBzdHJ1Y3QgZ3JvdXAgKmc7Ci0gICAgaW50IGk7Ci0KLSAgICBnID0gZ2V0Z3JuYW0oKmFyZ3YpOwotICAgIGlmIChnID09IDApIHsKLQlvcHRpb25fZXJyb3IoImdyb3VwICVzIGlzIHVua25vd24iLCAqYXJndik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyArK2kpIHsKLQlpZiAoZ3JvdXBzW2ldID09IGctPmdyX2dpZCkgewotCSAgICBwcml2aWxlZ2VkID0gMTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotCi0vKgotICogc2V0X25vYXV0aF9hZGRyIC0gc2V0IGFkZHJlc3MoZXMpIHRoYXQgY2FuIGJlIHVzZWQgd2l0aG91dCBhdXRoZW50aWNhdGlvbi4KLSAqIEVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZyBhbiBlbnRyeSBsaWtlIGAiIiAqICIiIGFkZHInIGluIHBhcC1zZWNyZXRzLgotICovCi1zdGF0aWMgaW50Ci1zZXRfbm9hdXRoX2FkZHIoYXJndikKLSAgICBjaGFyICoqYXJndjsKLXsKLSAgICBjaGFyICphZGRyID0gKmFyZ3Y7Ci0gICAgaW50IGwgPSBzdHJsZW4oYWRkcikgKyAxOwotICAgIHN0cnVjdCB3b3JkbGlzdCAqd3A7Ci0KLSAgICB3cCA9IChzdHJ1Y3Qgd29yZGxpc3QgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3Qgd29yZGxpc3QpICsgbCk7Ci0gICAgaWYgKHdwID09IE5VTEwpCi0Jbm92bSgiYWxsb3ctaXAgYXJndW1lbnQiKTsKLSAgICB3cC0+d29yZCA9IChjaGFyICopICh3cCArIDEpOwotICAgIHdwLT5uZXh0ID0gbm9hdXRoX2FkZHJzOwotICAgIEJDT1BZKGFkZHIsIHdwLT53b3JkLCBsKTsKLSAgICBub2F1dGhfYWRkcnMgPSB3cDsKLSAgICByZXR1cm4gMTsKLX0KLQotCi0vKgotICogc2V0X3Blcm1pdHRlZF9udW1iZXIgLSBzZXQgcmVtb3RlIHRlbGVwaG9uZSBudW1iZXIocykgdGhhdCBtYXkgY29ubmVjdC4KLSAqLwotc3RhdGljIGludAotc2V0X3Blcm1pdHRlZF9udW1iZXIoYXJndikKLSAgICBjaGFyICoqYXJndjsKLXsKLSAgICBjaGFyICpudW1iZXIgPSAqYXJndjsKLSAgICBpbnQgbCA9IHN0cmxlbihudW1iZXIpICsgMTsKLSAgICBzdHJ1Y3Qgd29yZGxpc3QgKndwOwotCi0gICAgd3AgPSAoc3RydWN0IHdvcmRsaXN0ICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IHdvcmRsaXN0KSArIGwpOwotICAgIGlmICh3cCA9PSBOVUxMKQotCW5vdm0oImFsbG93LW51bWJlciBhcmd1bWVudCIpOwotICAgIHdwLT53b3JkID0gKGNoYXIgKikgKHdwICsgMSk7Ci0gICAgd3AtPm5leHQgPSBwZXJtaXR0ZWRfbnVtYmVyczsKLSAgICBCQ09QWShudW1iZXIsIHdwLT53b3JkLCBsKTsKLSAgICBwZXJtaXR0ZWRfbnVtYmVycyA9IHdwOwotICAgIHJldHVybiAxOwotfQotCi0KLS8qCi0gKiBBbiBPcGVuIG9uIExDUCBoYXMgcmVxdWVzdGVkIGEgY2hhbmdlIGZyb20gRGVhZCB0byBFc3RhYmxpc2ggcGhhc2UuCi0gKi8KLXZvaWQKLWxpbmtfcmVxdWlyZWQodW5pdCkKLSAgICBpbnQgdW5pdDsKLXsKLX0KLQotLyoKLSAqIEJyaW5nIHRoZSBsaW5rIHVwIHRvIHRoZSBwb2ludCBvZiBiZWluZyBhYmxlIHRvIGRvIHBwcC4KLSAqLwotdm9pZCBzdGFydF9saW5rKHVuaXQpCi0gICAgaW50IHVuaXQ7Ci17Ci0gICAgc3RhdHVzID0gRVhJVF9DT05ORUNUX0ZBSUxFRDsKLSAgICBuZXdfcGhhc2UoUEhBU0VfU0VSSUFMQ09OTik7Ci0KLSAgICBodW5ndXAgPSAwOwotICAgIGRldmZkID0gdGhlX2NoYW5uZWwtPmNvbm5lY3QoKTsKLSAgICBpZiAoZGV2ZmQgPCAwKQotCWdvdG8gZmFpbDsKLQotICAgIC8qIHNldCB1cCB0aGUgc2VyaWFsIGRldmljZSBhcyBhIHBwcCBpbnRlcmZhY2UgKi8KLSAgICAvKgotICAgICAqIE4uQi4gd2UgdXNlZCB0byBkbyB0ZGJfd3JpdGVsb2NrL3RkYl93cml0ZXVubG9jayBhcm91bmQgdGhpcwotICAgICAqIChmcm9tIGVzdGFibGlzaF9wcHAgdG8gc2V0X2lmdW5pdCkuICBIb3dldmVyLCB3ZSB3b24ndCBiZQotICAgICAqIGRvaW5nIHRoZSBzZXRfaWZ1bml0IGluIG11bHRpbGluayBtb2RlLCB3aGljaCBpcyB0aGUgb25seSB0aW1lCi0gICAgICogd2UgbmVlZCB0aGUgYXRvbWljaXR5IHRoYXQgdGhlIHRkYl93cml0ZWxvY2svdGRiX3dyaXRldW5sb2NrCi0gICAgICogZ2l2ZXMgdXMuICBUaHVzIHdlIGRvbid0IG5lZWQgdGhlIHRkYl93cml0ZWxvY2svdGRiX3dyaXRldW5sb2NrLgotICAgICAqLwotICAgIGZkX3BwcCA9IHRoZV9jaGFubmVsLT5lc3RhYmxpc2hfcHBwKGRldmZkKTsKLSAgICBpZiAoZmRfcHBwIDwgMCkgewotCXN0YXR1cyA9IEVYSVRfRkFUQUxfRVJST1I7Ci0JZ290byBkaXNjb25uZWN0OwotICAgIH0KLQotICAgIGlmICghZGVtYW5kICYmIGlmdW5pdCA+PSAwKQotCXNldF9pZnVuaXQoMSk7Ci0KLSAgICAvKgotICAgICAqIFN0YXJ0IG9wZW5pbmcgdGhlIGNvbm5lY3Rpb24gYW5kIHdhaXQgZm9yCi0gICAgICogaW5jb21pbmcgZXZlbnRzIChyZXBseSwgdGltZW91dCwgZXRjLikuCi0gICAgICovCi0gICAgaWYgKGlmdW5pdCA+PSAwKQotCW5vdGljZSgiQ29ubmVjdDogJXMgPC0tPiAlcyIsIGlmbmFtZSwgcHBwX2Rldm5hbSk7Ci0gICAgZWxzZQotCW5vdGljZSgiU3RhcnRpbmcgbmVnb3RpYXRpb24gb24gJXMiLCBwcHBfZGV2bmFtKTsKLSAgICBhZGRfZmQoZmRfcHBwKTsKLQotICAgIHN0YXR1cyA9IEVYSVRfTkVHT1RJQVRJT05fRkFJTEVEOwotICAgIG5ld19waGFzZShQSEFTRV9FU1RBQkxJU0gpOwotCi0gICAgbGNwX2xvd2VydXAoMCk7Ci0gICAgcmV0dXJuOwotCi0gZGlzY29ubmVjdDoKLSAgICBuZXdfcGhhc2UoUEhBU0VfRElTQ09OTkVDVCk7Ci0gICAgaWYgKHRoZV9jaGFubmVsLT5kaXNjb25uZWN0KQotCXRoZV9jaGFubmVsLT5kaXNjb25uZWN0KCk7Ci0KLSBmYWlsOgotICAgIG5ld19waGFzZShQSEFTRV9ERUFEKTsKLSAgICBpZiAodGhlX2NoYW5uZWwtPmNsZWFudXApCi0JKCp0aGVfY2hhbm5lbC0+Y2xlYW51cCkoKTsKLX0KLQotLyoKLSAqIExDUCBoYXMgdGVybWluYXRlZCB0aGUgbGluazsgZ28gdG8gdGhlIERlYWQgcGhhc2UgYW5kIHRha2UgdGhlCi0gKiBwaHlzaWNhbCBsYXllciBkb3duLgotICovCi12b2lkCi1saW5rX3Rlcm1pbmF0ZWQodW5pdCkKLSAgICBpbnQgdW5pdDsKLXsKLSAgICBpZiAocGhhc2UgPT0gUEhBU0VfREVBRCB8fCBwaGFzZSA9PSBQSEFTRV9NQVNURVIpCi0JcmV0dXJuOwotICAgIG5ld19waGFzZShQSEFTRV9ESVNDT05ORUNUKTsKLQotICAgIGlmIChwYXBfbG9nb3V0X2hvb2spIHsKLQlwYXBfbG9nb3V0X2hvb2soKTsKLSAgICB9Ci0gICAgc2Vzc2lvbl9lbmQoZGV2bmFtKTsKLQotICAgIGlmICghZG9pbmdfbXVsdGlsaW5rKSB7Ci0Jbm90aWNlKCJDb25uZWN0aW9uIHRlcm1pbmF0ZWQuIik7Ci0JcHJpbnRfbGlua19zdGF0cygpOwotICAgIH0gZWxzZQotCW5vdGljZSgiTGluayB0ZXJtaW5hdGVkLiIpOwotCi0gICAgLyoKLSAgICAgKiBEZWxldGUgcGlkIGZpbGVzIGJlZm9yZSBkaXNlc3RhYmxpc2hpbmcgcHBwLiAgT3RoZXJ3aXNlIGl0Ci0gICAgICogY2FuIGhhcHBlbiB0aGF0IGFub3RoZXIgcHBwZCBnZXRzIHRoZSBzYW1lIHVuaXQgYW5kIHRoZW4KLSAgICAgKiB3ZSBkZWxldGUgaXRzIHBpZCBmaWxlLgotICAgICAqLwotICAgIGlmICghZG9pbmdfbXVsdGlsaW5rICYmICFkZW1hbmQpCi0JcmVtb3ZlX3BpZGZpbGVzKCk7Ci0KLSAgICAvKgotICAgICAqIElmIHdlIG1heSB3YW50IHRvIGJyaW5nIHRoZSBsaW5rIHVwIGFnYWluLCB0cmFuc2ZlcgotICAgICAqIHRoZSBwcHAgdW5pdCBiYWNrIHRvIHRoZSBsb29wYmFjay4gIFNldCB0aGUKLSAgICAgKiByZWFsIHNlcmlhbCBkZXZpY2UgYmFjayB0byBpdHMgbm9ybWFsIG1vZGUgb2Ygb3BlcmF0aW9uLgotICAgICAqLwotICAgIGlmIChmZF9wcHAgPj0gMCkgewotCXJlbW92ZV9mZChmZF9wcHApOwotCWNsZWFuX2NoZWNrKCk7Ci0JdGhlX2NoYW5uZWwtPmRpc2VzdGFibGlzaF9wcHAoZGV2ZmQpOwotCWlmIChkb2luZ19tdWx0aWxpbmspCi0JICAgIG1wX2V4aXRfYnVuZGxlKCk7Ci0JZmRfcHBwID0gLTE7Ci0gICAgfQotICAgIGlmICghaHVuZ3VwKQotCWxjcF9sb3dlcmRvd24oMCk7Ci0gICAgaWYgKCFkb2luZ19tdWx0aWxpbmsgJiYgIWRlbWFuZCkKLQlzY3JpcHRfdW5zZXRlbnYoIklGTkFNRSIpOwotCi0gICAgLyoKLSAgICAgKiBSdW4gZGlzY29ubmVjdG9yIHNjcmlwdCwgaWYgcmVxdWVzdGVkLgotICAgICAqIFhYWCB3ZSBtYXkgbm90IGJlIGFibGUgdG8gZG8gdGhpcyBpZiB0aGUgbGluZSBoYXMgaHVuZyB1cCEKLSAgICAgKi8KLSAgICBpZiAoZGV2ZmQgPj0gMCAmJiB0aGVfY2hhbm5lbC0+ZGlzY29ubmVjdCkgewotCXRoZV9jaGFubmVsLT5kaXNjb25uZWN0KCk7Ci0JZGV2ZmQgPSAtMTsKLSAgICB9Ci0gICAgaWYgKHRoZV9jaGFubmVsLT5jbGVhbnVwKQotCSgqdGhlX2NoYW5uZWwtPmNsZWFudXApKCk7Ci0KLSAgICBpZiAoZG9pbmdfbXVsdGlsaW5rICYmIG11bHRpbGlua19tYXN0ZXIpIHsKLQlpZiAoIWJ1bmRsZV90ZXJtaW5hdGluZykgewotCSAgICBuZXdfcGhhc2UoUEhBU0VfTUFTVEVSKTsKLQkgICAgaWYgKG1hc3Rlcl9kZXRhY2ggJiYgIWRldGFjaGVkKQotCQlkZXRhY2goKTsKLQl9IGVsc2UKLQkgICAgbXBfYnVuZGxlX3Rlcm1pbmF0ZWQoKTsKLSAgICB9IGVsc2UKLQluZXdfcGhhc2UoUEhBU0VfREVBRCk7Ci19Ci0KLS8qCi0gKiBMQ1AgaGFzIGdvbmUgZG93bjsgaXQgd2lsbCBlaXRoZXIgZGllIG9yIHRyeSB0byByZS1lc3RhYmxpc2guCi0gKi8KLXZvaWQKLWxpbmtfZG93bih1bml0KQotICAgIGludCB1bml0OwotewotICAgIGlmIChhdXRoX3N0YXRlICE9IHNfZG93bikgewotCW5vdGlmeShsaW5rX2Rvd25fbm90aWZpZXIsIDApOwotCWF1dGhfc3RhdGUgPSBzX2Rvd247Ci0JaWYgKGF1dGhfc2NyaXB0X3N0YXRlID09IHNfdXAgJiYgYXV0aF9zY3JpcHRfcGlkID09IDApIHsKLQkgICAgdXBkYXRlX2xpbmtfc3RhdHModW5pdCk7Ci0JICAgIGF1dGhfc2NyaXB0X3N0YXRlID0gc19kb3duOwotCSAgICBhdXRoX3NjcmlwdChfUEFUSF9BVVRIRE9XTik7Ci0JfQotICAgIH0KLSAgICBpZiAoIWRvaW5nX211bHRpbGluaykgewotCXVwcGVyX2xheWVyc19kb3duKHVuaXQpOwotCWlmIChwaGFzZSAhPSBQSEFTRV9ERUFEICYmIHBoYXNlICE9IFBIQVNFX01BU1RFUikKLQkgICAgbmV3X3BoYXNlKFBIQVNFX0VTVEFCTElTSCk7Ci0gICAgfQotICAgIC8qIFhYWCBpZiBkb2luZ19tdWx0aWxpbmssIHNob3VsZCBkbyBzb21ldGhpbmcgdG8gc3RvcAotICAgICAgIG5ldHdvcmstbGF5ZXIgdHJhZmZpYyBvbiB0aGUgbGluayAqLwotfQotCi12b2lkIHVwcGVyX2xheWVyc19kb3duKGludCB1bml0KQotewotICAgIGludCBpOwotICAgIHN0cnVjdCBwcm90ZW50ICpwcm90cDsKLQotICAgIGZvciAoaSA9IDA7IChwcm90cCA9IHByb3RvY29sc1tpXSkgIT0gTlVMTDsgKytpKSB7Ci0JaWYgKCFwcm90cC0+ZW5hYmxlZF9mbGFnKQotCSAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKHByb3RwLT5wcm90b2NvbCAhPSBQUFBfTENQICYmIHByb3RwLT5sb3dlcmRvd24gIT0gTlVMTCkKLQkgICAgKCpwcm90cC0+bG93ZXJkb3duKSh1bml0KTsKLSAgICAgICAgaWYgKHByb3RwLT5wcm90b2NvbCA8IDB4QzAwMCAmJiBwcm90cC0+Y2xvc2UgIT0gTlVMTCkKLQkgICAgKCpwcm90cC0+Y2xvc2UpKHVuaXQsICJMQ1AgZG93biIpOwotICAgIH0KLSAgICBudW1fbnBfb3BlbiA9IDA7Ci0gICAgbnVtX25wX3VwID0gMDsKLX0KLQotLyoKLSAqIFRoZSBsaW5rIGlzIGVzdGFibGlzaGVkLgotICogUHJvY2VlZCB0byB0aGUgRGVhZCwgQXV0aGVudGljYXRlIG9yIE5ldHdvcmsgcGhhc2UgYXMgYXBwcm9wcmlhdGUuCi0gKi8KLXZvaWQKLWxpbmtfZXN0YWJsaXNoZWQodW5pdCkKLSAgICBpbnQgdW5pdDsKLXsKLSAgICBpbnQgYXV0aDsKLSAgICBsY3Bfb3B0aW9ucyAqd28gPSAmbGNwX3dhbnRvcHRpb25zW3VuaXRdOwotICAgIGxjcF9vcHRpb25zICpnbyA9ICZsY3BfZ290b3B0aW9uc1t1bml0XTsKLSAgICBsY3Bfb3B0aW9ucyAqaG8gPSAmbGNwX2hpc29wdGlvbnNbdW5pdF07Ci0gICAgaW50IGk7Ci0gICAgc3RydWN0IHByb3RlbnQgKnByb3RwOwotCi0gICAgLyoKLSAgICAgKiBUZWxsIGhpZ2hlci1sZXZlbCBwcm90b2NvbHMgdGhhdCBMQ1AgaXMgdXAuCi0gICAgICovCi0gICAgaWYgKCFkb2luZ19tdWx0aWxpbmspIHsKLQlmb3IgKGkgPSAwOyAocHJvdHAgPSBwcm90b2NvbHNbaV0pICE9IE5VTEw7ICsraSkKLQkgICAgaWYgKHByb3RwLT5wcm90b2NvbCAhPSBQUFBfTENQICYmIHByb3RwLT5lbmFibGVkX2ZsYWcKLQkJJiYgcHJvdHAtPmxvd2VydXAgIT0gTlVMTCkKLQkJKCpwcm90cC0+bG93ZXJ1cCkodW5pdCk7Ci0gICAgfQotCi0gICAgaWYgKCFhdXRoX3JlcXVpcmVkICYmIG5vYXV0aF9hZGRycyAhPSBOVUxMKQotCXNldF9hbGxvd2VkX2FkZHJzKHVuaXQsIE5VTEwsIE5VTEwpOwotCi0gICAgaWYgKGF1dGhfcmVxdWlyZWQgJiYgIShnby0+bmVnX3VwYXAgfHwgZ28tPm5lZ19jaGFwIHx8IGdvLT5uZWdfZWFwKSkgewotCS8qCi0JICogV2Ugd2FudGVkIHRoZSBwZWVyIHRvIGF1dGhlbnRpY2F0ZSBpdHNlbGYsIGFuZCBpdCByZWZ1c2VkOgotCSAqIGlmIHdlIGhhdmUgc29tZSBhZGRyZXNzKGVzKSBpdCBjYW4gdXNlIHdpdGhvdXQgYXV0aCwgZmluZSwKLQkgKiBvdGhlcndpc2UgdHJlYXQgaXQgYXMgdGhvdWdoIGl0IGF1dGhlbnRpY2F0ZWQgd2l0aCBQQVAgdXNpbmcKLQkgKiBhIHVzZXJuYW1lIG9mICIiIGFuZCBhIHBhc3N3b3JkIG9mICIiLiAgSWYgdGhhdCdzIG5vdCBPSywKLQkgKiBib290IGl0IG91dC4KLQkgKi8KLQlpZiAobm9hdXRoX2FkZHJzICE9IE5VTEwpIHsKLQkgICAgc2V0X2FsbG93ZWRfYWRkcnModW5pdCwgTlVMTCwgTlVMTCk7Ci0JfSBlbHNlIGlmICghd28tPm5lZ191cGFwIHx8IHVzZWxvZ2luIHx8ICFudWxsX2xvZ2luKHVuaXQpKSB7Ci0JICAgIHdhcm4oInBlZXIgcmVmdXNlZCB0byBhdXRoZW50aWNhdGU6IHRlcm1pbmF0aW5nIGxpbmsiKTsKLQkgICAgc3RhdHVzID0gRVhJVF9QRUVSX0FVVEhfRkFJTEVEOwotCSAgICBsY3BfY2xvc2UodW5pdCwgInBlZXIgcmVmdXNlZCB0byBhdXRoZW50aWNhdGUiKTsKLQkgICAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgICBuZXdfcGhhc2UoUEhBU0VfQVVUSEVOVElDQVRFKTsKLSAgICBhdXRoID0gMDsKLSAgICBpZiAoZ28tPm5lZ19lYXApIHsKLQllYXBfYXV0aHBlZXIodW5pdCwgb3VyX25hbWUpOwotCWF1dGggfD0gRUFQX1BFRVI7Ci0gICAgfSBlbHNlIGlmIChnby0+bmVnX2NoYXApIHsKLQljaGFwX2F1dGhfcGVlcih1bml0LCBvdXJfbmFtZSwgQ0hBUF9ESUdFU1QoZ28tPmNoYXBfbWR0eXBlKSk7Ci0JYXV0aCB8PSBDSEFQX1BFRVI7Ci0gICAgfSBlbHNlIGlmIChnby0+bmVnX3VwYXApIHsKLQl1cGFwX2F1dGhwZWVyKHVuaXQpOwotCWF1dGggfD0gUEFQX1BFRVI7Ci0gICAgfQotICAgIGlmIChoby0+bmVnX2VhcCkgewotCWVhcF9hdXRod2l0aHBlZXIodW5pdCwgdXNlcik7Ci0JYXV0aCB8PSBFQVBfV0lUSFBFRVI7Ci0gICAgfSBlbHNlIGlmIChoby0+bmVnX2NoYXApIHsKLQljaGFwX2F1dGhfd2l0aF9wZWVyKHVuaXQsIHVzZXIsIENIQVBfRElHRVNUKGhvLT5jaGFwX21kdHlwZSkpOwotCWF1dGggfD0gQ0hBUF9XSVRIUEVFUjsKLSAgICB9IGVsc2UgaWYgKGhvLT5uZWdfdXBhcCkgewotCS8qIElmIGEgYmxhbmsgcGFzc3dvcmQgd2FzIGV4cGxpY2l0bHkgZ2l2ZW4gYXMgYW4gb3B0aW9uLCB0cnVzdAotCSAgIHRoZSB1c2VyIGFuZCBkb24ndCB0cnkgdG8gbG9vayB1cCBvbmUuICovCi0JaWYgKHBhc3N3ZFswXSA9PSAwICYmICFleHBsaWNpdF9wYXNzd2QpIHsKLQkgICAgcGFzc3dkX2Zyb21fZmlsZSA9IDE7Ci0JICAgIGlmICghZ2V0X3BhcF9wYXNzd2QocGFzc3dkKSkKLQkJZXJyb3IoIk5vIHNlY3JldCBmb3VuZCBmb3IgUEFQIGxvZ2luIik7Ci0JfQotCXVwYXBfYXV0aHdpdGhwZWVyKHVuaXQsIHVzZXIsIHBhc3N3ZCk7Ci0JYXV0aCB8PSBQQVBfV0lUSFBFRVI7Ci0gICAgfQotICAgIGF1dGhfcGVuZGluZ1t1bml0XSA9IGF1dGg7Ci0gICAgYXV0aF9kb25lW3VuaXRdID0gMDsKLQotICAgIGlmICghYXV0aCkKLQluZXR3b3JrX3BoYXNlKHVuaXQpOwotfQotCi0vKgotICogUHJvY2VlZCB0byB0aGUgbmV0d29yayBwaGFzZS4KLSAqLwotc3RhdGljIHZvaWQKLW5ldHdvcmtfcGhhc2UodW5pdCkKLSAgICBpbnQgdW5pdDsKLXsKLSAgICBsY3Bfb3B0aW9ucyAqZ28gPSAmbGNwX2dvdG9wdGlvbnNbdW5pdF07Ci0KLSAgICAvKiBMb2cgY2FsbGluZyBudW1iZXIuICovCi0gICAgaWYgKCpyZW1vdGVfbnVtYmVyKQotCW5vdGljZSgicGVlciBmcm9tIGNhbGxpbmcgbnVtYmVyICVxIGF1dGhvcml6ZWQiLCByZW1vdGVfbnVtYmVyKTsKLQotICAgIC8qCi0gICAgICogSWYgdGhlIHBlZXIgaGFkIHRvIGF1dGhlbnRpY2F0ZSwgcnVuIHRoZSBhdXRoLXVwIHNjcmlwdCBub3cuCi0gICAgICovCi0gICAgaWYgKGdvLT5uZWdfY2hhcCB8fCBnby0+bmVnX3VwYXAgfHwgZ28tPm5lZ19lYXApIHsKLQlub3RpZnkoYXV0aF91cF9ub3RpZmllciwgMCk7Ci0JYXV0aF9zdGF0ZSA9IHNfdXA7Ci0JaWYgKGF1dGhfc2NyaXB0X3N0YXRlID09IHNfZG93biAmJiBhdXRoX3NjcmlwdF9waWQgPT0gMCkgewotCSAgICBhdXRoX3NjcmlwdF9zdGF0ZSA9IHNfdXA7Ci0JICAgIGF1dGhfc2NyaXB0KF9QQVRIX0FVVEhVUCk7Ci0JfQotICAgIH0KLQotI2lmZGVmIENCQ1BfU1VQUE9SVAotICAgIC8qCi0gICAgICogSWYgd2UgbmVnb3RpYXRlZCBjYWxsYmFjaywgZG8gaXQgbm93LgotICAgICAqLwotICAgIGlmIChnby0+bmVnX2NiY3ApIHsKLQluZXdfcGhhc2UoUEhBU0VfQ0FMTEJBQ0spOwotCSgqY2JjcF9wcm90ZW50Lm9wZW4pKHVuaXQpOwotCXJldHVybjsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8qCi0gICAgICogUHJvY2VzcyBleHRyYSBvcHRpb25zIGZyb20gdGhlIHNlY3JldHMgZmlsZQotICAgICAqLwotICAgIGlmIChleHRyYV9vcHRpb25zKSB7Ci0Jb3B0aW9uc19mcm9tX2xpc3QoZXh0cmFfb3B0aW9ucywgMSk7Ci0JZnJlZV93b3JkbGlzdChleHRyYV9vcHRpb25zKTsKLQlleHRyYV9vcHRpb25zID0gMDsKLSAgICB9Ci0gICAgc3RhcnRfbmV0d29ya3ModW5pdCk7Ci19Ci0KLXZvaWQKLXN0YXJ0X25ldHdvcmtzKHVuaXQpCi0gICAgaW50IHVuaXQ7Ci17Ci0gICAgaW50IGk7Ci0gICAgc3RydWN0IHByb3RlbnQgKnByb3RwOwotICAgIGludCBlY3BfcmVxdWlyZWQsIG1wcGVfcmVxdWlyZWQ7Ci0KLSAgICBuZXdfcGhhc2UoUEhBU0VfTkVUV09SSyk7Ci0KLSNpZmRlZiBIQVZFX01VTFRJTElOSwotICAgIGlmIChtdWx0aWxpbmspIHsKLQlpZiAobXBfam9pbl9idW5kbGUoKSkgewotCSAgICBpZiAobXVsdGlsaW5rX2pvaW5faG9vaykKLQkJKCptdWx0aWxpbmtfam9pbl9ob29rKSgpOwotCSAgICBpZiAodXBkZXRhY2ggJiYgIW5vZGV0YWNoKQotCQlkZXRhY2goKTsKLQkgICAgcmV0dXJuOwotCX0KLSAgICB9Ci0jZW5kaWYgLyogSEFWRV9NVUxUSUxJTksgKi8KLQotI2lmZGVmIFBQUF9GSUxURVIKLSAgICBpZiAoIWRlbWFuZCkKLQlzZXRfZmlsdGVycygmcGFzc19maWx0ZXIsICZhY3RpdmVfZmlsdGVyKTsKLSNlbmRpZgotICAgIC8qIFN0YXJ0IENDUCBhbmQgRUNQICovCi0gICAgZm9yIChpID0gMDsgKHByb3RwID0gcHJvdG9jb2xzW2ldKSAhPSBOVUxMOyArK2kpCi0JaWYgKChwcm90cC0+cHJvdG9jb2wgPT0gUFBQX0VDUCB8fCBwcm90cC0+cHJvdG9jb2wgPT0gUFBQX0NDUCkKLQkgICAgJiYgcHJvdHAtPmVuYWJsZWRfZmxhZyAmJiBwcm90cC0+b3BlbiAhPSBOVUxMKQotCSAgICAoKnByb3RwLT5vcGVuKSgwKTsKLQotICAgIC8qCi0gICAgICogQnJpbmcgdXAgb3RoZXIgbmV0d29yayBwcm90b2NvbHMgaWZmIGVuY3J5cHRpb24gaXMgbm90IHJlcXVpcmVkLgotICAgICAqLwotICAgIGVjcF9yZXF1aXJlZCA9IGVjcF9nb3RvcHRpb25zW3VuaXRdLnJlcXVpcmVkOwotICAgIG1wcGVfcmVxdWlyZWQgPSBjY3BfZ290b3B0aW9uc1t1bml0XS5tcHBlOwotICAgIGlmICghZWNwX3JlcXVpcmVkICYmICFtcHBlX3JlcXVpcmVkKQotCWNvbnRpbnVlX25ldHdvcmtzKHVuaXQpOwotfQotCi12b2lkCi1jb250aW51ZV9uZXR3b3Jrcyh1bml0KQotICAgIGludCB1bml0OwotewotICAgIGludCBpOwotICAgIHN0cnVjdCBwcm90ZW50ICpwcm90cDsKLQotICAgIC8qCi0gICAgICogU3RhcnQgdGhlICJyZWFsIiBuZXR3b3JrIHByb3RvY29scy4KLSAgICAgKi8KLSAgICBmb3IgKGkgPSAwOyAocHJvdHAgPSBwcm90b2NvbHNbaV0pICE9IE5VTEw7ICsraSkKLQlpZiAocHJvdHAtPnByb3RvY29sIDwgMHhDMDAwCi0JICAgICYmIHByb3RwLT5wcm90b2NvbCAhPSBQUFBfQ0NQICYmIHByb3RwLT5wcm90b2NvbCAhPSBQUFBfRUNQCi0JICAgICYmIHByb3RwLT5lbmFibGVkX2ZsYWcgJiYgcHJvdHAtPm9wZW4gIT0gTlVMTCkgewotCSAgICAoKnByb3RwLT5vcGVuKSgwKTsKLQkgICAgKytudW1fbnBfb3BlbjsKLQl9Ci0KLSAgICBpZiAobnVtX25wX29wZW4gPT0gMCkKLQkvKiBub3RoaW5nIHRvIGRvICovCi0JbGNwX2Nsb3NlKDAsICJObyBuZXR3b3JrIHByb3RvY29scyBydW5uaW5nIik7Ci19Ci0KLS8qCi0gKiBUaGUgcGVlciBoYXMgZmFpbGVkIHRvIGF1dGhlbnRpY2F0ZSBoaW1zZWxmIHVzaW5nIGBwcm90b2NvbCcuCi0gKi8KLXZvaWQKLWF1dGhfcGVlcl9mYWlsKHVuaXQsIHByb3RvY29sKQotICAgIGludCB1bml0LCBwcm90b2NvbDsKLXsKLSAgICAvKgotICAgICAqIEF1dGhlbnRpY2F0aW9uIGZhaWx1cmU6IHRha2UgdGhlIGxpbmsgZG93bgotICAgICAqLwotICAgIHN0YXR1cyA9IEVYSVRfUEVFUl9BVVRIX0ZBSUxFRDsKLSAgICBsY3BfY2xvc2UodW5pdCwgIkF1dGhlbnRpY2F0aW9uIGZhaWxlZCIpOwotfQotCi0vKgotICogVGhlIHBlZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQgdXNpbmcgYHByb3RvY29sJy4KLSAqLwotdm9pZAotYXV0aF9wZWVyX3N1Y2Nlc3ModW5pdCwgcHJvdG9jb2wsIHByb3RfZmxhdm9yLCBuYW1lLCBuYW1lbGVuKQotICAgIGludCB1bml0LCBwcm90b2NvbCwgcHJvdF9mbGF2b3I7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBpbnQgbmFtZWxlbjsKLXsKLSAgICBpbnQgYml0OwotCi0gICAgc3dpdGNoIChwcm90b2NvbCkgewotICAgIGNhc2UgUFBQX0NIQVA6Ci0JYml0ID0gQ0hBUF9QRUVSOwotCXN3aXRjaCAocHJvdF9mbGF2b3IpIHsKLQljYXNlIENIQVBfTUQ1OgotCSAgICBiaXQgfD0gQ0hBUF9NRDVfUEVFUjsKLQkgICAgYnJlYWs7Ci0jaWZkZWYgQ0hBUE1TCi0JY2FzZSBDSEFQX01JQ1JPU09GVDoKLQkgICAgYml0IHw9IENIQVBfTVNfUEVFUjsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDSEFQX01JQ1JPU09GVF9WMjoKLQkgICAgYml0IHw9IENIQVBfTVMyX1BFRVI7Ci0JICAgIGJyZWFrOwotI2VuZGlmCi0JfQotCWJyZWFrOwotICAgIGNhc2UgUFBQX1BBUDoKLQliaXQgPSBQQVBfUEVFUjsKLQlicmVhazsKLSAgICBjYXNlIFBQUF9FQVA6Ci0JYml0ID0gRUFQX1BFRVI7Ci0JYnJlYWs7Ci0gICAgZGVmYXVsdDoKLQl3YXJuKCJhdXRoX3BlZXJfc3VjY2VzczogdW5rbm93biBwcm90b2NvbCAleCIsIHByb3RvY29sKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTYXZlIHRoZSBhdXRoZW50aWNhdGVkIG5hbWUgb2YgdGhlIHBlZXIgZm9yIGxhdGVyLgotICAgICAqLwotICAgIGlmIChuYW1lbGVuID4gc2l6ZW9mKHBlZXJfYXV0aG5hbWUpIC0gMSkKLQluYW1lbGVuID0gc2l6ZW9mKHBlZXJfYXV0aG5hbWUpIC0gMTsKLSAgICBCQ09QWShuYW1lLCBwZWVyX2F1dGhuYW1lLCBuYW1lbGVuKTsKLSAgICBwZWVyX2F1dGhuYW1lW25hbWVsZW5dID0gMDsKLSAgICBzY3JpcHRfc2V0ZW52KCJQRUVSTkFNRSIsIHBlZXJfYXV0aG5hbWUsIDApOwotCi0gICAgLyogU2F2ZSB0aGUgYXV0aGVudGljYXRpb24gbWV0aG9kIGZvciBsYXRlci4gKi8KLSAgICBhdXRoX2RvbmVbdW5pdF0gfD0gYml0OwotCi0gICAgLyoKLSAgICAgKiBJZiB0aGVyZSBpcyBubyBtb3JlIGF1dGhlbnRpY2F0aW9uIHN0aWxsIHRvIGJlIGRvbmUsCi0gICAgICogcHJvY2VlZCB0byB0aGUgbmV0d29yayAob3IgY2FsbGJhY2spIHBoYXNlLgotICAgICAqLwotICAgIGlmICgoYXV0aF9wZW5kaW5nW3VuaXRdICY9IH5iaXQpID09IDApCi0gICAgICAgIG5ldHdvcmtfcGhhc2UodW5pdCk7Ci19Ci0KLS8qCi0gKiBXZSBoYXZlIGZhaWxlZCB0byBhdXRoZW50aWNhdGUgb3Vyc2VsdmVzIHRvIHRoZSBwZWVyIHVzaW5nIGBwcm90b2NvbCcuCi0gKi8KLXZvaWQKLWF1dGhfd2l0aHBlZXJfZmFpbCh1bml0LCBwcm90b2NvbCkKLSAgICBpbnQgdW5pdCwgcHJvdG9jb2w7Ci17Ci0gICAgaWYgKHBhc3N3ZF9mcm9tX2ZpbGUpCi0JQlpFUk8ocGFzc3dkLCBNQVhTRUNSRVRMRU4pOwotICAgIC8qCi0gICAgICogV2UndmUgZmFpbGVkIHRvIGF1dGhlbnRpY2F0ZSBvdXJzZWx2ZXMgdG8gb3VyIHBlZXIuCi0gICAgICogU29tZSBzZXJ2ZXJzIGtlZXAgc2VuZGluZyBDSEFQIGNoYWxsZW5nZXMsIGJ1dCB0aGVyZQotICAgICAqIGlzIG5vIHBvaW50IGluIHBlcnNpc3Rpbmcgd2l0aG91dCBhbnkgd2F5IHRvIGdldCB1cGRhdGVkCi0gICAgICogYXV0aGVudGljYXRpb24gc2VjcmV0cy4KLSAgICAgKi8KLSAgICBzdGF0dXMgPSBFWElUX0FVVEhfVE9QRUVSX0ZBSUxFRDsKLSAgICBsY3BfY2xvc2UodW5pdCwgIkZhaWxlZCB0byBhdXRoZW50aWNhdGUgb3Vyc2VsdmVzIHRvIHBlZXIiKTsKLX0KLQotLyoKLSAqIFdlIGhhdmUgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQgb3Vyc2VsdmVzIHdpdGggdGhlIHBlZXIgdXNpbmcgYHByb3RvY29sJy4KLSAqLwotdm9pZAotYXV0aF93aXRocGVlcl9zdWNjZXNzKHVuaXQsIHByb3RvY29sLCBwcm90X2ZsYXZvcikKLSAgICBpbnQgdW5pdCwgcHJvdG9jb2wsIHByb3RfZmxhdm9yOwotewotICAgIGludCBiaXQ7Ci0gICAgY29uc3QgY2hhciAqcHJvdCA9ICIiOwotCi0gICAgc3dpdGNoIChwcm90b2NvbCkgewotICAgIGNhc2UgUFBQX0NIQVA6Ci0JYml0ID0gQ0hBUF9XSVRIUEVFUjsKLQlwcm90ID0gIkNIQVAiOwotCXN3aXRjaCAocHJvdF9mbGF2b3IpIHsKLQljYXNlIENIQVBfTUQ1OgotCSAgICBiaXQgfD0gQ0hBUF9NRDVfV0lUSFBFRVI7Ci0JICAgIGJyZWFrOwotI2lmZGVmIENIQVBNUwotCWNhc2UgQ0hBUF9NSUNST1NPRlQ6Ci0JICAgIGJpdCB8PSBDSEFQX01TX1dJVEhQRUVSOwotCSAgICBicmVhazsKLQljYXNlIENIQVBfTUlDUk9TT0ZUX1YyOgotCSAgICBiaXQgfD0gQ0hBUF9NUzJfV0lUSFBFRVI7Ci0JICAgIGJyZWFrOwotI2VuZGlmCi0JfQotCWJyZWFrOwotICAgIGNhc2UgUFBQX1BBUDoKLQlpZiAocGFzc3dkX2Zyb21fZmlsZSkKLQkgICAgQlpFUk8ocGFzc3dkLCBNQVhTRUNSRVRMRU4pOwotCWJpdCA9IFBBUF9XSVRIUEVFUjsKLQlwcm90ID0gIlBBUCI7Ci0JYnJlYWs7Ci0gICAgY2FzZSBQUFBfRUFQOgotCWJpdCA9IEVBUF9XSVRIUEVFUjsKLQlwcm90ID0gIkVBUCI7Ci0JYnJlYWs7Ci0gICAgZGVmYXVsdDoKLQl3YXJuKCJhdXRoX3dpdGhwZWVyX3N1Y2Nlc3M6IHVua25vd24gcHJvdG9jb2wgJXgiLCBwcm90b2NvbCk7Ci0JYml0ID0gMDsKLSAgICB9Ci0KLSAgICBub3RpY2UoIiVzIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRlZCIsIHByb3QpOwotCi0gICAgLyogU2F2ZSB0aGUgYXV0aGVudGljYXRpb24gbWV0aG9kIGZvciBsYXRlci4gKi8KLSAgICBhdXRoX2RvbmVbdW5pdF0gfD0gYml0OwotCi0gICAgLyoKLSAgICAgKiBJZiB0aGVyZSBpcyBubyBtb3JlIGF1dGhlbnRpY2F0aW9uIHN0aWxsIGJlaW5nIGRvbmUsCi0gICAgICogcHJvY2VlZCB0byB0aGUgbmV0d29yayAob3IgY2FsbGJhY2spIHBoYXNlLgotICAgICAqLwotICAgIGlmICgoYXV0aF9wZW5kaW5nW3VuaXRdICY9IH5iaXQpID09IDApCi0JbmV0d29ya19waGFzZSh1bml0KTsKLX0KLQotCi0vKgotICogbnBfdXAgLSBhIG5ldHdvcmsgcHJvdG9jb2wgaGFzIGNvbWUgdXAuCi0gKi8KLXZvaWQKLW5wX3VwKHVuaXQsIHByb3RvKQotICAgIGludCB1bml0LCBwcm90bzsKLXsKLSAgICBpbnQgdGxpbTsKLQotICAgIGlmIChudW1fbnBfdXAgPT0gMCkgewotCS8qCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjb25zaWRlciB0aGF0IHRoZSBsaW5rIGhhcyBjb21lIHVwIHN1Y2Nlc3NmdWxseS4KLQkgKi8KLQlzdGF0dXMgPSBFWElUX09LOwotCXVuc3VjY2VzcyA9IDA7Ci0JbmV3X3BoYXNlKFBIQVNFX1JVTk5JTkcpOwotCi0JaWYgKGlkbGVfdGltZV9ob29rICE9IDApCi0JICAgIHRsaW0gPSAoKmlkbGVfdGltZV9ob29rKShOVUxMKTsKLQllbHNlCi0JICAgIHRsaW0gPSBpZGxlX3RpbWVfbGltaXQ7Ci0JaWYgKHRsaW0gPiAwKQotCSAgICBUSU1FT1VUKGNoZWNrX2lkbGUsIE5VTEwsIHRsaW0pOwotCi0JLyoKLQkgKiBTZXQgYSB0aW1lb3V0IHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uIG9uY2UgdGhlIG1heGltdW0KLQkgKiBjb25uZWN0IHRpbWUgaGFzIGV4cGlyZWQuCi0JICovCi0JaWYgKG1heGNvbm5lY3QgPiAwKQotCSAgICBUSU1FT1VUKGNvbm5lY3RfdGltZV9leHBpcmVkLCAwLCBtYXhjb25uZWN0KTsKLQotI2lmZGVmIE1BWE9DVEVUUwotCWlmIChtYXhvY3RldHMgPiAwKQotCSAgICBUSU1FT1VUKGNoZWNrX21heG9jdGV0cywgTlVMTCwgbWF4b2N0ZXRzX3RpbWVvdXQpOwotI2VuZGlmCi0KLQkvKgotCSAqIERldGFjaCBub3csIGlmIHRoZSB1cGRldGFjaCBvcHRpb24gd2FzIGdpdmVuLgotCSAqLwotCWlmICh1cGRldGFjaCAmJiAhbm9kZXRhY2gpCi0JICAgIGRldGFjaCgpOwotICAgIH0KLSAgICArK251bV9ucF91cDsKLX0KLQotLyoKLSAqIG5wX2Rvd24gLSBhIG5ldHdvcmsgcHJvdG9jb2wgaGFzIGdvbmUgZG93bi4KLSAqLwotdm9pZAotbnBfZG93bih1bml0LCBwcm90bykKLSAgICBpbnQgdW5pdCwgcHJvdG87Ci17Ci0gICAgaWYgKC0tbnVtX25wX3VwID09IDApIHsKLQlVTlRJTUVPVVQoY2hlY2tfaWRsZSwgTlVMTCk7Ci0JVU5USU1FT1VUKGNvbm5lY3RfdGltZV9leHBpcmVkLCBOVUxMKTsKLSNpZmRlZiBNQVhPQ1RFVFMKLQlVTlRJTUVPVVQoY2hlY2tfbWF4b2N0ZXRzLCBOVUxMKTsKLSNlbmRpZgkKLQluZXdfcGhhc2UoUEhBU0VfTkVUV09SSyk7Ci0gICAgfQotfQotCi0vKgotICogbnBfZmluaXNoZWQgLSBhIG5ldHdvcmsgcHJvdG9jb2wgaGFzIGZpbmlzaGVkIHVzaW5nIHRoZSBsaW5rLgotICovCi12b2lkCi1ucF9maW5pc2hlZCh1bml0LCBwcm90bykKLSAgICBpbnQgdW5pdCwgcHJvdG87Ci17Ci0gICAgaWYgKC0tbnVtX25wX29wZW4gPD0gMCkgewotCS8qIG5vIGZ1cnRoZXIgdXNlIGZvciB0aGUgbGluazogc2h1dCB1cCBzaG9wLiAqLwotCWxjcF9jbG9zZSgwLCAiTm8gbmV0d29yayBwcm90b2NvbHMgcnVubmluZyIpOwotICAgIH0KLX0KLQotI2lmZGVmIE1BWE9DVEVUUwotc3RhdGljIHZvaWQKLWNoZWNrX21heG9jdGV0cyhhcmcpCi0gICAgdm9pZCAqYXJnOwotewotICAgIHVuc2lnbmVkIGludCB1c2VkOwotCi0gICAgdXBkYXRlX2xpbmtfc3RhdHMoaWZ1bml0KTsKLSAgICBsaW5rX3N0YXRzX3ZhbGlkPTA7Ci0gICAgCi0gICAgc3dpdGNoKG1heG9jdGV0c19kaXIpIHsKLQljYXNlIFBQUF9PQ1RFVFNfRElSRUNUSU9OX0lOOgotCSAgICB1c2VkID0gbGlua19zdGF0cy5ieXRlc19pbjsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQUFBfT0NURVRTX0RJUkVDVElPTl9PVVQ6Ci0JICAgIHVzZWQgPSBsaW5rX3N0YXRzLmJ5dGVzX291dDsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQUFBfT0NURVRTX0RJUkVDVElPTl9NQVhPVkVSQUw6Ci0JY2FzZSBQUFBfT0NURVRTX0RJUkVDVElPTl9NQVhTRVNTSU9OOgotCSAgICB1c2VkID0gKGxpbmtfc3RhdHMuYnl0ZXNfaW4gPiBsaW5rX3N0YXRzLmJ5dGVzX291dCkgPyBsaW5rX3N0YXRzLmJ5dGVzX2luIDogbGlua19zdGF0cy5ieXRlc19vdXQ7Ci0JICAgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAgIHVzZWQgPSBsaW5rX3N0YXRzLmJ5dGVzX2luK2xpbmtfc3RhdHMuYnl0ZXNfb3V0OwotCSAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKHVzZWQgPiBtYXhvY3RldHMpIHsKLQlub3RpY2UoIlRyYWZmaWMgbGltaXQgcmVhY2hlZC4gTGltaXQ6ICV1IFVzZWQ6ICV1IiwgbWF4b2N0ZXRzLCB1c2VkKTsKLQlzdGF0dXMgPSBFWElUX1RSQUZGSUNfTElNSVQ7Ci0JbGNwX2Nsb3NlKDAsICJUcmFmZmljIGxpbWl0Iik7Ci0JbmVlZF9ob2xkb2ZmID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBUSU1FT1VUKGNoZWNrX21heG9jdGV0cywgTlVMTCwgbWF4b2N0ZXRzX3RpbWVvdXQpOwotICAgIH0KLX0KLSNlbmRpZgotCi0vKgotICogY2hlY2tfaWRsZSAtIGNoZWNrIHdoZXRoZXIgdGhlIGxpbmsgaGFzIGJlZW4gaWRsZSBmb3IgbG9uZwotICogZW5vdWdoIHRoYXQgd2UgY2FuIHNodXQgaXQgZG93bi4KLSAqLwotc3RhdGljIHZvaWQKLWNoZWNrX2lkbGUoYXJnKQotICAgIHZvaWQgKmFyZzsKLXsKLSAgICBzdHJ1Y3QgcHBwX2lkbGUgaWRsZTsKLSAgICB0aW1lX3QgaXRpbWU7Ci0gICAgaW50IHRsaW07Ci0KLSAgICBpZiAoIWdldF9pZGxlX3RpbWUoMCwgJmlkbGUpKQotCXJldHVybjsKLSAgICBpZiAoaWRsZV90aW1lX2hvb2sgIT0gMCkgewotCXRsaW0gPSBpZGxlX3RpbWVfaG9vaygmaWRsZSk7Ci0gICAgfSBlbHNlIHsKLQlpdGltZSA9IE1JTihpZGxlLnhtaXRfaWRsZSwgaWRsZS5yZWN2X2lkbGUpOwotCXRsaW0gPSBpZGxlX3RpbWVfbGltaXQgLSBpdGltZTsKLSAgICB9Ci0gICAgaWYgKHRsaW0gPD0gMCkgewotCS8qIGxpbmsgaXMgaWRsZTogc2h1dCBpdCBkb3duLiAqLwotCW5vdGljZSgiVGVybWluYXRpbmcgY29ubmVjdGlvbiBkdWUgdG8gbGFjayBvZiBhY3Rpdml0eS4iKTsKLQlzdGF0dXMgPSBFWElUX0lETEVfVElNRU9VVDsKLQlsY3BfY2xvc2UoMCwgIkxpbmsgaW5hY3RpdmUiKTsKLQluZWVkX2hvbGRvZmYgPSAwOwotICAgIH0gZWxzZSB7Ci0JVElNRU9VVChjaGVja19pZGxlLCBOVUxMLCB0bGltKTsKLSAgICB9Ci19Ci0KLS8qCi0gKiBjb25uZWN0X3RpbWVfZXhwaXJlZCAtIGxvZyBhIG1lc3NhZ2UgYW5kIGNsb3NlIHRoZSBjb25uZWN0aW9uLgotICovCi1zdGF0aWMgdm9pZAotY29ubmVjdF90aW1lX2V4cGlyZWQoYXJnKQotICAgIHZvaWQgKmFyZzsKLXsKLSAgICBpbmZvKCJDb25uZWN0IHRpbWUgZXhwaXJlZCIpOwotICAgIHN0YXR1cyA9IEVYSVRfQ09OTkVDVF9USU1FOwotICAgIGxjcF9jbG9zZSgwLCAiQ29ubmVjdCB0aW1lIGV4cGlyZWQiKTsJLyogQ2xvc2UgY29ubmVjdGlvbiAqLwotfQotCi0vKgotICogYXV0aF9jaGVja19vcHRpb25zIC0gY2FsbGVkIHRvIGNoZWNrIGF1dGhlbnRpY2F0aW9uIG9wdGlvbnMuCi0gKi8KLXZvaWQKLWF1dGhfY2hlY2tfb3B0aW9ucygpCi17Ci0gICAgbGNwX29wdGlvbnMgKndvID0gJmxjcF93YW50b3B0aW9uc1swXTsKLSAgICBpbnQgY2FuX2F1dGg7Ci0gICAgaW50IGxhY2tzX2lwOwotCi0gICAgLyogRGVmYXVsdCBvdXJfbmFtZSB0byBob3N0bmFtZSwgYW5kIHVzZXIgdG8gb3VyX25hbWUgKi8KLSAgICBpZiAob3VyX25hbWVbMF0gPT0gMCB8fCB1c2Vob3N0bmFtZSkKLQlzdHJsY3B5KG91cl9uYW1lLCBob3N0bmFtZSwgc2l6ZW9mKG91cl9uYW1lKSk7Ci0gICAgLyogSWYgYSBibGFuayB1c2VybmFtZSB3YXMgZXhwbGljaXRseSBnaXZlbiBhcyBhbiBvcHRpb24sIHRydXN0Ci0gICAgICAgdGhlIHVzZXIgYW5kIGRvbid0IHVzZSBvdXJfbmFtZSAqLwotICAgIGlmICh1c2VyWzBdID09IDAgJiYgIWV4cGxpY2l0X3VzZXIpCi0Jc3RybGNweSh1c2VyLCBvdXJfbmFtZSwgc2l6ZW9mKHVzZXIpKTsKLQotICAgIC8qCi0gICAgICogSWYgd2UgaGF2ZSBhIGRlZmF1bHQgcm91dGUsIHJlcXVpcmUgdGhlIHBlZXIgdG8gYXV0aGVudGljYXRlCi0gICAgICogdW5sZXNzIHRoZSBub2F1dGggb3B0aW9uIHdhcyBnaXZlbiBvciB0aGUgcmVhbCB1c2VyIGlzIHJvb3QuCi0gICAgICovCi0gICAgaWYgKCFhdXRoX3JlcXVpcmVkICYmICFhbGxvd19hbnlfaXAgJiYgaGF2ZV9yb3V0ZV90bygwKSAmJiAhcHJpdmlsZWdlZCkgewotCWF1dGhfcmVxdWlyZWQgPSAxOwotCWRlZmF1bHRfYXV0aCA9IDE7Ci0gICAgfQotCi0gICAgLyogSWYgd2Ugc2VsZWN0ZWQgYW55IENIQVAgZmxhdm9ycywgd2Ugc2hvdWxkIHByb2JhYmx5IG5lZ290aWF0ZSBpdC4gOi0pICovCi0gICAgaWYgKHdvLT5jaGFwX21kdHlwZSkKLQl3by0+bmVnX2NoYXAgPSAxOwotCi0gICAgLyogSWYgYXV0aGVudGljYXRpb24gaXMgcmVxdWlyZWQsIGFzayBwZWVyIGZvciBDSEFQLCBQQVAsIG9yIEVBUC4gKi8KLSAgICBpZiAoYXV0aF9yZXF1aXJlZCkgewotCWFsbG93X2FueV9pcCA9IDA7Ci0JaWYgKCF3by0+bmVnX2NoYXAgJiYgIXdvLT5uZWdfdXBhcCAmJiAhd28tPm5lZ19lYXApIHsKLQkgICAgd28tPm5lZ19jaGFwID0gY2hhcF9tZHR5cGVfYWxsICE9IE1EVFlQRV9OT05FOwotCSAgICB3by0+Y2hhcF9tZHR5cGUgPSBjaGFwX21kdHlwZV9hbGw7Ci0JICAgIHdvLT5uZWdfdXBhcCA9IDE7Ci0JICAgIHdvLT5uZWdfZWFwID0gMTsKLQl9Ci0gICAgfSBlbHNlIHsKLQl3by0+bmVnX2NoYXAgPSAwOwotCXdvLT5jaGFwX21kdHlwZSA9IE1EVFlQRV9OT05FOwotCXdvLT5uZWdfdXBhcCA9IDA7Ci0Jd28tPm5lZ19lYXAgPSAwOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIGFwcHJvcHJpYXRlIHNlY3JldHMgdG8gdXNlCi0gICAgICogdG8gYXV0aGVudGljYXRlIHRoZSBwZWVyLiAgTm90ZSB0aGF0IEVBUCBjYW4gYXV0aGVudGljYXRlIGJ5IHdheQotICAgICAqIG9mIGEgQ0hBUC1saWtlIGV4Y2hhbmdlcyBhcyB3ZWxsIGFzIFNSUC4KLSAgICAgKi8KLSAgICBsYWNrc19pcCA9IDA7Ci0gICAgY2FuX2F1dGggPSB3by0+bmVnX3VwYXAgJiYgKHVzZWxvZ2luIHx8IGhhdmVfcGFwX3NlY3JldCgmbGFja3NfaXApKTsKLSAgICBpZiAoIWNhbl9hdXRoICYmICh3by0+bmVnX2NoYXAgfHwgd28tPm5lZ19lYXApKSB7Ci0JY2FuX2F1dGggPSBoYXZlX2NoYXBfc2VjcmV0KChleHBsaWNpdF9yZW1vdGU/IHJlbW90ZV9uYW1lOiBOVUxMKSwKLQkJCQkgICAgb3VyX25hbWUsIDEsICZsYWNrc19pcCk7Ci0gICAgfQotICAgIGlmICghY2FuX2F1dGggJiYgd28tPm5lZ19lYXApIHsKLQljYW5fYXV0aCA9IGhhdmVfc3JwX3NlY3JldCgoZXhwbGljaXRfcmVtb3RlPyByZW1vdGVfbmFtZTogTlVMTCksCi0JCQkJICAgIG91cl9uYW1lLCAxLCAmbGFja3NfaXApOwotICAgIH0KLQotICAgIGlmIChhdXRoX3JlcXVpcmVkICYmICFjYW5fYXV0aCAmJiBub2F1dGhfYWRkcnMgPT0gTlVMTCkgewotCWlmIChkZWZhdWx0X2F1dGgpIHsKLQkgICAgb3B0aW9uX2Vycm9yKAotIkJ5IGRlZmF1bHQgdGhlIHJlbW90ZSBzeXN0ZW0gaXMgcmVxdWlyZWQgdG8gYXV0aGVudGljYXRlIGl0c2VsZiIpOwotCSAgICBvcHRpb25fZXJyb3IoCi0iKGJlY2F1c2UgdGhpcyBzeXN0ZW0gaGFzIGEgZGVmYXVsdCByb3V0ZSB0byB0aGUgaW50ZXJuZXQpIik7Ci0JfSBlbHNlIGlmIChleHBsaWNpdF9yZW1vdGUpCi0JICAgIG9wdGlvbl9lcnJvcigKLSJUaGUgcmVtb3RlIHN5c3RlbSAoJXMpIGlzIHJlcXVpcmVkIHRvIGF1dGhlbnRpY2F0ZSBpdHNlbGYiLAotCQkJIHJlbW90ZV9uYW1lKTsKLQllbHNlCi0JICAgIG9wdGlvbl9lcnJvcigKLSJUaGUgcmVtb3RlIHN5c3RlbSBpcyByZXF1aXJlZCB0byBhdXRoZW50aWNhdGUgaXRzZWxmIik7Ci0Jb3B0aW9uX2Vycm9yKAotImJ1dCBJIGNvdWxkbid0IGZpbmQgYW55IHN1aXRhYmxlIHNlY3JldCAocGFzc3dvcmQpIGZvciBpdCB0byB1c2UgdG8gZG8gc28uIik7Ci0JaWYgKGxhY2tzX2lwKQotCSAgICBvcHRpb25fZXJyb3IoCi0iKE5vbmUgb2YgdGhlIGF2YWlsYWJsZSBwYXNzd29yZHMgd291bGQgbGV0IGl0IHVzZSBhbiBJUCBhZGRyZXNzLikiKTsKLQotCWV4aXQoMSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBFYXJseSBjaGVjayBmb3IgcmVtb3RlIG51bWJlciBhdXRob3JpemF0aW9uLgotICAgICAqLwotICAgIGlmICghYXV0aF9udW1iZXIoKSkgewotCXdhcm4oImNhbGxpbmcgbnVtYmVyICVxIGlzIG5vdCBhdXRob3JpemVkIiwgcmVtb3RlX251bWJlcik7Ci0JZXhpdChFWElUX0NOSURfQVVUSF9GQUlMRUQpOwotICAgIH0KLX0KLQotLyoKLSAqIGF1dGhfcmVzZXQgLSBjYWxsZWQgd2hlbiBMQ1AgaXMgc3RhcnRpbmcgbmVnb3RpYXRpb25zIHRvIHJlY2hlY2sKLSAqIGF1dGhlbnRpY2F0aW9uIG9wdGlvbnMsIGkuZS4gd2hldGhlciB3ZSBoYXZlIGFwcHJvcHJpYXRlIHNlY3JldHMKLSAqIHRvIHVzZSBmb3IgYXV0aGVudGljYXRpbmcgb3Vyc2VsdmVzIGFuZC9vciB0aGUgcGVlci4KLSAqLwotdm9pZAotYXV0aF9yZXNldCh1bml0KQotICAgIGludCB1bml0OwotewotICAgIGxjcF9vcHRpb25zICpnbyA9ICZsY3BfZ290b3B0aW9uc1t1bml0XTsKLSAgICBsY3Bfb3B0aW9ucyAqYW8gPSAmbGNwX2FsbG93b3B0aW9uc1t1bml0XTsKLSAgICBpbnQgaGFkY2hhcDsKLQotICAgIGhhZGNoYXAgPSAtMTsKLSAgICBhby0+bmVnX3VwYXAgPSAhcmVmdXNlX3BhcCAmJiAocGFzc3dkWzBdICE9IDAgfHwgZ2V0X3BhcF9wYXNzd2QoTlVMTCkpOwotICAgIGFvLT5uZWdfY2hhcCA9ICghcmVmdXNlX2NoYXAgfHwgIXJlZnVzZV9tc2NoYXAgfHwgIXJlZnVzZV9tc2NoYXBfdjIpCi0JJiYgKHBhc3N3ZFswXSAhPSAwIHx8Ci0JICAgIChoYWRjaGFwID0gaGF2ZV9jaGFwX3NlY3JldCh1c2VyLCAoZXhwbGljaXRfcmVtb3RlPyByZW1vdGVfbmFtZToKLQkJCQkJICAgICAgIE5VTEwpLCAwLCBOVUxMKSkpOwotICAgIGFvLT5uZWdfZWFwID0gIXJlZnVzZV9lYXAgJiYgKAotCXBhc3N3ZFswXSAhPSAwIHx8Ci0JKGhhZGNoYXAgPT0gMSB8fCAoaGFkY2hhcCA9PSAtMSAmJiBoYXZlX2NoYXBfc2VjcmV0KHVzZXIsCi0JICAgIChleHBsaWNpdF9yZW1vdGU/IHJlbW90ZV9uYW1lOiBOVUxMKSwgMCwgTlVMTCkpKSB8fAotCWhhdmVfc3JwX3NlY3JldCh1c2VyLCAoZXhwbGljaXRfcmVtb3RlPyByZW1vdGVfbmFtZTogTlVMTCksIDAsIE5VTEwpKTsKLQotICAgIGhhZGNoYXAgPSAtMTsKLSAgICBpZiAoZ28tPm5lZ191cGFwICYmICF1c2Vsb2dpbiAmJiAhaGF2ZV9wYXBfc2VjcmV0KE5VTEwpKQotCWdvLT5uZWdfdXBhcCA9IDA7Ci0gICAgaWYgKGdvLT5uZWdfY2hhcCkgewotCWlmICghKGhhZGNoYXAgPSBoYXZlX2NoYXBfc2VjcmV0KChleHBsaWNpdF9yZW1vdGU/IHJlbW90ZV9uYW1lOiBOVUxMKSwKLQkJCSAgICAgIG91cl9uYW1lLCAxLCBOVUxMKSkpCi0JICAgIGdvLT5uZWdfY2hhcCA9IDA7Ci0gICAgfQotICAgIGlmIChnby0+bmVnX2VhcCAmJgotCShoYWRjaGFwID09IDAgfHwgKGhhZGNoYXAgPT0gLTEgJiYKLQkgICAgIWhhdmVfY2hhcF9zZWNyZXQoKGV4cGxpY2l0X3JlbW90ZT8gcmVtb3RlX25hbWU6IE5VTEwpLCBvdXJfbmFtZSwKLQkJMSwgTlVMTCkpKSAmJgotCSFoYXZlX3NycF9zZWNyZXQoKGV4cGxpY2l0X3JlbW90ZT8gcmVtb3RlX25hbWU6IE5VTEwpLCBvdXJfbmFtZSwgMSwKLQkgICAgTlVMTCkpCi0JZ28tPm5lZ19lYXAgPSAwOwotfQotCi0KLS8qCi0gKiBjaGVja19wYXNzd2QgLSBDaGVjayB0aGUgdXNlciBuYW1lIGFuZCBwYXNzd2QgYWdhaW5zdCB0aGUgUEFQIHNlY3JldHMKLSAqIGZpbGUuICBJZiByZXF1ZXN0ZWQsIGFsc28gY2hlY2sgYWdhaW5zdCB0aGUgc3lzdGVtIHBhc3N3b3JkIGRhdGFiYXNlLAotICogYW5kIGxvZ2luIHRoZSB1c2VyIGlmIE9LLgotICoKLSAqIHJldHVybnM6Ci0gKglVUEFQX0FVVEhOQUs6IEF1dGhlbnRpY2F0aW9uIGZhaWxlZC4KLSAqCVVQQVBfQVVUSEFDSzogQXV0aGVudGljYXRpb24gc3VjY2VlZGVkLgotICogSW4gZWl0aGVyIGNhc2UsIG1zZyBwb2ludHMgdG8gYW4gYXBwcm9wcmlhdGUgbWVzc2FnZS4KLSAqLwotaW50Ci1jaGVja19wYXNzd2QodW5pdCwgYXVzZXIsIHVzZXJsZW4sIGFwYXNzd2QsIHBhc3N3ZGxlbiwgbXNnKQotICAgIGludCB1bml0OwotICAgIGNoYXIgKmF1c2VyOwotICAgIGludCB1c2VybGVuOwotICAgIGNoYXIgKmFwYXNzd2Q7Ci0gICAgaW50IHBhc3N3ZGxlbjsKLSAgICBjaGFyICoqbXNnOwotewotI2lmIGRlZmluZWQoX19BTkRST0lEX18pCi0gICAgcmV0dXJuIFVQQVBfQVVUSE5BSzsKLSNlbHNlCi0gICAgaW50IHJldDsKLSAgICBjaGFyICpmaWxlbmFtZTsKLSAgICBGSUxFICpmOwotICAgIHN0cnVjdCB3b3JkbGlzdCAqYWRkcnMgPSBOVUxMLCAqb3B0cyA9IE5VTEw7Ci0gICAgY2hhciBwYXNzd2RbMjU2XSwgdXNlclsyNTZdOwotICAgIGNoYXIgc2VjcmV0W01BWFdPUkRMRU5dOwotICAgIHN0YXRpYyBpbnQgYXR0ZW1wdHMgPSAwOwotCi0gICAgLyoKLSAgICAgKiBNYWtlIGNvcGllcyBvZiBhcGFzc3dkIGFuZCBhdXNlciwgdGhlbiBudWxsLXRlcm1pbmF0ZSB0aGVtLgotICAgICAqIElmIHRoZXJlIGFyZSB1bnByaW50YWJsZSBjaGFyYWN0ZXJzIGluIHRoZSBwYXNzd29yZCwgbWFrZQotICAgICAqIHRoZW0gdmlzaWJsZS4KLSAgICAgKi8KLSAgICBzbHByaW50ZihwYXNzd2QsIHNpemVvZihwYXNzd2QpLCAiJS4qdiIsIHBhc3N3ZGxlbiwgYXBhc3N3ZCk7Ci0gICAgc2xwcmludGYodXNlciwgc2l6ZW9mKHVzZXIpLCAiJS4qdiIsIHVzZXJsZW4sIGF1c2VyKTsKLSAgICAqbXNnID0gIiI7Ci0KLSAgICAvKgotICAgICAqIENoZWNrIGlmIGEgcGx1Z2luIHdhbnRzIHRvIGhhbmRsZSB0aGlzLgotICAgICAqLwotICAgIGlmIChwYXBfYXV0aF9ob29rKSB7Ci0JcmV0ID0gKCpwYXBfYXV0aF9ob29rKSh1c2VyLCBwYXNzd2QsIG1zZywgJmFkZHJzLCAmb3B0cyk7Ci0JaWYgKHJldCA+PSAwKSB7Ci0JICAgIC8qIG5vdGU6IHNldF9hbGxvd2VkX2FkZHJzKCkgc2F2ZXMgb3B0cyAoYnV0IG5vdCBhZGRycyk6Ci0JICAgICAgIGRvbid0IGZyZWUgaXQhICovCi0JICAgIGlmIChyZXQpCi0JCXNldF9hbGxvd2VkX2FkZHJzKHVuaXQsIGFkZHJzLCBvcHRzKTsKLQkgICAgZWxzZSBpZiAob3B0cyAhPSAwKQotCQlmcmVlX3dvcmRsaXN0KG9wdHMpOwotCSAgICBpZiAoYWRkcnMgIT0gMCkKLQkJZnJlZV93b3JkbGlzdChhZGRycyk7Ci0JICAgIEJaRVJPKHBhc3N3ZCwgc2l6ZW9mKHBhc3N3ZCkpOwotCSAgICByZXR1cm4gcmV0PyBVUEFQX0FVVEhBQ0s6IFVQQVBfQVVUSE5BSzsKLQl9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBPcGVuIHRoZSBmaWxlIG9mIHBhcCBzZWNyZXRzIGFuZCBzY2FuIGZvciBhIHN1aXRhYmxlIHNlY3JldAotICAgICAqIGZvciBhdXRoZW50aWNhdGluZyB0aGlzIHVzZXIuCi0gICAgICovCi0gICAgZmlsZW5hbWUgPSBfUEFUSF9VUEFQRklMRTsKLSAgICBhZGRycyA9IG9wdHMgPSBOVUxMOwotICAgIHJldCA9IFVQQVBfQVVUSE5BSzsKLSAgICBmID0gZm9wZW4oZmlsZW5hbWUsICJyIik7Ci0gICAgaWYgKGYgPT0gTlVMTCkgewotCWVycm9yKCJDYW4ndCBvcGVuIFBBUCBwYXNzd29yZCBmaWxlICVzOiAlbSIsIGZpbGVuYW1lKTsKLQotICAgIH0gZWxzZSB7Ci0JY2hlY2tfYWNjZXNzKGYsIGZpbGVuYW1lKTsKLQlpZiAoc2Nhbl9hdXRoZmlsZShmLCB1c2VyLCBvdXJfbmFtZSwgc2VjcmV0LCAmYWRkcnMsICZvcHRzLCBmaWxlbmFtZSwgMCkgPCAwKSB7Ci0JICAgIHdhcm4oIm5vIFBBUCBzZWNyZXQgZm91bmQgZm9yICVzIiwgdXNlcik7Ci0JfSBlbHNlIHsKLQkgICAgLyoKLQkgICAgICogSWYgdGhlIHNlY3JldCBpcyAiQGxvZ2luIiwgaXQgbWVhbnMgdG8gY2hlY2sKLQkgICAgICogdGhlIHBhc3N3b3JkIGFnYWluc3QgdGhlIGxvZ2luIGRhdGFiYXNlLgotCSAgICAgKi8KLQkgICAgaW50IGxvZ2luX3NlY3JldCA9IHN0cmNtcChzZWNyZXQsICJAbG9naW4iKSA9PSAwOwotCSAgICByZXQgPSBVUEFQX0FVVEhBQ0s7Ci0JICAgIGlmICh1c2Vsb2dpbiB8fCBsb2dpbl9zZWNyZXQpIHsKLQkJLyogbG9naW4gb3B0aW9uIG9yIHNlY3JldCBpcyBAbG9naW4gKi8KLQkJaWYgKHNlc3Npb25fZnVsbCh1c2VyLCBwYXNzd2QsIGRldm5hbSwgbXNnKSA9PSAwKSB7Ci0JCSAgICByZXQgPSBVUEFQX0FVVEhOQUs7Ci0JCX0KLQkgICAgfSBlbHNlIGlmIChzZXNzaW9uX21nbXQpIHsKLQkJaWYgKHNlc3Npb25fY2hlY2sodXNlciwgTlVMTCwgZGV2bmFtLCBOVUxMKSA9PSAwKSB7Ci0JCSAgICB3YXJuKCJQZWVyICVxIGZhaWxlZCBQQVAgU2Vzc2lvbiB2ZXJpZmljYXRpb24iLCB1c2VyKTsKLQkJICAgIHJldCA9IFVQQVBfQVVUSE5BSzsKLQkJfQotCSAgICB9Ci0JICAgIGlmIChzZWNyZXRbMF0gIT0gMCAmJiAhbG9naW5fc2VjcmV0KSB7Ci0JCS8qIHBhc3N3b3JkIGdpdmVuIGluIHBhcC1zZWNyZXRzIC0gbXVzdCBtYXRjaCAqLwotCQlpZiAoY3J5cHRwYXAgfHwgc3RyY21wKHBhc3N3ZCwgc2VjcmV0KSAhPSAwKSB7Ci0JCSAgICBjaGFyICpjYnVmID0gY3J5cHQocGFzc3dkLCBzZWNyZXQpOwotCQkgICAgaWYgKCFjYnVmIHx8IHN0cmNtcChjYnVmLCBzZWNyZXQpICE9IDApCi0JCQlyZXQgPSBVUEFQX0FVVEhOQUs7Ci0JCX0KLQkgICAgfQotCX0KLQlmY2xvc2UoZik7Ci0gICAgfQotCi0gICAgaWYgKHJldCA9PSBVUEFQX0FVVEhOQUspIHsKLSAgICAgICAgaWYgKCoqbXNnID09IDApCi0JICAgICptc2cgPSAiTG9naW4gaW5jb3JyZWN0IjsKLQkvKgotCSAqIFhYWCBjYW4gd2UgZXZlciBnZXQgaGVyZSBtb3JlIHRoYW4gb25jZT8/Ci0JICogRnJ1c3RyYXRlIHBhc3N3ZCBzdGVhbGVyIHByb2dyYW1zLgotCSAqIEFsbG93IDEwIHRyaWVzLCBidXQgc3RhcnQgYmFja2luZyBvZmYgYWZ0ZXIgMyAoc3RvbGVuIGZyb20gbG9naW4pLgotCSAqIE9uIDEwJ3RoLCBkcm9wIHRoZSBjb25uZWN0aW9uLgotCSAqLwotCWlmIChhdHRlbXB0cysrID49IDEwKSB7Ci0JICAgIHdhcm4oIiVkIExPR0lOIEZBSUxVUkVTIE9OICVzLCAlcyIsIGF0dGVtcHRzLCBkZXZuYW0sIHVzZXIpOwotCSAgICBsY3BfY2xvc2UodW5pdCwgImxvZ2luIGZhaWxlZCIpOwotCX0KLQlpZiAoYXR0ZW1wdHMgPiAzKQotCSAgICBzbGVlcCgodV9pbnQpIChhdHRlbXB0cyAtIDMpICogNSk7Ci0JaWYgKG9wdHMgIT0gTlVMTCkKLQkgICAgZnJlZV93b3JkbGlzdChvcHRzKTsKLQotICAgIH0gZWxzZSB7Ci0JYXR0ZW1wdHMgPSAwOwkJCS8qIFJlc2V0IGNvdW50ICovCi0JaWYgKCoqbXNnID09IDApCi0JICAgICptc2cgPSAiTG9naW4gb2siOwotCXNldF9hbGxvd2VkX2FkZHJzKHVuaXQsIGFkZHJzLCBvcHRzKTsKLSAgICB9Ci0KLSAgICBpZiAoYWRkcnMgIT0gTlVMTCkKLQlmcmVlX3dvcmRsaXN0KGFkZHJzKTsKLSAgICBCWkVSTyhwYXNzd2QsIHNpemVvZihwYXNzd2QpKTsKLSAgICBCWkVSTyhzZWNyZXQsIHNpemVvZihzZWNyZXQpKTsKLQotICAgIHJldHVybiByZXQ7Ci0jZW5kaWYKLX0KLQotLyoKLSAqIG51bGxfbG9naW4gLSBDaGVjayBpZiBhIHVzZXJuYW1lIG9mICIiIGFuZCBhIHBhc3N3b3JkIG9mICIiIGFyZQotICogYWNjZXB0YWJsZSwgYW5kIGlmZiBzbywgc2V0IHRoZSBsaXN0IG9mIGFjY2VwdGFibGUgSVAgYWRkcmVzc2VzCi0gKiBhbmQgcmV0dXJuIDEuCi0gKi8KLXN0YXRpYyBpbnQKLW51bGxfbG9naW4odW5pdCkKLSAgICBpbnQgdW5pdDsKLXsKLSAgICBjaGFyICpmaWxlbmFtZTsKLSAgICBGSUxFICpmOwotICAgIGludCBpLCByZXQ7Ci0gICAgc3RydWN0IHdvcmRsaXN0ICphZGRycywgKm9wdHM7Ci0gICAgY2hhciBzZWNyZXRbTUFYV09SRExFTl07Ci0KLSAgICAvKgotICAgICAqIENoZWNrIGlmIGEgcGx1Z2luIHdhbnRzIHRvIGhhbmRsZSB0aGlzLgotICAgICAqLwotICAgIHJldCA9IC0xOwotICAgIGlmIChudWxsX2F1dGhfaG9vaykKLQlyZXQgPSAoKm51bGxfYXV0aF9ob29rKSgmYWRkcnMsICZvcHRzKTsKLQotICAgIC8qCi0gICAgICogT3BlbiB0aGUgZmlsZSBvZiBwYXAgc2VjcmV0cyBhbmQgc2NhbiBmb3IgYSBzdWl0YWJsZSBzZWNyZXQuCi0gICAgICovCi0gICAgaWYgKHJldCA8PSAwKSB7Ci0JZmlsZW5hbWUgPSBfUEFUSF9VUEFQRklMRTsKLQlhZGRycyA9IE5VTEw7Ci0JZiA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOwotCWlmIChmID09IE5VTEwpCi0JICAgIHJldHVybiAwOwotCWNoZWNrX2FjY2VzcyhmLCBmaWxlbmFtZSk7Ci0KLQlpID0gc2Nhbl9hdXRoZmlsZShmLCAiIiwgb3VyX25hbWUsIHNlY3JldCwgJmFkZHJzLCAmb3B0cywgZmlsZW5hbWUsIDApOwotCXJldCA9IGkgPj0gMCAmJiBzZWNyZXRbMF0gPT0gMDsKLQlCWkVSTyhzZWNyZXQsIHNpemVvZihzZWNyZXQpKTsKLQlmY2xvc2UoZik7Ci0gICAgfQotCi0gICAgaWYgKHJldCkKLQlzZXRfYWxsb3dlZF9hZGRycyh1bml0LCBhZGRycywgb3B0cyk7Ci0gICAgZWxzZSBpZiAob3B0cyAhPSAwKQotCWZyZWVfd29yZGxpc3Qob3B0cyk7Ci0gICAgaWYgKGFkZHJzICE9IDApCi0JZnJlZV93b3JkbGlzdChhZGRycyk7Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi0KLS8qCi0gKiBnZXRfcGFwX3Bhc3N3ZCAtIGdldCBhIHBhc3N3b3JkIGZvciBhdXRoZW50aWNhdGluZyBvdXJzZWx2ZXMgd2l0aAotICogb3VyIHBlZXIgdXNpbmcgUEFQLiAgUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgaWYgbm8gc3VpdGFibGUgcGFzc3dvcmQKLSAqIGNvdWxkIGJlIGZvdW5kLgotICogQXNzdW1lcyBwYXNzd2QgcG9pbnRzIHRvIE1BWFNFQ1JFVExFTiBieXRlcyBvZiBzcGFjZSAoaWYgbm9uLW51bGwpLgotICovCi1zdGF0aWMgaW50Ci1nZXRfcGFwX3Bhc3N3ZChwYXNzd2QpCi0gICAgY2hhciAqcGFzc3dkOwotewotICAgIGNoYXIgKmZpbGVuYW1lOwotICAgIEZJTEUgKmY7Ci0gICAgaW50IHJldDsKLSAgICBjaGFyIHNlY3JldFtNQVhXT1JETEVOXTsKLQotICAgIC8qCi0gICAgICogQ2hlY2sgd2hldGhlciBhIHBsdWdpbiB3YW50cyB0byBzdXBwbHkgdGhpcy4KLSAgICAgKi8KLSAgICBpZiAocGFwX3Bhc3N3ZF9ob29rKSB7Ci0JcmV0ID0gKCpwYXBfcGFzc3dkX2hvb2spKHVzZXIsIHBhc3N3ZCk7Ci0JaWYgKHJldCA+PSAwKQotCSAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIGZpbGVuYW1lID0gX1BBVEhfVVBBUEZJTEU7Ci0gICAgZiA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOwotICAgIGlmIChmID09IE5VTEwpCi0JcmV0dXJuIDA7Ci0gICAgY2hlY2tfYWNjZXNzKGYsIGZpbGVuYW1lKTsKLSAgICByZXQgPSBzY2FuX2F1dGhmaWxlKGYsIHVzZXIsCi0JCQkocmVtb3RlX25hbWVbMF0/IHJlbW90ZV9uYW1lOiBOVUxMKSwKLQkJCXNlY3JldCwgTlVMTCwgTlVMTCwgZmlsZW5hbWUsIDApOwotICAgIGZjbG9zZShmKTsKLSAgICBpZiAocmV0IDwgMCkKLQlyZXR1cm4gMDsKLSAgICBpZiAocGFzc3dkICE9IE5VTEwpCi0Jc3RybGNweShwYXNzd2QsIHNlY3JldCwgTUFYU0VDUkVUTEVOKTsKLSAgICBCWkVSTyhzZWNyZXQsIHNpemVvZihzZWNyZXQpKTsKLSAgICByZXR1cm4gMTsKLX0KLQotCi0vKgotICogaGF2ZV9wYXBfc2VjcmV0IC0gY2hlY2sgd2hldGhlciB3ZSBoYXZlIGEgUEFQIGZpbGUgd2l0aCBhbnkKLSAqIHNlY3JldHMgdGhhdCB3ZSBjb3VsZCBwb3NzaWJseSB1c2UgZm9yIGF1dGhlbnRpY2F0aW5nIHRoZSBwZWVyLgotICovCi1zdGF0aWMgaW50Ci1oYXZlX3BhcF9zZWNyZXQobGFja3NfaXBwKQotICAgIGludCAqbGFja3NfaXBwOwotewotICAgIEZJTEUgKmY7Ci0gICAgaW50IHJldDsKLSAgICBjaGFyICpmaWxlbmFtZTsKLSAgICBzdHJ1Y3Qgd29yZGxpc3QgKmFkZHJzOwotCi0gICAgLyogbGV0IHRoZSBwbHVnaW4gZGVjaWRlLCBpZiB0aGVyZSBpcyBvbmUgKi8KLSAgICBpZiAocGFwX2NoZWNrX2hvb2spIHsKLQlyZXQgPSAoKnBhcF9jaGVja19ob29rKSgpOwotCWlmIChyZXQgPj0gMCkKLQkgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBmaWxlbmFtZSA9IF9QQVRIX1VQQVBGSUxFOwotICAgIGYgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKLSAgICBpZiAoZiA9PSBOVUxMKQotCXJldHVybiAwOwotCi0gICAgcmV0ID0gc2Nhbl9hdXRoZmlsZShmLCAoZXhwbGljaXRfcmVtb3RlPyByZW1vdGVfbmFtZTogTlVMTCksIG91cl9uYW1lLAotCQkJTlVMTCwgJmFkZHJzLCBOVUxMLCBmaWxlbmFtZSwgMCk7Ci0gICAgZmNsb3NlKGYpOwotICAgIGlmIChyZXQgPj0gMCAmJiAhc29tZV9pcF9vayhhZGRycykpIHsKLQlpZiAobGFja3NfaXBwICE9IDApCi0JICAgICpsYWNrc19pcHAgPSAxOwotCXJldCA9IC0xOwotICAgIH0KLSAgICBpZiAoYWRkcnMgIT0gMCkKLQlmcmVlX3dvcmRsaXN0KGFkZHJzKTsKLQotICAgIHJldHVybiByZXQgPj0gMDsKLX0KLQotCi0vKgotICogaGF2ZV9jaGFwX3NlY3JldCAtIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSBhIENIQVAgZmlsZSB3aXRoIGEKLSAqIHNlY3JldCB0aGF0IHdlIGNvdWxkIHBvc3NpYmx5IHVzZSBmb3IgYXV0aGVudGljYXRpbmcgYGNsaWVudCcKLSAqIG9uIGBzZXJ2ZXInLiAgRWl0aGVyIGNhbiBiZSB0aGUgbnVsbCBzdHJpbmcsIG1lYW5pbmcgd2UgZG9uJ3QKLSAqIGtub3cgdGhlIGlkZW50aXR5IHlldC4KLSAqLwotc3RhdGljIGludAotaGF2ZV9jaGFwX3NlY3JldChjbGllbnQsIHNlcnZlciwgbmVlZF9pcCwgbGFja3NfaXBwKQotICAgIGNoYXIgKmNsaWVudDsKLSAgICBjaGFyICpzZXJ2ZXI7Ci0gICAgaW50IG5lZWRfaXA7Ci0gICAgaW50ICpsYWNrc19pcHA7Ci17Ci0gICAgRklMRSAqZjsKLSAgICBpbnQgcmV0OwotICAgIGNoYXIgKmZpbGVuYW1lOwotICAgIHN0cnVjdCB3b3JkbGlzdCAqYWRkcnM7Ci0KLSAgICBpZiAoY2hhcF9jaGVja19ob29rKSB7Ci0JcmV0ID0gKCpjaGFwX2NoZWNrX2hvb2spKCk7Ci0JaWYgKHJldCA+PSAwKSB7Ci0JICAgIHJldHVybiByZXQ7Ci0JfQotICAgIH0KLQotICAgIGZpbGVuYW1lID0gX1BBVEhfQ0hBUEZJTEU7Ci0gICAgZiA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOwotICAgIGlmIChmID09IE5VTEwpCi0JcmV0dXJuIDA7Ci0KLSAgICBpZiAoY2xpZW50ICE9IE5VTEwgJiYgY2xpZW50WzBdID09IDApCi0JY2xpZW50ID0gTlVMTDsKLSAgICBlbHNlIGlmIChzZXJ2ZXIgIT0gTlVMTCAmJiBzZXJ2ZXJbMF0gPT0gMCkKLQlzZXJ2ZXIgPSBOVUxMOwotCi0gICAgcmV0ID0gc2Nhbl9hdXRoZmlsZShmLCBjbGllbnQsIHNlcnZlciwgTlVMTCwgJmFkZHJzLCBOVUxMLCBmaWxlbmFtZSwgMCk7Ci0gICAgZmNsb3NlKGYpOwotICAgIGlmIChyZXQgPj0gMCAmJiBuZWVkX2lwICYmICFzb21lX2lwX29rKGFkZHJzKSkgewotCWlmIChsYWNrc19pcHAgIT0gMCkKLQkgICAgKmxhY2tzX2lwcCA9IDE7Ci0JcmV0ID0gLTE7Ci0gICAgfQotICAgIGlmIChhZGRycyAhPSAwKQotCWZyZWVfd29yZGxpc3QoYWRkcnMpOwotCi0gICAgcmV0dXJuIHJldCA+PSAwOwotfQotCi0KLS8qCi0gKiBoYXZlX3NycF9zZWNyZXQgLSBjaGVjayB3aGV0aGVyIHdlIGhhdmUgYSBTUlAgZmlsZSB3aXRoIGEKLSAqIHNlY3JldCB0aGF0IHdlIGNvdWxkIHBvc3NpYmx5IHVzZSBmb3IgYXV0aGVudGljYXRpbmcgYGNsaWVudCcKLSAqIG9uIGBzZXJ2ZXInLiAgRWl0aGVyIGNhbiBiZSB0aGUgbnVsbCBzdHJpbmcsIG1lYW5pbmcgd2UgZG9uJ3QKLSAqIGtub3cgdGhlIGlkZW50aXR5IHlldC4KLSAqLwotc3RhdGljIGludAotaGF2ZV9zcnBfc2VjcmV0KGNsaWVudCwgc2VydmVyLCBuZWVkX2lwLCBsYWNrc19pcHApCi0gICAgY2hhciAqY2xpZW50OwotICAgIGNoYXIgKnNlcnZlcjsKLSAgICBpbnQgbmVlZF9pcDsKLSAgICBpbnQgKmxhY2tzX2lwcDsKLXsKLSAgICBGSUxFICpmOwotICAgIGludCByZXQ7Ci0gICAgY2hhciAqZmlsZW5hbWU7Ci0gICAgc3RydWN0IHdvcmRsaXN0ICphZGRyczsKLQotICAgIGZpbGVuYW1lID0gX1BBVEhfU1JQRklMRTsKLSAgICBmID0gZm9wZW4oZmlsZW5hbWUsICJyIik7Ci0gICAgaWYgKGYgPT0gTlVMTCkKLQlyZXR1cm4gMDsKLQotICAgIGlmIChjbGllbnQgIT0gTlVMTCAmJiBjbGllbnRbMF0gPT0gMCkKLQljbGllbnQgPSBOVUxMOwotICAgIGVsc2UgaWYgKHNlcnZlciAhPSBOVUxMICYmIHNlcnZlclswXSA9PSAwKQotCXNlcnZlciA9IE5VTEw7Ci0KLSAgICByZXQgPSBzY2FuX2F1dGhmaWxlKGYsIGNsaWVudCwgc2VydmVyLCBOVUxMLCAmYWRkcnMsIE5VTEwsIGZpbGVuYW1lLCAwKTsKLSAgICBmY2xvc2UoZik7Ci0gICAgaWYgKHJldCA+PSAwICYmIG5lZWRfaXAgJiYgIXNvbWVfaXBfb2soYWRkcnMpKSB7Ci0JaWYgKGxhY2tzX2lwcCAhPSAwKQotCSAgICAqbGFja3NfaXBwID0gMTsKLQlyZXQgPSAtMTsKLSAgICB9Ci0gICAgaWYgKGFkZHJzICE9IDApCi0JZnJlZV93b3JkbGlzdChhZGRycyk7Ci0KLSAgICByZXR1cm4gcmV0ID49IDA7Ci19Ci0KLQotLyoKLSAqIGdldF9zZWNyZXQgLSBvcGVuIHRoZSBDSEFQIHNlY3JldCBmaWxlIGFuZCByZXR1cm4gdGhlIHNlY3JldAotICogZm9yIGF1dGhlbnRpY2F0aW5nIHRoZSBnaXZlbiBjbGllbnQgb24gdGhlIGdpdmVuIHNlcnZlci4KLSAqIChXZSBjb3VsZCBiZSBlaXRoZXIgY2xpZW50IG9yIHNlcnZlcikuCi0gKi8KLWludAotZ2V0X3NlY3JldCh1bml0LCBjbGllbnQsIHNlcnZlciwgc2VjcmV0LCBzZWNyZXRfbGVuLCBhbV9zZXJ2ZXIpCi0gICAgaW50IHVuaXQ7Ci0gICAgY2hhciAqY2xpZW50OwotICAgIGNoYXIgKnNlcnZlcjsKLSAgICBjaGFyICpzZWNyZXQ7Ci0gICAgaW50ICpzZWNyZXRfbGVuOwotICAgIGludCBhbV9zZXJ2ZXI7Ci17Ci0gICAgRklMRSAqZjsKLSAgICBpbnQgcmV0LCBsZW47Ci0gICAgY2hhciAqZmlsZW5hbWU7Ci0gICAgc3RydWN0IHdvcmRsaXN0ICphZGRycywgKm9wdHM7Ci0gICAgY2hhciBzZWNidWZbTUFYV09SRExFTl07Ci0KLSAgICBpZiAoIWFtX3NlcnZlciAmJiBwYXNzd2RbMF0gIT0gMCkgewotCXN0cmxjcHkoc2VjYnVmLCBwYXNzd2QsIHNpemVvZihzZWNidWYpKTsKLSAgICB9IGVsc2UgaWYgKCFhbV9zZXJ2ZXIgJiYgY2hhcF9wYXNzd2RfaG9vaykgewotCWlmICggKCpjaGFwX3Bhc3N3ZF9ob29rKShjbGllbnQsIHNlY2J1ZikgPCAwKSB7Ci0JICAgIGVycm9yKCJVbmFibGUgdG8gb2J0YWluIENIQVAgcGFzc3dvcmQgZm9yICVzIG9uICVzIGZyb20gcGx1Z2luIiwKLQkJICBjbGllbnQsIHNlcnZlcik7Ci0JICAgIHJldHVybiAwOwotCX0KLSAgICB9IGVsc2UgewotCWZpbGVuYW1lID0gX1BBVEhfQ0hBUEZJTEU7Ci0JYWRkcnMgPSBOVUxMOwotCXNlY2J1ZlswXSA9IDA7Ci0KLQlmID0gZm9wZW4oZmlsZW5hbWUsICJyIik7Ci0JaWYgKGYgPT0gTlVMTCkgewotCSAgICBlcnJvcigiQ2FuJ3Qgb3BlbiBjaGFwIHNlY3JldCBmaWxlICVzOiAlbSIsIGZpbGVuYW1lKTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCWNoZWNrX2FjY2VzcyhmLCBmaWxlbmFtZSk7Ci0KLQlyZXQgPSBzY2FuX2F1dGhmaWxlKGYsIGNsaWVudCwgc2VydmVyLCBzZWNidWYsICZhZGRycywgJm9wdHMsIGZpbGVuYW1lLCAwKTsKLQlmY2xvc2UoZik7Ci0JaWYgKHJldCA8IDApCi0JICAgIHJldHVybiAwOwotCi0JaWYgKGFtX3NlcnZlcikKLQkgICAgc2V0X2FsbG93ZWRfYWRkcnModW5pdCwgYWRkcnMsIG9wdHMpOwotCWVsc2UgaWYgKG9wdHMgIT0gMCkKLQkgICAgZnJlZV93b3JkbGlzdChvcHRzKTsKLQlpZiAoYWRkcnMgIT0gMCkKLQkgICAgZnJlZV93b3JkbGlzdChhZGRycyk7Ci0gICAgfQotCi0gICAgbGVuID0gc3RybGVuKHNlY2J1Zik7Ci0gICAgaWYgKGxlbiA+IE1BWFNFQ1JFVExFTikgewotCWVycm9yKCJTZWNyZXQgZm9yICVzIG9uICVzIGlzIHRvbyBsb25nIiwgY2xpZW50LCBzZXJ2ZXIpOwotCWxlbiA9IE1BWFNFQ1JFVExFTjsKLSAgICB9Ci0gICAgQkNPUFkoc2VjYnVmLCBzZWNyZXQsIGxlbik7Ci0gICAgQlpFUk8oc2VjYnVmLCBzaXplb2Yoc2VjYnVmKSk7Ci0gICAgKnNlY3JldF9sZW4gPSBsZW47Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotCi0vKgotICogZ2V0X3NycF9zZWNyZXQgLSBvcGVuIHRoZSBTUlAgc2VjcmV0IGZpbGUgYW5kIHJldHVybiB0aGUgc2VjcmV0Ci0gKiBmb3IgYXV0aGVudGljYXRpbmcgdGhlIGdpdmVuIGNsaWVudCBvbiB0aGUgZ2l2ZW4gc2VydmVyLgotICogKFdlIGNvdWxkIGJlIGVpdGhlciBjbGllbnQgb3Igc2VydmVyKS4KLSAqLwotaW50Ci1nZXRfc3JwX3NlY3JldCh1bml0LCBjbGllbnQsIHNlcnZlciwgc2VjcmV0LCBhbV9zZXJ2ZXIpCi0gICAgaW50IHVuaXQ7Ci0gICAgY2hhciAqY2xpZW50OwotICAgIGNoYXIgKnNlcnZlcjsKLSAgICBjaGFyICpzZWNyZXQ7Ci0gICAgaW50IGFtX3NlcnZlcjsKLXsKLSAgICBGSUxFICpmcDsKLSAgICBpbnQgcmV0OwotICAgIGNoYXIgKmZpbGVuYW1lOwotICAgIHN0cnVjdCB3b3JkbGlzdCAqYWRkcnMsICpvcHRzOwotCi0gICAgaWYgKCFhbV9zZXJ2ZXIgJiYgcGFzc3dkWzBdICE9ICdcMCcpIHsKLQlzdHJsY3B5KHNlY3JldCwgcGFzc3dkLCBNQVhXT1JETEVOKTsKLSAgICB9IGVsc2UgewotCWZpbGVuYW1lID0gX1BBVEhfU1JQRklMRTsKLQlhZGRycyA9IE5VTEw7Ci0KLQlmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOwotCWlmIChmcCA9PSBOVUxMKSB7Ci0JICAgIGVycm9yKCJDYW4ndCBvcGVuIHNycCBzZWNyZXQgZmlsZSAlczogJW0iLCBmaWxlbmFtZSk7Ci0JICAgIHJldHVybiAwOwotCX0KLQljaGVja19hY2Nlc3MoZnAsIGZpbGVuYW1lKTsKLQotCXNlY3JldFswXSA9ICdcMCc7Ci0JcmV0ID0gc2Nhbl9hdXRoZmlsZShmcCwgY2xpZW50LCBzZXJ2ZXIsIHNlY3JldCwgJmFkZHJzLCAmb3B0cywKLQkgICAgZmlsZW5hbWUsIGFtX3NlcnZlcik7Ci0JZmNsb3NlKGZwKTsKLQlpZiAocmV0IDwgMCkKLQkgICAgcmV0dXJuIDA7Ci0KLQlpZiAoYW1fc2VydmVyKQotCSAgICBzZXRfYWxsb3dlZF9hZGRycyh1bml0LCBhZGRycywgb3B0cyk7Ci0JZWxzZSBpZiAob3B0cyAhPSBOVUxMKQotCSAgICBmcmVlX3dvcmRsaXN0KG9wdHMpOwotCWlmIChhZGRycyAhPSBOVUxMKQotCSAgICBmcmVlX3dvcmRsaXN0KGFkZHJzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotLyoKLSAqIHNldF9hbGxvd2VkX2FkZHJzKCkgLSBzZXQgdGhlIGxpc3Qgb2YgYWxsb3dlZCBhZGRyZXNzZXMuCi0gKiBBbHNvIGxvb2tzIGZvciBgLS0nIGluZGljYXRpbmcgb3B0aW9ucyB0byBhcHBseSBmb3IgdGhpcyBwZWVyCi0gKiBhbmQgbGVhdmVzIHRoZSBmb2xsb3dpbmcgd29yZHMgaW4gZXh0cmFfb3B0aW9ucy4KLSAqLwotc3RhdGljIHZvaWQKLXNldF9hbGxvd2VkX2FkZHJzKHVuaXQsIGFkZHJzLCBvcHRzKQotICAgIGludCB1bml0OwotICAgIHN0cnVjdCB3b3JkbGlzdCAqYWRkcnM7Ci0gICAgc3RydWN0IHdvcmRsaXN0ICpvcHRzOwotewotICAgIGludCBuOwotICAgIHN0cnVjdCB3b3JkbGlzdCAqYXAsICoqcGxpbms7Ci0gICAgc3RydWN0IHBlcm1pdHRlZF9pcCAqaXA7Ci0gICAgY2hhciAqcHRyX3dvcmQsICpwdHJfbWFzazsKLSAgICBzdHJ1Y3QgaG9zdGVudCAqaHA7Ci0gICAgc3RydWN0IG5ldGVudCAqbnA7Ci0gICAgdV9pbnQzMl90IGEsIG1hc2ssIGFoLCBvZmZzZXQ7Ci0gICAgc3RydWN0IGlwY3Bfb3B0aW9ucyAqd28gPSAmaXBjcF93YW50b3B0aW9uc1t1bml0XTsKLSAgICB1X2ludDMyX3Qgc3VnZ2VzdGVkX2lwID0gMDsKLQotICAgIGlmIChhZGRyZXNzZXNbdW5pdF0gIT0gTlVMTCkKLQlmcmVlKGFkZHJlc3Nlc1t1bml0XSk7Ci0gICAgYWRkcmVzc2VzW3VuaXRdID0gTlVMTDsKLSAgICBpZiAoZXh0cmFfb3B0aW9ucyAhPSBOVUxMKQotCWZyZWVfd29yZGxpc3QoZXh0cmFfb3B0aW9ucyk7Ci0gICAgZXh0cmFfb3B0aW9ucyA9IG9wdHM7Ci0KLSAgICAvKgotICAgICAqIENvdW50IHRoZSBudW1iZXIgb2YgSVAgYWRkcmVzc2VzIGdpdmVuLgotICAgICAqLwotICAgIG4gPSB3b3JkbGlzdF9jb3VudChhZGRycykgKyB3b3JkbGlzdF9jb3VudChub2F1dGhfYWRkcnMpOwotICAgIGlmIChuID09IDApCi0JcmV0dXJuOwotICAgIGlwID0gKHN0cnVjdCBwZXJtaXR0ZWRfaXAgKikgbWFsbG9jKChuICsgMSkgKiBzaXplb2Yoc3RydWN0IHBlcm1pdHRlZF9pcCkpOwotICAgIGlmIChpcCA9PSAwKQotCXJldHVybjsKLQotICAgIC8qIHRlbXBvcmFyaWx5IGFwcGVuZCB0aGUgbm9hdXRoX2FkZHJzIGxpc3QgdG8gYWRkcnMgKi8KLSAgICBmb3IgKHBsaW5rID0gJmFkZHJzOyAqcGxpbmsgIT0gTlVMTDsgcGxpbmsgPSAmKCpwbGluayktPm5leHQpCi0JOwotICAgICpwbGluayA9IG5vYXV0aF9hZGRyczsKLQotICAgIG4gPSAwOwotICAgIGZvciAoYXAgPSBhZGRyczsgYXAgIT0gTlVMTDsgYXAgPSBhcC0+bmV4dCkgewotCS8qICItIiBtZWFucyBubyBhZGRyZXNzZXMgYXV0aG9yaXplZCwgIioiIG1lYW5zIGFueSBhZGRyZXNzIGFsbG93ZWQgKi8KLQlwdHJfd29yZCA9IGFwLT53b3JkOwotCWlmIChzdHJjbXAocHRyX3dvcmQsICItIikgPT0gMCkKLQkgICAgYnJlYWs7Ci0JaWYgKHN0cmNtcChwdHJfd29yZCwgIioiKSA9PSAwKSB7Ci0JICAgIGlwW25dLnBlcm1pdCA9IDE7Ci0JICAgIGlwW25dLmJhc2UgPSBpcFtuXS5tYXNrID0gMDsKLQkgICAgKytuOwotCSAgICBicmVhazsKLQl9Ci0KLQlpcFtuXS5wZXJtaXQgPSAxOwotCWlmICgqcHRyX3dvcmQgPT0gJyEnKSB7Ci0JICAgIGlwW25dLnBlcm1pdCA9IDA7Ci0JICAgICsrcHRyX3dvcmQ7Ci0JfQotCi0JbWFzayA9IH4gKHVfaW50MzJfdCkgMDsKLQlvZmZzZXQgPSAwOwotCXB0cl9tYXNrID0gc3RyY2hyIChwdHJfd29yZCwgJy8nKTsKLQlpZiAocHRyX21hc2sgIT0gTlVMTCkgewotCSAgICBpbnQgYml0X2NvdW50OwotCSAgICBjaGFyICplbmRwOwotCi0JICAgIGJpdF9jb3VudCA9IChpbnQpIHN0cnRvbCAocHRyX21hc2srMSwgJmVuZHAsIDEwKTsKLQkgICAgaWYgKGJpdF9jb3VudCA8PSAwIHx8IGJpdF9jb3VudCA+IDMyKSB7Ci0JCXdhcm4oImludmFsaWQgYWRkcmVzcyBsZW5ndGggJXYgaW4gYXV0aC4gYWRkcmVzcyBsaXN0IiwKLQkJICAgICBwdHJfbWFzaysxKTsKLQkJY29udGludWU7Ci0JICAgIH0KLQkgICAgYml0X2NvdW50ID0gMzIgLSBiaXRfY291bnQ7CS8qICMgYml0cyBpbiBob3N0IHBhcnQgKi8KLQkgICAgaWYgKCplbmRwID09ICcrJykgewotCQlvZmZzZXQgPSBpZnVuaXQgKyAxOwotCQkrK2VuZHA7Ci0JICAgIH0KLQkgICAgaWYgKCplbmRwICE9IDApIHsKLQkJd2FybigiaW52YWxpZCBhZGRyZXNzIGxlbmd0aCBzeW50YXg6ICV2IiwgcHRyX21hc2srMSk7Ci0JCWNvbnRpbnVlOwotCSAgICB9Ci0JICAgICpwdHJfbWFzayA9ICdcMCc7Ci0JICAgIG1hc2sgPDw9IGJpdF9jb3VudDsKLQl9Ci0KLQlocCA9IGdldGhvc3RieW5hbWUocHRyX3dvcmQpOwotCWlmIChocCAhPSBOVUxMICYmIGhwLT5oX2FkZHJ0eXBlID09IEFGX0lORVQpIHsKLQkgICAgYSA9ICoodV9pbnQzMl90ICopaHAtPmhfYWRkcjsKLQl9IGVsc2UgewotCSAgICBucCA9IGdldG5ldGJ5bmFtZSAocHRyX3dvcmQpOwotCSAgICBpZiAobnAgIT0gTlVMTCAmJiBucC0+bl9hZGRydHlwZSA9PSBBRl9JTkVUKSB7Ci0JCWEgPSBodG9ubCAoKHVfaW50MzJfdClucC0+bl9uZXQpOwotCQlpZiAocHRyX21hc2sgPT0gTlVMTCkgewotCQkgICAgLyogY2FsY3VsYXRlIGFwcHJvcHJpYXRlIG1hc2sgZm9yIG5ldCAqLwotCQkgICAgYWggPSBudG9obChhKTsKLQkJICAgIGlmIChJTl9DTEFTU0EoYWgpKQotCQkJbWFzayA9IElOX0NMQVNTQV9ORVQ7Ci0JCSAgICBlbHNlIGlmIChJTl9DTEFTU0IoYWgpKQotCQkJbWFzayA9IElOX0NMQVNTQl9ORVQ7Ci0JCSAgICBlbHNlIGlmIChJTl9DTEFTU0MoYWgpKQotCQkJbWFzayA9IElOX0NMQVNTQ19ORVQ7Ci0JCX0KLQkgICAgfSBlbHNlIHsKLQkJYSA9IGluZXRfYWRkciAocHRyX3dvcmQpOwotCSAgICB9Ci0JfQotCi0JaWYgKHB0cl9tYXNrICE9IE5VTEwpCi0JICAgICpwdHJfbWFzayA9ICcvJzsKLQotCWlmIChhID09ICh1X2ludDMyX3QpLTFMKSB7Ci0JICAgIHdhcm4oInVua25vd24gaG9zdCAlcyBpbiBhdXRoLiBhZGRyZXNzIGxpc3QiLCBhcC0+d29yZCk7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQlpZiAob2Zmc2V0ICE9IDApIHsKLQkgICAgaWYgKG9mZnNldCA+PSB+bWFzaykgewotCQl3YXJuKCJpbnRlcmZhY2UgdW5pdCAlZCB0b28gbGFyZ2UgZm9yIHN1Ym5ldCAldiIsCi0JCSAgICAgaWZ1bml0LCBwdHJfd29yZCk7Ci0JCWNvbnRpbnVlOwotCSAgICB9Ci0JICAgIGEgPSBodG9ubCgobnRvaGwoYSkgJiBtYXNrKSArIG9mZnNldCk7Ci0JICAgIG1hc2sgPSB+KHVfaW50MzJfdCkwOwotCX0KLQlpcFtuXS5tYXNrID0gaHRvbmwobWFzayk7Ci0JaXBbbl0uYmFzZSA9IGEgJiBpcFtuXS5tYXNrOwotCSsrbjsKLQlpZiAofm1hc2sgPT0gMCAmJiBzdWdnZXN0ZWRfaXAgPT0gMCkKLQkgICAgc3VnZ2VzdGVkX2lwID0gYTsKLSAgICB9Ci0gICAgKnBsaW5rID0gTlVMTDsKLQotICAgIGlwW25dLnBlcm1pdCA9IDA7CQkvKiBtYWtlIHRoZSBsYXN0IGVudHJ5IGZvcmJpZCBhbGwgYWRkcmVzc2VzICovCi0gICAgaXBbbl0uYmFzZSA9IDA7CQkvKiB0byB0ZXJtaW5hdGUgdGhlIGxpc3QgKi8KLSAgICBpcFtuXS5tYXNrID0gMDsKLQotICAgIGFkZHJlc3Nlc1t1bml0XSA9IGlwOwotCi0gICAgLyoKLSAgICAgKiBJZiB0aGUgYWRkcmVzcyBnaXZlbiBmb3IgdGhlIHBlZXIgaXNuJ3QgYXV0aG9yaXplZCwgb3IgaWYKLSAgICAgKiB0aGUgdXNlciBoYXNuJ3QgZ2l2ZW4gb25lLCBBTkQgdGhlcmUgaXMgYW4gYXV0aG9yaXplZCBhZGRyZXNzCi0gICAgICogd2hpY2ggaXMgYSBzaW5nbGUgaG9zdCwgdGhlbiB1c2UgdGhhdCBpZiB3ZSBmaW5kIG9uZS4KLSAgICAgKi8KLSAgICBpZiAoc3VnZ2VzdGVkX2lwICE9IDAKLQkmJiAod28tPmhpc2FkZHIgPT0gMCB8fCAhYXV0aF9pcF9hZGRyKHVuaXQsIHdvLT5oaXNhZGRyKSkpIHsKLQl3by0+aGlzYWRkciA9IHN1Z2dlc3RlZF9pcDsKLQkvKgotCSAqIERvIHdlIGluc2lzdCBvbiB0aGlzIGFkZHJlc3M/ICBObywgaWYgdGhlcmUgYXJlIG90aGVyCi0JICogYWRkcmVzc2VzIGF1dGhvcml6ZWQgdGhhbiB0aGUgc3VnZ2VzdGVkIG9uZS4KLQkgKi8KLQlpZiAobiA+IDEpCi0JICAgIHdvLT5hY2NlcHRfcmVtb3RlID0gMTsKLSAgICB9Ci19Ci0KLS8qCi0gKiBhdXRoX2lwX2FkZHIgLSBjaGVjayB3aGV0aGVyIHRoZSBwZWVyIGlzIGF1dGhvcml6ZWQgdG8gdXNlCi0gKiBhIGdpdmVuIElQIGFkZHJlc3MuICBSZXR1cm5zIDEgaWYgYXV0aG9yaXplZCwgMCBvdGhlcndpc2UuCi0gKi8KLWludAotYXV0aF9pcF9hZGRyKHVuaXQsIGFkZHIpCi0gICAgaW50IHVuaXQ7Ci0gICAgdV9pbnQzMl90IGFkZHI7Ci17Ci0gICAgaW50IG9rOwotCi0gICAgLyogZG9uJ3QgYWxsb3cgbG9vcGJhY2sgb3IgbXVsdGljYXN0IGFkZHJlc3MgKi8KLSAgICBpZiAoYmFkX2lwX2FkcnMoYWRkcikpCi0JcmV0dXJuIDA7Ci0KLSAgICBpZiAoYWxsb3dlZF9hZGRyZXNzX2hvb2spIHsKLQlvayA9IGFsbG93ZWRfYWRkcmVzc19ob29rKGFkZHIpOwotCWlmIChvayA+PSAwKSByZXR1cm4gb2s7Ci0gICAgfQotCi0gICAgaWYgKGFkZHJlc3Nlc1t1bml0XSAhPSBOVUxMKSB7Ci0Jb2sgPSBpcF9hZGRyX2NoZWNrKGFkZHIsIGFkZHJlc3Nlc1t1bml0XSk7Ci0JaWYgKG9rID49IDApCi0JICAgIHJldHVybiBvazsKLSAgICB9Ci0KLSAgICBpZiAoYXV0aF9yZXF1aXJlZCkKLQlyZXR1cm4gMDsJCS8qIG5vIGFkZHJlc3NlcyBhdXRob3JpemVkICovCi0gICAgcmV0dXJuIGFsbG93X2FueV9pcCB8fCBwcml2aWxlZ2VkIHx8ICFoYXZlX3JvdXRlX3RvKGFkZHIpOwotfQotCi1zdGF0aWMgaW50Ci1pcF9hZGRyX2NoZWNrKGFkZHIsIGFkZHJzKQotICAgIHVfaW50MzJfdCBhZGRyOwotICAgIHN0cnVjdCBwZXJtaXR0ZWRfaXAgKmFkZHJzOwotewotICAgIGZvciAoOyA7ICsrYWRkcnMpCi0JaWYgKChhZGRyICYgYWRkcnMtPm1hc2spID09IGFkZHJzLT5iYXNlKQotCSAgICByZXR1cm4gYWRkcnMtPnBlcm1pdDsKLX0KLQotLyoKLSAqIGJhZF9pcF9hZHJzIC0gcmV0dXJuIDEgaWYgdGhlIElQIGFkZHJlc3MgaXMgb25lIHdlIGRvbid0IHdhbnQKLSAqIHRvIHVzZSwgc3VjaCBhcyBhbiBhZGRyZXNzIGluIHRoZSBsb29wYmFjayBuZXQgb3IgYSBtdWx0aWNhc3QgYWRkcmVzcy4KLSAqIGFkZHIgaXMgaW4gbmV0d29yayBieXRlIG9yZGVyLgotICovCi1pbnQKLWJhZF9pcF9hZHJzKGFkZHIpCi0gICAgdV9pbnQzMl90IGFkZHI7Ci17Ci0gICAgYWRkciA9IG50b2hsKGFkZHIpOwotICAgIHJldHVybiAoYWRkciA+PiBJTl9DTEFTU0FfTlNISUZUKSA9PSBJTl9MT09QQkFDS05FVAotCXx8IElOX01VTFRJQ0FTVChhZGRyKSB8fCBJTl9CQURDTEFTUyhhZGRyKTsKLX0KLQotLyoKLSAqIHNvbWVfaXBfb2sgLSBjaGVjayBhIHdvcmRsaXN0IHRvIHNlZSBpZiBpdCBhdXRob3JpemVzIGFueQotICogSVAgYWRkcmVzcyhlcykuCi0gKi8KLXN0YXRpYyBpbnQKLXNvbWVfaXBfb2soYWRkcnMpCi0gICAgc3RydWN0IHdvcmRsaXN0ICphZGRyczsKLXsKLSAgICBmb3IgKDsgYWRkcnMgIT0gMDsgYWRkcnMgPSBhZGRycy0+bmV4dCkgewotCWlmIChhZGRycy0+d29yZFswXSA9PSAnLScpCi0JICAgIGJyZWFrOwotCWlmIChhZGRycy0+d29yZFswXSAhPSAnIScpCi0JICAgIHJldHVybiAxOwkJLyogc29tZSBJUCBhZGRyZXNzIGlzIGFsbG93ZWQgKi8KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBhdXRoX251bWJlciAtIGNoZWNrIHdoZXRoZXIgdGhlIHJlbW90ZSBudW1iZXIgaXMgYWxsb3dlZCB0byBjb25uZWN0LgotICogUmV0dXJucyAxIGlmIGF1dGhvcml6ZWQsIDAgb3RoZXJ3aXNlLgotICovCi1pbnQKLWF1dGhfbnVtYmVyKCkKLXsKLSAgICBzdHJ1Y3Qgd29yZGxpc3QgKndwID0gcGVybWl0dGVkX251bWJlcnM7Ci0gICAgaW50IGw7Ci0KLSAgICAvKiBBbGxvdyBhbGwgaWYgbm8gYXV0aG9yaXphdGlvbiBsaXN0LiAqLwotICAgIGlmICghd3ApCi0JcmV0dXJuIDE7Ci0KLSAgICAvKiBBbGxvdyBpZiB3ZSBoYXZlIGEgbWF0Y2ggaW4gdGhlIGF1dGhvcml6YXRpb24gbGlzdC4gKi8KLSAgICB3aGlsZSAod3ApIHsKLQkvKiB0cmFpbGluZyAnKicgd2lsZGNhcmQgKi8KLQlsID0gc3RybGVuKHdwLT53b3JkKTsKLQlpZiAoKHdwLT53b3JkKVtsIC0gMV0gPT0gJyonKQotCSAgICBsLS07Ci0JaWYgKCFzdHJuY2FzZWNtcCh3cC0+d29yZCwgcmVtb3RlX251bWJlciwgbCkpCi0JICAgIHJldHVybiAxOwotCXdwID0gd3AtPm5leHQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBjaGVja19hY2Nlc3MgLSBjb21wbGFpbiBpZiBhIHNlY3JldCBmaWxlIGhhcyB0b28tbGliZXJhbCBwZXJtaXNzaW9ucy4KLSAqLwotc3RhdGljIHZvaWQKLWNoZWNrX2FjY2VzcyhmLCBmaWxlbmFtZSkKLSAgICBGSUxFICpmOwotICAgIGNoYXIgKmZpbGVuYW1lOwotewotICAgIHN0cnVjdCBzdGF0IHNidWY7Ci0KLSAgICBpZiAoZnN0YXQoZmlsZW5vKGYpLCAmc2J1ZikgPCAwKSB7Ci0Jd2FybigiY2Fubm90IHN0YXQgc2VjcmV0IGZpbGUgJXM6ICVtIiwgZmlsZW5hbWUpOwotICAgIH0gZWxzZSBpZiAoKHNidWYuc3RfbW9kZSAmIChTX0lSV1hHIHwgU19JUldYTykpICE9IDApIHsKLQl3YXJuKCJXYXJuaW5nIC0gc2VjcmV0IGZpbGUgJXMgaGFzIHdvcmxkIGFuZC9vciBncm91cCBhY2Nlc3MiLAotCSAgICAgZmlsZW5hbWUpOwotICAgIH0KLX0KLQotCi0vKgotICogc2Nhbl9hdXRoZmlsZSAtIFNjYW4gYW4gYXV0aG9yaXphdGlvbiBmaWxlIGZvciBhIHNlY3JldCBzdWl0YWJsZQotICogZm9yIGF1dGhlbnRpY2F0aW5nIGBjbGllbnQnIG9uIGBzZXJ2ZXInLiAgVGhlIHJldHVybiB2YWx1ZSBpcyAtMQotICogaWYgbm8gc2VjcmV0IGlzIGZvdW5kLCBvdGhlcndpc2UgPj0gMC4gIFRoZSByZXR1cm4gdmFsdWUgaGFzCi0gKiBOT05XSUxEX0NMSUVOVCBzZXQgaWYgdGhlIHNlY3JldCBkaWRuJ3QgaGF2ZSAiKiIgZm9yIHRoZSBjbGllbnQsIGFuZAotICogTk9OV0lMRF9TRVJWRVIgc2V0IGlmIHRoZSBzZWNyZXQgZGlkbid0IGhhdmUgIioiIGZvciB0aGUgc2VydmVyLgotICogQW55IGZvbGxvd2luZyB3b3JkcyBvbiB0aGUgbGluZSB1cCB0byBhICItLSIgKGkuZS4gYWRkcmVzcyBhdXRob3JpemF0aW9uCi0gKiBpbmZvKSBhcmUgcGxhY2VkIGluIGEgd29yZGxpc3QgYW5kIHJldHVybmVkIGluICphZGRycy4gIEFueQotICogZm9sbG93aW5nIHdvcmRzIChleHRyYSBvcHRpb25zKSBhcmUgcGxhY2VkIGluIGEgd29yZGxpc3QgYW5kCi0gKiByZXR1cm5lZCBpbiAqb3B0cy4KLSAqIFdlIGFzc3VtZSBzZWNyZXQgaXMgTlVMTCBvciBwb2ludHMgdG8gTUFYV09SRExFTiBieXRlcyBvZiBzcGFjZS4KLSAqIEZsYWdzIGFyZSBub24temVybyBpZiB3ZSBuZWVkIHR3byBjb2xvbnMgaW4gdGhlIHNlY3JldCBpbiBvcmRlciB0bwotICogbWF0Y2guCi0gKi8KLXN0YXRpYyBpbnQKLXNjYW5fYXV0aGZpbGUoZiwgY2xpZW50LCBzZXJ2ZXIsIHNlY3JldCwgYWRkcnMsIG9wdHMsIGZpbGVuYW1lLCBmbGFncykKLSAgICBGSUxFICpmOwotICAgIGNoYXIgKmNsaWVudDsKLSAgICBjaGFyICpzZXJ2ZXI7Ci0gICAgY2hhciAqc2VjcmV0OwotICAgIHN0cnVjdCB3b3JkbGlzdCAqKmFkZHJzOwotICAgIHN0cnVjdCB3b3JkbGlzdCAqKm9wdHM7Ci0gICAgY2hhciAqZmlsZW5hbWU7Ci0gICAgaW50IGZsYWdzOwotewotICAgIGludCBuZXdsaW5lLCB4eHg7Ci0gICAgaW50IGdvdF9mbGFnLCBiZXN0X2ZsYWc7Ci0gICAgRklMRSAqc2Y7Ci0gICAgc3RydWN0IHdvcmRsaXN0ICphcCwgKmFkZHJfbGlzdCwgKmFsaXN0LCAqKmFwcDsKLSAgICBjaGFyIHdvcmRbTUFYV09SRExFTl07Ci0gICAgY2hhciBhdGZpbGVbTUFYV09SRExFTl07Ci0gICAgY2hhciBsc2VjcmV0W01BWFdPUkRMRU5dOwotICAgIGNoYXIgKmNwOwotCi0gICAgaWYgKGFkZHJzICE9IE5VTEwpCi0JKmFkZHJzID0gTlVMTDsKLSAgICBpZiAob3B0cyAhPSBOVUxMKQotCSpvcHRzID0gTlVMTDsKLSAgICBhZGRyX2xpc3QgPSBOVUxMOwotICAgIGlmICghZ2V0d29yZChmLCB3b3JkLCAmbmV3bGluZSwgZmlsZW5hbWUpKQotCXJldHVybiAtMTsJCS8qIGZpbGUgaXMgZW1wdHk/Pz8gKi8KLSAgICBuZXdsaW5lID0gMTsKLSAgICBiZXN0X2ZsYWcgPSAtMTsKLSAgICBmb3IgKDs7KSB7Ci0JLyoKLQkgKiBTa2lwIHVudGlsIHdlIGZpbmQgYSB3b3JkIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuCi0JICovCi0Jd2hpbGUgKCFuZXdsaW5lICYmIGdldHdvcmQoZiwgd29yZCwgJm5ld2xpbmUsIGZpbGVuYW1lKSkKLQkgICAgOwotCWlmICghbmV3bGluZSkKLQkgICAgYnJlYWs7CQkvKiBnb3QgdG8gZW5kIG9mIGZpbGUgKi8KLQotCS8qCi0JICogR290IGEgY2xpZW50IC0gY2hlY2sgaWYgaXQncyBhIG1hdGNoIG9yIGEgd2lsZGNhcmQuCi0JICovCi0JZ290X2ZsYWcgPSAwOwotCWlmIChjbGllbnQgIT0gTlVMTCAmJiBzdHJjbXAod29yZCwgY2xpZW50KSAhPSAwICYmICFJU1dJTEQod29yZCkpIHsKLQkgICAgbmV3bGluZSA9IDA7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQlpZiAoIUlTV0lMRCh3b3JkKSkKLQkgICAgZ290X2ZsYWcgPSBOT05XSUxEX0NMSUVOVDsKLQotCS8qCi0JICogTm93IGdldCBhIHNlcnZlciBhbmQgY2hlY2sgaWYgaXQgbWF0Y2hlcy4KLQkgKi8KLQlpZiAoIWdldHdvcmQoZiwgd29yZCwgJm5ld2xpbmUsIGZpbGVuYW1lKSkKLQkgICAgYnJlYWs7Ci0JaWYgKG5ld2xpbmUpCi0JICAgIGNvbnRpbnVlOwotCWlmICghSVNXSUxEKHdvcmQpKSB7Ci0JICAgIGlmIChzZXJ2ZXIgIT0gTlVMTCAmJiBzdHJjbXAod29yZCwgc2VydmVyKSAhPSAwKQotCQljb250aW51ZTsKLQkgICAgZ290X2ZsYWcgfD0gTk9OV0lMRF9TRVJWRVI7Ci0JfQotCi0JLyoKLQkgKiBHb3Qgc29tZSBzb3J0IG9mIGEgbWF0Y2ggLSBzZWUgaWYgaXQncyBiZXR0ZXIgdGhhbiB3aGF0Ci0JICogd2UgaGF2ZSBhbHJlYWR5LgotCSAqLwotCWlmIChnb3RfZmxhZyA8PSBiZXN0X2ZsYWcpCi0JICAgIGNvbnRpbnVlOwotCi0JLyoKLQkgKiBHZXQgdGhlIHNlY3JldC4KLQkgKi8KLQlpZiAoIWdldHdvcmQoZiwgd29yZCwgJm5ld2xpbmUsIGZpbGVuYW1lKSkKLQkgICAgYnJlYWs7Ci0JaWYgKG5ld2xpbmUpCi0JICAgIGNvbnRpbnVlOwotCi0JLyoKLQkgKiBTUlAtU0hBMSBhdXRoZW50aWNhdG9yIHNob3VsZCBuZXZlciBiZSByZWFkaW5nIHNlY3JldHMgZnJvbQotCSAqIGEgZmlsZS4gIChBdXRoZW50aWNhdGVlIG1heSwgdGhvdWdoLikKLQkgKi8KLQlpZiAoZmxhZ3MgJiYgKChjcCA9IHN0cmNocih3b3JkLCAnOicpKSA9PSBOVUxMIHx8Ci0JICAgIHN0cmNocihjcCArIDEsICc6JykgPT0gTlVMTCkpCi0JICAgIGNvbnRpbnVlOwotCi0JaWYgKHNlY3JldCAhPSBOVUxMKSB7Ci0JICAgIC8qCi0JICAgICAqIFNwZWNpYWwgc3ludGF4OiBAL3BhdGhuYW1lIG1lYW5zIHJlYWQgc2VjcmV0IGZyb20gZmlsZS4KLQkgICAgICovCi0JICAgIGlmICh3b3JkWzBdID09ICdAJyAmJiB3b3JkWzFdID09ICcvJykgewotCQlzdHJsY3B5KGF0ZmlsZSwgd29yZCsxLCBzaXplb2YoYXRmaWxlKSk7Ci0JCWlmICgoc2YgPSBmb3BlbihhdGZpbGUsICJyIikpID09IE5VTEwpIHsKLQkJICAgIHdhcm4oImNhbid0IG9wZW4gaW5kaXJlY3Qgc2VjcmV0IGZpbGUgJXMiLCBhdGZpbGUpOwotCQkgICAgY29udGludWU7Ci0JCX0KLQkJY2hlY2tfYWNjZXNzKHNmLCBhdGZpbGUpOwotCQlpZiAoIWdldHdvcmQoc2YsIHdvcmQsICZ4eHgsIGF0ZmlsZSkpIHsKLQkJICAgIHdhcm4oIm5vIHNlY3JldCBpbiBpbmRpcmVjdCBzZWNyZXQgZmlsZSAlcyIsIGF0ZmlsZSk7Ci0JCSAgICBmY2xvc2Uoc2YpOwotCQkgICAgY29udGludWU7Ci0JCX0KLQkJZmNsb3NlKHNmKTsKLQkgICAgfQotCSAgICBzdHJsY3B5KGxzZWNyZXQsIHdvcmQsIHNpemVvZihsc2VjcmV0KSk7Ci0JfQotCi0JLyoKLQkgKiBOb3cgcmVhZCBhZGRyZXNzIGF1dGhvcml6YXRpb24gaW5mbyBhbmQgbWFrZSBhIHdvcmRsaXN0LgotCSAqLwotCWFwcCA9ICZhbGlzdDsKLQlmb3IgKDs7KSB7Ci0JICAgIGlmICghZ2V0d29yZChmLCB3b3JkLCAmbmV3bGluZSwgZmlsZW5hbWUpIHx8IG5ld2xpbmUpCi0JCWJyZWFrOwotCSAgICBhcCA9IChzdHJ1Y3Qgd29yZGxpc3QgKikKLQkJICAgIG1hbGxvYyhzaXplb2Yoc3RydWN0IHdvcmRsaXN0KSArIHN0cmxlbih3b3JkKSArIDEpOwotCSAgICBpZiAoYXAgPT0gTlVMTCkKLQkJbm92bSgiYXV0aG9yaXplZCBhZGRyZXNzZXMiKTsKLQkgICAgYXAtPndvcmQgPSAoY2hhciAqKSAoYXAgKyAxKTsKLQkgICAgc3RyY3B5KGFwLT53b3JkLCB3b3JkKTsKLQkgICAgKmFwcCA9IGFwOwotCSAgICBhcHAgPSAmYXAtPm5leHQ7Ci0JfQotCSphcHAgPSBOVUxMOwotCi0JLyoKLQkgKiBUaGlzIGlzIHRoZSBiZXN0IHNvIGZhcjsgcmVtZW1iZXIgaXQuCi0JICovCi0JYmVzdF9mbGFnID0gZ290X2ZsYWc7Ci0JaWYgKGFkZHJfbGlzdCkKLQkgICAgZnJlZV93b3JkbGlzdChhZGRyX2xpc3QpOwotCWFkZHJfbGlzdCA9IGFsaXN0OwotCWlmIChzZWNyZXQgIT0gTlVMTCkKLQkgICAgc3RybGNweShzZWNyZXQsIGxzZWNyZXQsIE1BWFdPUkRMRU4pOwotCi0JaWYgKCFuZXdsaW5lKQotCSAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBzY2FuIGZvciBhIC0tIHdvcmQgaW5kaWNhdGluZyB0aGUgc3RhcnQgb2Ygb3B0aW9ucyAqLwotICAgIGZvciAoYXBwID0gJmFkZHJfbGlzdDsgKGFwID0gKmFwcCkgIT0gTlVMTDsgYXBwID0gJmFwLT5uZXh0KQotCWlmIChzdHJjbXAoYXAtPndvcmQsICItLSIpID09IDApCi0JICAgIGJyZWFrOwotICAgIC8qIGFwID0gc3RhcnQgb2Ygb3B0aW9ucyAqLwotICAgIGlmIChhcCAhPSBOVUxMKSB7Ci0JYXAgPSBhcC0+bmV4dDsJCS8qIGZpcnN0IG9wdGlvbiAqLwotCWZyZWUoKmFwcCk7CQkJLyogZnJlZSB0aGUgIi0tIiB3b3JkICovCi0JKmFwcCA9IE5VTEw7CQkvKiB0ZXJtaW5hdGUgYWRkciBsaXN0ICovCi0gICAgfQotICAgIGlmIChvcHRzICE9IE5VTEwpCi0JKm9wdHMgPSBhcDsKLSAgICBlbHNlIGlmIChhcCAhPSBOVUxMKQotCWZyZWVfd29yZGxpc3QoYXApOwotICAgIGlmIChhZGRycyAhPSBOVUxMKQotCSphZGRycyA9IGFkZHJfbGlzdDsKLSAgICBlbHNlIGlmIChhZGRyX2xpc3QgIT0gTlVMTCkKLQlmcmVlX3dvcmRsaXN0KGFkZHJfbGlzdCk7Ci0KLSAgICByZXR1cm4gYmVzdF9mbGFnOwotfQotCi0vKgotICogd29yZGxpc3RfY291bnQgLSByZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBpbiBhIHdvcmRsaXN0Ci0gKi8KLXN0YXRpYyBpbnQKLXdvcmRsaXN0X2NvdW50KHdwKQotICAgIHN0cnVjdCB3b3JkbGlzdCAqd3A7Ci17Ci0gICAgaW50IG47Ci0KLSAgICBmb3IgKG4gPSAwOyB3cCAhPSBOVUxMOyB3cCA9IHdwLT5uZXh0KQotCSsrbjsKLSAgICByZXR1cm4gbjsKLX0KLQotLyoKLSAqIGZyZWVfd29yZGxpc3QgLSByZWxlYXNlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGEgd29yZGxpc3QuCi0gKi8KLXN0YXRpYyB2b2lkCi1mcmVlX3dvcmRsaXN0KHdwKQotICAgIHN0cnVjdCB3b3JkbGlzdCAqd3A7Ci17Ci0gICAgc3RydWN0IHdvcmRsaXN0ICpuZXh0OwotCi0gICAgd2hpbGUgKHdwICE9IE5VTEwpIHsKLQluZXh0ID0gd3AtPm5leHQ7Ci0JZnJlZSh3cCk7Ci0Jd3AgPSBuZXh0OwotICAgIH0KLX0KLQotLyoKLSAqIGF1dGhfc2NyaXB0X2RvbmUgLSBjYWxsZWQgd2hlbiB0aGUgYXV0aC11cCBvciBhdXRoLWRvd24gc2NyaXB0Ci0gKiBoYXMgZmluaXNoZWQuCi0gKi8KLXN0YXRpYyB2b2lkCi1hdXRoX3NjcmlwdF9kb25lKGFyZykKLSAgICB2b2lkICphcmc7Ci17Ci0gICAgYXV0aF9zY3JpcHRfcGlkID0gMDsKLSAgICBzd2l0Y2ggKGF1dGhfc2NyaXB0X3N0YXRlKSB7Ci0gICAgY2FzZSBzX3VwOgotCWlmIChhdXRoX3N0YXRlID09IHNfZG93bikgewotCSAgICBhdXRoX3NjcmlwdF9zdGF0ZSA9IHNfZG93bjsKLQkgICAgYXV0aF9zY3JpcHQoX1BBVEhfQVVUSERPV04pOwotCX0KLQlicmVhazsKLSAgICBjYXNlIHNfZG93bjoKLQlpZiAoYXV0aF9zdGF0ZSA9PSBzX3VwKSB7Ci0JICAgIGF1dGhfc2NyaXB0X3N0YXRlID0gc191cDsKLQkgICAgYXV0aF9zY3JpcHQoX1BBVEhfQVVUSFVQKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotfQotCi0vKgotICogYXV0aF9zY3JpcHQgLSBleGVjdXRlIGEgc2NyaXB0IHdpdGggYXJndW1lbnRzCi0gKiBpbnRlcmZhY2UtbmFtZSBwZWVyLW5hbWUgcmVhbC11c2VyIHR0eSBzcGVlZAotICovCi1zdGF0aWMgdm9pZAotYXV0aF9zY3JpcHQoc2NyaXB0KQotICAgIGNoYXIgKnNjcmlwdDsKLXsKLSAgICBjaGFyIHN0cnNwZWVkWzMyXTsKLSAgICBzdHJ1Y3QgcGFzc3dkICpwdzsKLSAgICBjaGFyIHN0cnVpZFszMl07Ci0gICAgY2hhciAqdXNlcl9uYW1lOwotICAgIGNoYXIgKmFyZ3ZbOF07Ci0KLSAgICBpZiAoKHB3ID0gZ2V0cHd1aWQoZ2V0dWlkKCkpKSAhPSBOVUxMICYmIHB3LT5wd19uYW1lICE9IE5VTEwpCi0JdXNlcl9uYW1lID0gcHctPnB3X25hbWU7Ci0gICAgZWxzZSB7Ci0Jc2xwcmludGYoc3RydWlkLCBzaXplb2Yoc3RydWlkKSwgIiVkIiwgZ2V0dWlkKCkpOwotCXVzZXJfbmFtZSA9IHN0cnVpZDsKLSAgICB9Ci0gICAgc2xwcmludGYoc3Ryc3BlZWQsIHNpemVvZihzdHJzcGVlZCksICIlZCIsIGJhdWRfcmF0ZSk7Ci0KLSAgICBhcmd2WzBdID0gc2NyaXB0OwotICAgIGFyZ3ZbMV0gPSBpZm5hbWU7Ci0gICAgYXJndlsyXSA9IHBlZXJfYXV0aG5hbWU7Ci0gICAgYXJndlszXSA9IHVzZXJfbmFtZTsKLSAgICBhcmd2WzRdID0gZGV2bmFtOwotICAgIGFyZ3ZbNV0gPSBzdHJzcGVlZDsKLSAgICBhcmd2WzZdID0gTlVMTDsKLQotICAgIGF1dGhfc2NyaXB0X3BpZCA9IHJ1bl9wcm9ncmFtKHNjcmlwdCwgYXJndiwgMCwgYXV0aF9zY3JpcHRfZG9uZSwgTlVMTCwgMCk7Ci19CmRpZmYgLS1naXQgYS9wcHBkL2NiY3AuYyBiL3BwcGQvY2JjcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjJmNzg3Li4wMDAwMDAwCi0tLSBhL3BwcGQvY2JjcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDg4ICswLDAgQEAKLS8qCi0gKiBjYmNwIC0gQ2FsbCBCYWNrIENvbmZpZ3VyYXRpb24gUHJvdG9jb2wuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk1IFBlZHJvIFJvcXVlIE1hcnF1ZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYXV0aG9ycyBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogNC4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBQZWRybyBSb3F1ZSBNYXJxdWVzCi0gKiAgICAgPHBlZHJvX21AeWFob28uY29tPiIKLSAqCi0gKiBUSEUgQVVUSE9SUyBPRiBUSElTIFNPRlRXQVJFIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi0gKiBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLSAqIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLSAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLSAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNkZWZpbmUgUkNTSUQJIiRJZDogY2JjcC5jLHYgMS4xNyAyMDA2LzA1LzIyIDAwOjA0OjA3IHBhdWx1cyBFeHAgJCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotI2luY2x1ZGUgInBwcGQuaCIKLSNpbmNsdWRlICJjYmNwLmgiCi0jaW5jbHVkZSAiZnNtLmgiCi0jaW5jbHVkZSAibGNwLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gPSBSQ1NJRDsKLQotLyoKLSAqIE9wdGlvbnMuCi0gKi8KLXN0YXRpYyBpbnQgc2V0Y2JjcCBfX1AoKGNoYXIgKiopKTsKLQotc3RhdGljIG9wdGlvbl90IGNiY3Bfb3B0aW9uX2xpc3RbXSA9IHsKLSAgICB7ICJjYWxsYmFjayIsIG9fc3BlY2lhbCwgKHZvaWQgKilzZXRjYmNwLAotICAgICAgIkFzayBmb3IgY2FsbGJhY2siLCBPUFRfUFJJTyB8IE9QVF9BMlNUUlZBTCwgJmNiY3BbMF0udXNfbnVtYmVyIH0sCi0gICAgeyBOVUxMIH0KLX07Ci0KLS8qCi0gKiBQcm90b2NvbCBlbnRyeSBwb2ludHMuCi0gKi8KLXN0YXRpYyB2b2lkIGNiY3BfaW5pdCAgICAgIF9fUCgoaW50IHVuaXQpKTsKLXN0YXRpYyB2b2lkIGNiY3Bfb3BlbiAgICAgIF9fUCgoaW50IHVuaXQpKTsKLXN0YXRpYyB2b2lkIGNiY3BfbG93ZXJ1cCAgIF9fUCgoaW50IHVuaXQpKTsKLXN0YXRpYyB2b2lkIGNiY3BfaW5wdXQgICAgIF9fUCgoaW50IHVuaXQsIHVfY2hhciAqcGt0LCBpbnQgbGVuKSk7Ci1zdGF0aWMgdm9pZCBjYmNwX3Byb3RyZWogICBfX1AoKGludCB1bml0KSk7Ci1zdGF0aWMgaW50ICBjYmNwX3ByaW50cGt0ICBfX1AoKHVfY2hhciAqcGt0LCBpbnQgbGVuLAotCQkJCXZvaWQgKCpwcmludGVyKSBfX1AoKHZvaWQgKiwgY2hhciAqLCAuLi4pKSwKLQkJCQl2b2lkICphcmcpKTsKLQotc3RydWN0IHByb3RlbnQgY2JjcF9wcm90ZW50ID0gewotICAgIFBQUF9DQkNQLAotICAgIGNiY3BfaW5pdCwKLSAgICBjYmNwX2lucHV0LAotICAgIGNiY3BfcHJvdHJlaiwKLSAgICBjYmNwX2xvd2VydXAsCi0gICAgTlVMTCwKLSAgICBjYmNwX29wZW4sCi0gICAgTlVMTCwKLSAgICBjYmNwX3ByaW50cGt0LAotICAgIE5VTEwsCi0gICAgMCwKLSAgICAiQ0JDUCIsCi0gICAgTlVMTCwKLSAgICBjYmNwX29wdGlvbl9saXN0LAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMCi19OwotCi1jYmNwX3N0YXRlIGNiY3BbTlVNX1BQUF07CQotCi0vKiBpbnRlcm5hbCBwcm90b3R5cGVzICovCi0KLXN0YXRpYyB2b2lkIGNiY3BfcmVjdnJlcSBfX1AoKGNiY3Bfc3RhdGUgKnVzLCB1X2NoYXIgKnBja3QsIGludCBsZW4pKTsKLXN0YXRpYyB2b2lkIGNiY3BfcmVzcCBfX1AoKGNiY3Bfc3RhdGUgKnVzKSk7Ci1zdGF0aWMgdm9pZCBjYmNwX3VwIF9fUCgoY2JjcF9zdGF0ZSAqdXMpKTsKLXN0YXRpYyB2b2lkIGNiY3BfcmVjdmFjayBfX1AoKGNiY3Bfc3RhdGUgKnVzLCB1X2NoYXIgKnBja3QsIGludCBsZW4pKTsKLXN0YXRpYyB2b2lkIGNiY3Bfc2VuZCBfX1AoKGNiY3Bfc3RhdGUgKnVzLCBpbnQgY29kZSwgdV9jaGFyICpidWYsIGludCBsZW4pKTsKLQotLyogb3B0aW9uIHByb2Nlc3NpbmcgKi8KLXN0YXRpYyBpbnQKLXNldGNiY3AoYXJndikKLSAgICBjaGFyICoqYXJndjsKLXsKLSAgICBsY3Bfd2FudG9wdGlvbnNbMF0ubmVnX2NiY3AgPSAxOwotICAgIGNiY3BfcHJvdGVudC5lbmFibGVkX2ZsYWcgPSAxOwotICAgIGNiY3BbMF0udXNfbnVtYmVyID0gc3RyZHVwKCphcmd2KTsKLSAgICBpZiAoY2JjcFswXS51c19udW1iZXIgPT0gMCkKLQlub3ZtKCJjYWxsYmFjayBudW1iZXIiKTsKLSAgICBjYmNwWzBdLnVzX3R5cGUgfD0gKDEgPDwgQ0JfQ09ORl9VU0VSKTsKLSAgICBjYmNwWzBdLnVzX3R5cGUgfD0gKDEgPDwgQ0JfQ09ORl9BRE1JTik7Ci0gICAgcmV0dXJuICgxKTsKLX0KLQotLyogaW5pdCBzdGF0ZSAqLwotc3RhdGljIHZvaWQKLWNiY3BfaW5pdChpZmFjZSkKLSAgICBpbnQgaWZhY2U7Ci17Ci0gICAgY2JjcF9zdGF0ZSAqdXM7Ci0KLSAgICB1cyA9ICZjYmNwW2lmYWNlXTsKLSAgICBtZW1zZXQodXMsIDAsIHNpemVvZihjYmNwX3N0YXRlKSk7Ci0gICAgdXMtPnVzX3VuaXQgPSBpZmFjZTsKLSAgICB1cy0+dXNfdHlwZSB8PSAoMSA8PCBDQl9DT05GX05PKTsKLX0KLQotLyogbG93ZXIgbGF5ZXIgaXMgdXAgKi8KLXN0YXRpYyB2b2lkCi1jYmNwX2xvd2VydXAoaWZhY2UpCi0gICAgaW50IGlmYWNlOwotewotICAgIGNiY3Bfc3RhdGUgKnVzID0gJmNiY3BbaWZhY2VdOwotCi0gICAgZGJnbG9nKCJjYmNwX2xvd2VydXAiKTsKLSAgICBkYmdsb2coIndhbnQ6ICVkIiwgdXMtPnVzX3R5cGUpOwotCi0gICAgaWYgKHVzLT51c190eXBlID09IENCX0NPTkZfVVNFUikKLSAgICAgICAgZGJnbG9nKCJwaG9uZSBubzogJXMiLCB1cy0+dXNfbnVtYmVyKTsKLX0KLQotc3RhdGljIHZvaWQKLWNiY3Bfb3Blbih1bml0KQotICAgIGludCB1bml0OwotewotICAgIGRiZ2xvZygiY2JjcF9vcGVuIik7Ci19Ci0KLS8qIHByb2Nlc3MgYW4gaW5jb21taW5nIHBhY2tldCAqLwotc3RhdGljIHZvaWQKLWNiY3BfaW5wdXQodW5pdCwgaW5wYWNrZXQsIHBrdGxlbikKLSAgICBpbnQgdW5pdDsKLSAgICB1X2NoYXIgKmlucGFja2V0OwotICAgIGludCBwa3RsZW47Ci17Ci0gICAgdV9jaGFyICppbnA7Ci0gICAgdV9jaGFyIGNvZGUsIGlkOwotICAgIHVfc2hvcnQgbGVuOwotCi0gICAgY2JjcF9zdGF0ZSAqdXMgPSAmY2JjcFt1bml0XTsKLQotICAgIGlucCA9IGlucGFja2V0OwotCi0gICAgaWYgKHBrdGxlbiA8IENCQ1BfTUlOTEVOKSB7Ci0JaWYgKGRlYnVnKQotCSAgICBkYmdsb2coIkNCQ1AgcGFja2V0IGlzIHRvbyBzbWFsbCIpOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICBHRVRDSEFSKGNvZGUsIGlucCk7Ci0gICAgR0VUQ0hBUihpZCwgaW5wKTsKLSAgICBHRVRTSE9SVChsZW4sIGlucCk7Ci0KLSAgICBpZiAobGVuID4gcGt0bGVuIHx8IGxlbiA8IENCQ1BfTUlOTEVOKSB7Ci0JaWYgKGRlYnVnKQotCSAgICBkYmdsb2coIkNCQ1AgcGFja2V0OiBpbnZhbGlkIGxlbmd0aCAlZCIsIGxlbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBsZW4gLT0gQ0JDUF9NSU5MRU47Ci0gCi0gICAgc3dpdGNoKGNvZGUpIHsKLSAgICBjYXNlIENCQ1BfUkVROgotICAgICAgICB1cy0+dXNfaWQgPSBpZDsKLQljYmNwX3JlY3ZyZXEodXMsIGlucCwgbGVuKTsKLQlicmVhazsKLQotICAgIGNhc2UgQ0JDUF9SRVNQOgotCWlmIChkZWJ1ZykKLQkgICAgZGJnbG9nKCJDQkNQX1JFU1AgcmVjZWl2ZWQiKTsKLQlicmVhazsKLQotICAgIGNhc2UgQ0JDUF9BQ0s6Ci0JaWYgKGRlYnVnICYmIGlkICE9IHVzLT51c19pZCkKLQkgICAgZGJnbG9nKCJpZCBkb2Vzbid0IG1hdGNoOiBleHBlY3RlZCAlZCByZWN2ICVkIiwKLQkJICAgdXMtPnVzX2lkLCBpZCk7Ci0KLQljYmNwX3JlY3ZhY2sodXMsIGlucCwgbGVuKTsKLQlicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0JYnJlYWs7Ci0gICAgfQotfQotCi0vKiBwcm90b2NvbCB3YXMgcmVqZWN0ZWQgYnkgZm9lICovCi12b2lkIGNiY3BfcHJvdHJlaihpbnQgaWZhY2UpCi17Ci19Ci0KLWNoYXIgKmNiY3BfY29kZW5hbWVzW10gPSB7Ci0gICAgIlJlcXVlc3QiLCAiUmVzcG9uc2UiLCAiQWNrIgotfTsKLQotY2hhciAqY2JjcF9vcHRpb25uYW1lc1tdID0gewotICAgICJOb0NhbGxiYWNrIiwKLSAgICAiVXNlckRlZmluZWQiLAotICAgICJBZG1pbkRlZmluZWQiLAotICAgICJMaXN0IgotfTsKLQotLyogcHJldHR5IHByaW50IGEgcGFja2V0ICovCi1zdGF0aWMgaW50Ci1jYmNwX3ByaW50cGt0KHAsIHBsZW4sIHByaW50ZXIsIGFyZykKLSAgICB1X2NoYXIgKnA7Ci0gICAgaW50IHBsZW47Ci0gICAgdm9pZCAoKnByaW50ZXIpIF9fUCgodm9pZCAqLCBjaGFyICosIC4uLikpOwotICAgIHZvaWQgKmFyZzsKLXsKLSAgICBpbnQgY29kZSwgb3B0LCBpZCwgbGVuLCBvbGVuLCBkZWxheTsKLSAgICB1X2NoYXIgKnBzdGFydDsKLQotICAgIGlmIChwbGVuIDwgSEVBREVSTEVOKQotCXJldHVybiAwOwotICAgIHBzdGFydCA9IHA7Ci0gICAgR0VUQ0hBUihjb2RlLCBwKTsKLSAgICBHRVRDSEFSKGlkLCBwKTsKLSAgICBHRVRTSE9SVChsZW4sIHApOwotICAgIGlmIChsZW4gPCBIRUFERVJMRU4gfHwgbGVuID4gcGxlbikKLQlyZXR1cm4gMDsKLQotICAgIGlmIChjb2RlID49IDEgJiYgY29kZSA8PSBzaXplb2YoY2JjcF9jb2RlbmFtZXMpIC8gc2l6ZW9mKGNoYXIgKikpCi0JcHJpbnRlcihhcmcsICIgJXMiLCBjYmNwX2NvZGVuYW1lc1tjb2RlLTFdKTsKLSAgICBlbHNlCi0JcHJpbnRlcihhcmcsICIgY29kZT0weCV4IiwgY29kZSk7IAotCi0gICAgcHJpbnRlcihhcmcsICIgaWQ9MHgleCIsIGlkKTsKLSAgICBsZW4gLT0gSEVBREVSTEVOOwotCi0gICAgc3dpdGNoIChjb2RlKSB7Ci0gICAgY2FzZSBDQkNQX1JFUToKLSAgICBjYXNlIENCQ1BfUkVTUDoKLSAgICBjYXNlIENCQ1BfQUNLOgotICAgICAgICB3aGlsZShsZW4gPj0gMikgewotCSAgICBHRVRDSEFSKG9wdCwgcCk7Ci0JICAgIEdFVENIQVIob2xlbiwgcCk7Ci0KLQkgICAgaWYgKG9sZW4gPCAyIHx8IG9sZW4gPiBsZW4pIHsKLQkgICAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgICAgcHJpbnRlcihhcmcsICIgPCIpOwotCSAgICBsZW4gLT0gb2xlbjsKLQotCSAgICBpZiAob3B0ID49IDEgJiYgb3B0IDw9IHNpemVvZihjYmNwX29wdGlvbm5hbWVzKSAvIHNpemVvZihjaGFyICopKQotCSAgICAJcHJpbnRlcihhcmcsICIgJXMiLCBjYmNwX29wdGlvbm5hbWVzW29wdC0xXSk7Ci0JICAgIGVsc2UKLQkgICAgICAgIHByaW50ZXIoYXJnLCAiIG9wdGlvbj0weCV4Iiwgb3B0KTsgCi0KLQkgICAgaWYgKG9sZW4gPiAyKSB7Ci0JICAgICAgICBHRVRDSEFSKGRlbGF5LCBwKTsKLQkJcHJpbnRlcihhcmcsICIgZGVsYXkgPSAlZCIsIGRlbGF5KTsKLQkgICAgfQotCi0JICAgIGlmIChvbGVuID4gMykgewotCSAgICAgICAgaW50IGFkZHJ0OwotCQljaGFyIHN0clsyNTZdOwotCi0JCUdFVENIQVIoYWRkcnQsIHApOwotCQltZW1jcHkoc3RyLCBwLCBvbGVuIC0gNCk7Ci0JCXN0cltvbGVuIC0gNF0gPSAwOwotCQlwcmludGVyKGFyZywgIiBudW1iZXIgPSAlcyIsIHN0cik7Ci0JICAgIH0KLQkgICAgcHJpbnRlcihhcmcsICI+Iik7Ci0JfQotCWJyZWFrOwotCi0gICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICB9Ci0KLSAgICBmb3IgKDsgbGVuID4gMDsgLS1sZW4pIHsKLQlHRVRDSEFSKGNvZGUsIHApOwotCXByaW50ZXIoYXJnLCAiICUuMngiLCBjb2RlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcCAtIHBzdGFydDsKLX0KLQotLyogcmVjZWl2ZWQgQ0JDUCByZXF1ZXN0ICovCi1zdGF0aWMgdm9pZAotY2JjcF9yZWN2cmVxKHVzLCBwY2t0LCBwY2t0bGVuKQotICAgIGNiY3Bfc3RhdGUgKnVzOwotICAgIHVfY2hhciAqcGNrdDsKLSAgICBpbnQgcGNrdGxlbjsKLXsKLSAgICB1X2NoYXIgdHlwZSwgb3B0X2xlbiwgZGVsYXksIGFkZHJfdHlwZTsKLSAgICBjaGFyIGFkZHJlc3NbMjU2XTsKLSAgICBpbnQgbGVuID0gcGNrdGxlbjsKLQotICAgIGFkZHJlc3NbMF0gPSAwOwotCi0gICAgd2hpbGUgKGxlbiA+PSAyKSB7Ci0gICAgICAgIGRiZ2xvZygibGVuZ3RoOiAlZCIsIGxlbik7Ci0KLQlHRVRDSEFSKHR5cGUsIHBja3QpOwotCUdFVENIQVIob3B0X2xlbiwgcGNrdCk7Ci0JaWYgKG9wdF9sZW4gPCAyIHx8IG9wdF9sZW4gPiBsZW4pCi0JICAgIGJyZWFrOwotCi0JaWYgKG9wdF9sZW4gPiAyKQotCSAgICBHRVRDSEFSKGRlbGF5LCBwY2t0KTsKLQotCXVzLT51c19hbGxvd2VkIHw9ICgxIDw8IHR5cGUpOwotCi0Jc3dpdGNoKHR5cGUpIHsKLQljYXNlIENCX0NPTkZfTk86Ci0JICAgIGRiZ2xvZygibm8gY2FsbGJhY2sgYWxsb3dlZCIpOwotCSAgICBicmVhazsKLQotCWNhc2UgQ0JfQ09ORl9VU0VSOgotCSAgICBkYmdsb2coInVzZXIgY2FsbGJhY2sgYWxsb3dlZCIpOwotCSAgICBpZiAob3B0X2xlbiA+IDQpIHsKLQkgICAgICAgIEdFVENIQVIoYWRkcl90eXBlLCBwY2t0KTsKLQkJbWVtY3B5KGFkZHJlc3MsIHBja3QsIG9wdF9sZW4gLSA0KTsKLQkJYWRkcmVzc1tvcHRfbGVuIC0gNF0gPSAwOwotCQlpZiAoYWRkcmVzc1swXSkKLQkJICAgIGRiZ2xvZygiYWRkcmVzczogJXMiLCBhZGRyZXNzKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCWNhc2UgQ0JfQ09ORl9BRE1JTjoKLQkgICAgZGJnbG9nKCJ1c2VyIGFkbWluIGRlZmluZWQgYWxsb3dlZCIpOwotCSAgICBicmVhazsKLQotCWNhc2UgQ0JfQ09ORl9MSVNUOgotCSAgICBicmVhazsKLQl9Ci0JbGVuIC09IG9wdF9sZW47Ci0gICAgfQotICAgIGlmIChsZW4gIT0gMCkgewotCWlmIChkZWJ1ZykKLQkgICAgZGJnbG9nKCJjYmNwX3JlY3ZyZXE6IG1hbGZvcm1lZCBwYWNrZXQgKCVkIGJ5dGVzIGxlZnQpIiwgbGVuKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgY2JjcF9yZXNwKHVzKTsKLX0KLQotc3RhdGljIHZvaWQKLWNiY3BfcmVzcCh1cykKLSAgICBjYmNwX3N0YXRlICp1czsKLXsKLSAgICB1X2NoYXIgY2JfdHlwZTsKLSAgICB1X2NoYXIgYnVmWzI1Nl07Ci0gICAgdV9jaGFyICpidWZwID0gYnVmOwotICAgIGludCBsZW4gPSAwOwotICAgIGludCBzbGVuOwotCi0gICAgY2JfdHlwZSA9IHVzLT51c19hbGxvd2VkICYgdXMtPnVzX3R5cGU7Ci0gICAgZGJnbG9nKCJjYmNwX3Jlc3AgY2JfdHlwZT0lZCIsIGNiX3R5cGUpOwotCi0jaWYgMAotICAgIGlmICghY2JfdHlwZSkKLSAgICAgICAgbGNwX2Rvd24odXMtPnVzX3VuaXQpOwotI2VuZGlmCi0KLSAgICBpZiAoY2JfdHlwZSAmICggMSA8PCBDQl9DT05GX1VTRVIgKSApIHsKLQlkYmdsb2coImNiY3BfcmVzcCBDT05GX1VTRVIiKTsKLQlzbGVuID0gc3RybGVuKHVzLT51c19udW1iZXIpOwotCWlmIChzbGVuID4gMjUwKSB7Ci0JICAgIHdhcm4oImNhbGxiYWNrIG51bWJlciB0cnVuY2F0ZWQgdG8gMjUwIGNoYXJhY3RlcnMiKTsKLQkgICAgc2xlbiA9IDI1MDsKLQl9Ci0JUFVUQ0hBUihDQl9DT05GX1VTRVIsIGJ1ZnApOwotCWxlbiA9IDMgKyAxICsgc2xlbiArIDE7Ci0JUFVUQ0hBUihsZW4gLCBidWZwKTsKLQlQVVRDSEFSKDUsIGJ1ZnApOyAvKiBkZWxheSAqLwotCVBVVENIQVIoMSwgYnVmcCk7Ci0JQkNPUFkodXMtPnVzX251bWJlciwgYnVmcCwgc2xlbiArIDEpOwotCWNiY3Bfc2VuZCh1cywgQ0JDUF9SRVNQLCBidWYsIGxlbik7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChjYl90eXBlICYgKCAxIDw8IENCX0NPTkZfQURNSU4gKSApIHsKLQlkYmdsb2coImNiY3BfcmVzcCBDT05GX0FETUlOIik7Ci0gICAgICAgIFBVVENIQVIoQ0JfQ09ORl9BRE1JTiwgYnVmcCk7Ci0JbGVuID0gMzsKLQlQVVRDSEFSKGxlbiwgYnVmcCk7Ci0JUFVUQ0hBUig1LCBidWZwKTsgLyogZGVsYXkgKi8KLQljYmNwX3NlbmQodXMsIENCQ1BfUkVTUCwgYnVmLCBsZW4pOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoY2JfdHlwZSAmICggMSA8PCBDQl9DT05GX05PICkgKSB7Ci0gICAgICAgIGRiZ2xvZygiY2JjcF9yZXNwIENPTkZfTk8iKTsKLQlQVVRDSEFSKENCX0NPTkZfTk8sIGJ1ZnApOwotCWxlbiA9IDI7Ci0JUFVUQ0hBUihsZW4gLCBidWZwKTsKLQljYmNwX3NlbmQodXMsIENCQ1BfUkVTUCwgYnVmLCBsZW4pOwotCXN0YXJ0X25ldHdvcmtzKHVzLT51c191bml0KTsKLQlyZXR1cm47Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotY2JjcF9zZW5kKHVzLCBjb2RlLCBidWYsIGxlbikKLSAgICBjYmNwX3N0YXRlICp1czsKLSAgICBpbnQgY29kZTsKLSAgICB1X2NoYXIgKmJ1ZjsKLSAgICBpbnQgbGVuOwotewotICAgIHVfY2hhciAqb3V0cDsKLSAgICBpbnQgb3V0bGVuOwotCi0gICAgb3V0cCA9IG91dHBhY2tldF9idWY7Ci0KLSAgICBvdXRsZW4gPSA0ICsgbGVuOwotICAgIAotICAgIE1BS0VIRUFERVIob3V0cCwgUFBQX0NCQ1ApOwotCi0gICAgUFVUQ0hBUihjb2RlLCBvdXRwKTsKLSAgICBQVVRDSEFSKHVzLT51c19pZCwgb3V0cCk7Ci0gICAgUFVUU0hPUlQob3V0bGVuLCBvdXRwKTsKLSAgICAKLSAgICBpZiAobGVuKQotICAgICAgICBCQ09QWShidWYsIG91dHAsIGxlbik7Ci0KLSAgICBvdXRwdXQodXMtPnVzX3VuaXQsIG91dHBhY2tldF9idWYsIG91dGxlbiArIFBQUF9IRFJMRU4pOwotfQotCi1zdGF0aWMgdm9pZAotY2JjcF9yZWN2YWNrKHVzLCBwY2t0LCBsZW4pCi0gICAgY2JjcF9zdGF0ZSAqdXM7Ci0gICAgdV9jaGFyICpwY2t0OwotICAgIGludCBsZW47Ci17Ci0gICAgdV9jaGFyIHR5cGUsIGRlbGF5LCBhZGRyX3R5cGU7Ci0gICAgaW50IG9wdF9sZW47Ci0gICAgY2hhciBhZGRyZXNzWzI1Nl07Ci0KLSAgICBpZiAobGVuID49IDIpIHsKLSAgICAgICAgR0VUQ0hBUih0eXBlLCBwY2t0KTsKLQlHRVRDSEFSKG9wdF9sZW4sIHBja3QpOwotCWlmIChvcHRfbGVuID49IDIgJiYgb3B0X2xlbiA8PSBsZW4pIHsKLSAgICAgCi0JICAgIGlmIChvcHRfbGVuID4gMikKLQkJR0VUQ0hBUihkZWxheSwgcGNrdCk7Ci0KLQkgICAgaWYgKG9wdF9sZW4gPiA0KSB7Ci0JCUdFVENIQVIoYWRkcl90eXBlLCBwY2t0KTsKLQkJbWVtY3B5KGFkZHJlc3MsIHBja3QsIG9wdF9sZW4gLSA0KTsKLQkJYWRkcmVzc1tvcHRfbGVuIC0gNF0gPSAwOwotCQlpZiAoYWRkcmVzc1swXSkKLQkJICAgIGRiZ2xvZygicGVlciB3aWxsIGNhbGw6ICVzIiwgYWRkcmVzcyk7Ci0JICAgIH0KLQkgICAgaWYgKHR5cGUgPT0gQ0JfQ09ORl9OTykKLQkJcmV0dXJuOwotCi0JICAgIGNiY3BfdXAodXMpOwotCi0JfSBlbHNlIGlmIChkZWJ1ZykKLQkgICAgZGJnbG9nKCJjYmNwX3JlY3ZhY2s6IG1hbGZvcm1lZCBwYWNrZXQiKTsKLSAgICB9Ci19Ci0KLS8qIG9rIHBlZXIgd2lsbCBkbyBjYWxsYmFjayAqLwotc3RhdGljIHZvaWQKLWNiY3BfdXAodXMpCi0gICAgY2JjcF9zdGF0ZSAqdXM7Ci17Ci0gICAgcGVyc2lzdCA9IDA7Ci0gICAgc3RhdHVzID0gRVhJVF9DQUxMQkFDSzsKLSAgICBsY3BfY2xvc2UoMCwgIkNhbGwgbWUgYmFjaywgcGxlYXNlIik7Ci19CmRpZmYgLS1naXQgYS9wcHBkL2NiY3AuaCBiL3BwcGQvY2JjcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmFiM2Y2Li4wMDAwMDAwCi0tLSBhL3BwcGQvY2JjcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotI2lmbmRlZiBDQkNQX0gKLSNkZWZpbmUgQ0JDUF9ICi0KLXR5cGVkZWYgc3RydWN0IGNiY3Bfc3RhdGUgewotICAgIGludCAgICB1c191bml0OwkvKiBJbnRlcmZhY2UgdW5pdCBudW1iZXIgKi8KLSAgICB1X2NoYXIgdXNfaWQ7CQkvKiBDdXJyZW50IGlkICovCi0gICAgdV9jaGFyIHVzX2FsbG93ZWQ7Ci0gICAgaW50ICAgIHVzX3R5cGU7Ci0gICAgY2hhciAgICp1c19udW1iZXI7ICAgIC8qIFRlbGVmb25lIE51bWJlciAqLwotfSBjYmNwX3N0YXRlOwotCi1leHRlcm4gY2JjcF9zdGF0ZSBjYmNwW107Ci0KLWV4dGVybiBzdHJ1Y3QgcHJvdGVudCBjYmNwX3Byb3RlbnQ7Ci0KLSNkZWZpbmUgQ0JDUF9NSU5MRU4gNAotCi0jZGVmaW5lIENCQ1BfUkVRICAgIDEKLSNkZWZpbmUgQ0JDUF9SRVNQICAgMgotI2RlZmluZSBDQkNQX0FDSyAgICAzCi0KLSNkZWZpbmUgQ0JfQ09ORl9OTyAgICAgMQotI2RlZmluZSBDQl9DT05GX1VTRVIgICAyCi0jZGVmaW5lIENCX0NPTkZfQURNSU4gIDMKLSNkZWZpbmUgQ0JfQ09ORl9MSVNUICAgNAotI2VuZGlmCmRpZmYgLS1naXQgYS9wcHBkL2NjcC5jIGIvcHBwZC9jY3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgxNGYzNS4uMDAwMDAwMAotLS0gYS9wcHBkL2NjcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY3OCArMCwwIEBACi0vKgotICogY2NwLmMgLSBQUFAgQ29tcHJlc3Npb24gQ29udHJvbCBQcm90b2NvbC4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTQtMjAwMiBQYXVsIE1hY2tlcnJhcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFRoZSBuYW1lKHMpIG9mIHRoZSBhdXRob3JzIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiAzLiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFBhdWwgTWFja2VycmFzCi0gKiAgICAgPHBhdWx1c0BzYW1iYS5vcmc+Ii4KLSAqCi0gKiBUSEUgQVVUSE9SUyBPRiBUSElTIFNPRlRXQVJFIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi0gKiBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLSAqIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLSAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLSAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNkZWZpbmUgUkNTSUQJIiRJZDogY2NwLmMsdiAxLjUwIDIwMDUvMDYvMjYgMTk6MzQ6NDEgY2FybHNvbmogRXhwICQiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgInBwcGQuaCIKLSNpbmNsdWRlICJmc20uaCIKLSNpbmNsdWRlICJjY3AuaCIKLSNpbmNsdWRlIDxuZXQvcHBwLWNvbXAuaD4KLQotI2lmZGVmIE1QUEUKLSNpbmNsdWRlICJjaGFwX21zLmgiCS8qIG1wcGVfeHh4eF9rZXksIG1wcGVfa2V5c19zZXQgKi8KLSNpbmNsdWRlICJsY3AuaCIJLyogbGNwX2Nsb3NlKCksIGxjcF9mc20gKi8KLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdID0gUkNTSUQ7Ci0KLS8qCi0gKiBVbmZvcnR1bmF0ZWx5IHRoZXJlIGlzIGEgYnVnIGluIHpsaWIgd2hpY2ggbWVhbnMgdGhhdCB1c2luZyBhCi0gKiBzaXplIG9mIDggKHdpbmRvdyBzaXplID0gMjU2KSBmb3IgRGVmbGF0ZSBjb21wcmVzc2lvbiB3aWxsIGNhdXNlCi0gKiBidWZmZXIgb3ZlcnJ1bnMgYW5kIGtlcm5lbCBjcmFzaGVzIGluIHRoZSBkZWZsYXRlIG1vZHVsZS4KLSAqIFVudGlsIHRoaXMgaXMgZml4ZWQgd2Ugb25seSBhY2NlcHQgc2l6ZXMgaW4gdGhlIHJhbmdlIDkgLi4gMTUuCi0gKiBUaGFua3MgdG8gSmFtZXMgQ2FybHNvbiBmb3IgcG9pbnRpbmcgdGhpcyBvdXQuCi0gKi8KLSNkZWZpbmUgREVGTEFURV9NSU5fV09SS1MJOQotCi0vKgotICogQ29tbWFuZC1saW5lIG9wdGlvbnMuCi0gKi8KLXN0YXRpYyBpbnQgc2V0YnNkY29tcCBfX1AoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgc2V0ZGVmbGF0ZSBfX1AoKGNoYXIgKiopKTsKLXN0YXRpYyBjaGFyIGJzZF92YWx1ZVs4XTsKLXN0YXRpYyBjaGFyIGRlZmxhdGVfdmFsdWVbOF07Ci0KLS8qCi0gKiBPcHRpb24gdmFyaWFibGVzLgotICovCi0jaWZkZWYgTVBQRQotYm9vbCByZWZ1c2VfbXBwZV9zdGF0ZWZ1bCA9IDE7CQkvKiBBbGxvdyBzdGF0ZWZ1bCBtb2RlPyAqLwotI2VuZGlmCi0KLXN0YXRpYyBvcHRpb25fdCBjY3Bfb3B0aW9uX2xpc3RbXSA9IHsKLSAgICB7ICJub2NjcCIsIG9fYm9vbCwgJmNjcF9wcm90ZW50LmVuYWJsZWRfZmxhZywKLSAgICAgICJEaXNhYmxlIENDUCBuZWdvdGlhdGlvbiIgfSwKLSAgICB7ICItY2NwIiwgb19ib29sLCAmY2NwX3Byb3RlbnQuZW5hYmxlZF9mbGFnLAotICAgICAgIkRpc2FibGUgQ0NQIG5lZ290aWF0aW9uIiwgT1BUX0FMSUFTIH0sCi0KLSAgICB7ICJic2Rjb21wIiwgb19zcGVjaWFsLCAodm9pZCAqKXNldGJzZGNvbXAsCi0gICAgICAiUmVxdWVzdCBCU0QtQ29tcHJlc3MgcGFja2V0IGNvbXByZXNzaW9uIiwKLSAgICAgIE9QVF9QUklPIHwgT1BUX0EyU1RSVkFMIHwgT1BUX1NUQVRJQywgYnNkX3ZhbHVlIH0sCi0gICAgeyAibm9ic2Rjb21wIiwgb19ib29sLCAmY2NwX3dhbnRvcHRpb25zWzBdLmJzZF9jb21wcmVzcywKLSAgICAgICJkb24ndCBhbGxvdyBCU0QtQ29tcHJlc3MiLCBPUFRfUFJJT1NVQiB8IE9QVF9BMkNMUiwKLSAgICAgICZjY3BfYWxsb3dvcHRpb25zWzBdLmJzZF9jb21wcmVzcyB9LAotICAgIHsgIi1ic2Rjb21wIiwgb19ib29sLCAmY2NwX3dhbnRvcHRpb25zWzBdLmJzZF9jb21wcmVzcywKLSAgICAgICJkb24ndCBhbGxvdyBCU0QtQ29tcHJlc3MiLCBPUFRfQUxJQVMgfCBPUFRfUFJJT1NVQiB8IE9QVF9BMkNMUiwKLSAgICAgICZjY3BfYWxsb3dvcHRpb25zWzBdLmJzZF9jb21wcmVzcyB9LAotCi0gICAgeyAiZGVmbGF0ZSIsIG9fc3BlY2lhbCwgKHZvaWQgKilzZXRkZWZsYXRlLAotICAgICAgInJlcXVlc3QgRGVmbGF0ZSBjb21wcmVzc2lvbiIsCi0gICAgICBPUFRfUFJJTyB8IE9QVF9BMlNUUlZBTCB8IE9QVF9TVEFUSUMsIGRlZmxhdGVfdmFsdWUgfSwKLSAgICB7ICJub2RlZmxhdGUiLCBvX2Jvb2wsICZjY3Bfd2FudG9wdGlvbnNbMF0uZGVmbGF0ZSwKLSAgICAgICJkb24ndCBhbGxvdyBEZWZsYXRlIGNvbXByZXNzaW9uIiwgT1BUX1BSSU9TVUIgfCBPUFRfQTJDTFIsCi0gICAgICAmY2NwX2FsbG93b3B0aW9uc1swXS5kZWZsYXRlIH0sCi0gICAgeyAiLWRlZmxhdGUiLCBvX2Jvb2wsICZjY3Bfd2FudG9wdGlvbnNbMF0uZGVmbGF0ZSwKLSAgICAgICJkb24ndCBhbGxvdyBEZWZsYXRlIGNvbXByZXNzaW9uIiwgT1BUX0FMSUFTIHwgT1BUX1BSSU9TVUIgfCBPUFRfQTJDTFIsCi0gICAgICAmY2NwX2FsbG93b3B0aW9uc1swXS5kZWZsYXRlIH0sCi0KLSAgICB7ICJub2RlZmxhdGVkcmFmdCIsIG9fYm9vbCwgJmNjcF93YW50b3B0aW9uc1swXS5kZWZsYXRlX2RyYWZ0LAotICAgICAgImRvbid0IHVzZSBkcmFmdCBkZWZsYXRlICMiLCBPUFRfQTJDT1BZLAotICAgICAgJmNjcF9hbGxvd29wdGlvbnNbMF0uZGVmbGF0ZV9kcmFmdCB9LAotCi0gICAgeyAicHJlZGljdG9yMSIsIG9fYm9vbCwgJmNjcF93YW50b3B0aW9uc1swXS5wcmVkaWN0b3JfMSwKLSAgICAgICJyZXF1ZXN0IFByZWRpY3Rvci0xIiwgT1BUX1BSSU8gfCAxIH0sCi0gICAgeyAibm9wcmVkaWN0b3IxIiwgb19ib29sLCAmY2NwX3dhbnRvcHRpb25zWzBdLnByZWRpY3Rvcl8xLAotICAgICAgImRvbid0IGFsbG93IFByZWRpY3Rvci0xIiwgT1BUX1BSSU9TVUIgfCBPUFRfQTJDTFIsCi0gICAgICAmY2NwX2FsbG93b3B0aW9uc1swXS5wcmVkaWN0b3JfMSB9LAotICAgIHsgIi1wcmVkaWN0b3IxIiwgb19ib29sLCAmY2NwX3dhbnRvcHRpb25zWzBdLnByZWRpY3Rvcl8xLAotICAgICAgImRvbid0IGFsbG93IFByZWRpY3Rvci0xIiwgT1BUX0FMSUFTIHwgT1BUX1BSSU9TVUIgfCBPUFRfQTJDTFIsCi0gICAgICAmY2NwX2FsbG93b3B0aW9uc1swXS5wcmVkaWN0b3JfMSB9LAotCi0jaWZkZWYgTVBQRQotICAgIC8qIE1QUEUgb3B0aW9ucyBhcmUgc3ltbWV0cmljYWwgLi4uIHdlIG9ubHkgc2V0IHdhbnRvcHRpb25zIGhlcmUgKi8KLSAgICB7ICJyZXF1aXJlLW1wcGUiLCBvX2Jvb2wsICZjY3Bfd2FudG9wdGlvbnNbMF0ubXBwZSwKLSAgICAgICJyZXF1aXJlIE1QUEUgZW5jcnlwdGlvbiIsCi0gICAgICBPUFRfUFJJTyB8IE1QUEVfT1BUXzQwIHwgTVBQRV9PUFRfMTI4IH0sCi0gICAgeyAiK21wcGUiLCBvX2Jvb2wsICZjY3Bfd2FudG9wdGlvbnNbMF0ubXBwZSwKLSAgICAgICJyZXF1aXJlIE1QUEUgZW5jcnlwdGlvbiIsCi0gICAgICBPUFRfQUxJQVMgfCBPUFRfUFJJTyB8IE1QUEVfT1BUXzQwIHwgTVBQRV9PUFRfMTI4IH0sCi0gICAgeyAibm9tcHBlIiwgb19ib29sLCAmY2NwX3dhbnRvcHRpb25zWzBdLm1wcGUsCi0gICAgICAiZG9uJ3QgYWxsb3cgTVBQRSBlbmNyeXB0aW9uIiwgT1BUX1BSSU8gfSwKLSAgICB7ICItbXBwZSIsIG9fYm9vbCwgJmNjcF93YW50b3B0aW9uc1swXS5tcHBlLAotICAgICAgImRvbid0IGFsbG93IE1QUEUgZW5jcnlwdGlvbiIsIE9QVF9BTElBUyB8IE9QVF9QUklPIH0sCi0KLSAgICAvKiBXZSB1c2UgY2NwX2FsbG93b3B0aW9uc1swXS5tcHBlIGFzIGEganVuayB2YXIgLi4uIGl0IGlzIHJlc2V0IGxhdGVyICovCi0gICAgeyAicmVxdWlyZS1tcHBlLTQwIiwgb19ib29sLCAmY2NwX2FsbG93b3B0aW9uc1swXS5tcHBlLAotICAgICAgInJlcXVpcmUgTVBQRSA0MC1iaXQgZW5jcnlwdGlvbiIsIE9QVF9QUklPIHwgT1BUX0EyT1IgfCBNUFBFX09QVF80MCwKLSAgICAgICZjY3Bfd2FudG9wdGlvbnNbMF0ubXBwZSB9LAotICAgIHsgIittcHBlLTQwIiwgb19ib29sLCAmY2NwX2FsbG93b3B0aW9uc1swXS5tcHBlLAotICAgICAgInJlcXVpcmUgTVBQRSA0MC1iaXQgZW5jcnlwdGlvbiIsIE9QVF9QUklPIHwgT1BUX0EyT1IgfCBNUFBFX09QVF80MCwKLSAgICAgICZjY3Bfd2FudG9wdGlvbnNbMF0ubXBwZSB9LAotICAgIHsgIm5vbXBwZS00MCIsIG9fYm9vbCwgJmNjcF9hbGxvd29wdGlvbnNbMF0ubXBwZSwKLSAgICAgICJkb24ndCBhbGxvdyBNUFBFIDQwLWJpdCBlbmNyeXB0aW9uIiwKLSAgICAgIE9QVF9QUklPU1VCIHwgT1BUX0EyQ0xSQiB8IE1QUEVfT1BUXzQwLCAmY2NwX3dhbnRvcHRpb25zWzBdLm1wcGUgfSwKLSAgICB7ICItbXBwZS00MCIsIG9fYm9vbCwgJmNjcF9hbGxvd29wdGlvbnNbMF0ubXBwZSwKLSAgICAgICJkb24ndCBhbGxvdyBNUFBFIDQwLWJpdCBlbmNyeXB0aW9uIiwKLSAgICAgIE9QVF9BTElBUyB8IE9QVF9QUklPU1VCIHwgT1BUX0EyQ0xSQiB8IE1QUEVfT1BUXzQwLAotICAgICAgJmNjcF93YW50b3B0aW9uc1swXS5tcHBlIH0sCi0KLSAgICB7ICJyZXF1aXJlLW1wcGUtMTI4Iiwgb19ib29sLCAmY2NwX2FsbG93b3B0aW9uc1swXS5tcHBlLAotICAgICAgInJlcXVpcmUgTVBQRSAxMjgtYml0IGVuY3J5cHRpb24iLCBPUFRfUFJJTyB8IE9QVF9BMk9SIHwgTVBQRV9PUFRfMTI4LAotICAgICAgJmNjcF93YW50b3B0aW9uc1swXS5tcHBlIH0sCi0gICAgeyAiK21wcGUtMTI4Iiwgb19ib29sLCAmY2NwX2FsbG93b3B0aW9uc1swXS5tcHBlLAotICAgICAgInJlcXVpcmUgTVBQRSAxMjgtYml0IGVuY3J5cHRpb24iLAotICAgICAgT1BUX0FMSUFTIHwgT1BUX1BSSU8gfCBPUFRfQTJPUiB8IE1QUEVfT1BUXzEyOCwKLSAgICAgICZjY3Bfd2FudG9wdGlvbnNbMF0ubXBwZSB9LAotICAgIHsgIm5vbXBwZS0xMjgiLCBvX2Jvb2wsICZjY3BfYWxsb3dvcHRpb25zWzBdLm1wcGUsCi0gICAgICAiZG9uJ3QgYWxsb3cgTVBQRSAxMjgtYml0IGVuY3J5cHRpb24iLAotICAgICAgT1BUX1BSSU9TVUIgfCBPUFRfQTJDTFJCIHwgTVBQRV9PUFRfMTI4LCAmY2NwX3dhbnRvcHRpb25zWzBdLm1wcGUgfSwKLSAgICB7ICItbXBwZS0xMjgiLCBvX2Jvb2wsICZjY3BfYWxsb3dvcHRpb25zWzBdLm1wcGUsCi0gICAgICAiZG9uJ3QgYWxsb3cgTVBQRSAxMjgtYml0IGVuY3J5cHRpb24iLAotICAgICAgT1BUX0FMSUFTIHwgT1BUX1BSSU9TVUIgfCBPUFRfQTJDTFJCIHwgTVBQRV9PUFRfMTI4LAotICAgICAgJmNjcF93YW50b3B0aW9uc1swXS5tcHBlIH0sCi0KLSAgICAvKiBzdHJhbmdlIG9uZTsgd2UgYWx3YXlzIHJlcXVlc3Qgc3RhdGVsZXNzLCBidXQgd2lsbCB3ZSBhbGxvdyBzdGF0ZWZ1bD8gKi8KLSAgICB7ICJtcHBlLXN0YXRlZnVsIiwgb19ib29sLCAmcmVmdXNlX21wcGVfc3RhdGVmdWwsCi0gICAgICAiYWxsb3cgTVBQRSBzdGF0ZWZ1bCBtb2RlIiwgT1BUX1BSSU8gfSwKLSAgICB7ICJub21wcGUtc3RhdGVmdWwiLCBvX2Jvb2wsICZyZWZ1c2VfbXBwZV9zdGF0ZWZ1bCwKLSAgICAgICJkaXNhbGxvdyBNUFBFIHN0YXRlZnVsIG1vZGUiLCBPUFRfUFJJTyB8IDEgfSwKLSNlbmRpZiAvKiBNUFBFICovCi0KLSAgICB7IE5VTEwgfQotfTsKLQotLyoKLSAqIFByb3RvY29sIGVudHJ5IHBvaW50cyBmcm9tIG1haW4gY29kZS4KLSAqLwotc3RhdGljIHZvaWQgY2NwX2luaXQgX19QKChpbnQgdW5pdCkpOwotc3RhdGljIHZvaWQgY2NwX29wZW4gX19QKChpbnQgdW5pdCkpOwotc3RhdGljIHZvaWQgY2NwX2Nsb3NlIF9fUCgoaW50IHVuaXQsIGNoYXIgKikpOwotc3RhdGljIHZvaWQgY2NwX2xvd2VydXAgX19QKChpbnQgdW5pdCkpOwotc3RhdGljIHZvaWQgY2NwX2xvd2VyZG93biBfX1AoKGludCkpOwotc3RhdGljIHZvaWQgY2NwX2lucHV0IF9fUCgoaW50IHVuaXQsIHVfY2hhciAqcGt0LCBpbnQgbGVuKSk7Ci1zdGF0aWMgdm9pZCBjY3BfcHJvdHJlaiBfX1AoKGludCB1bml0KSk7Ci1zdGF0aWMgaW50ICBjY3BfcHJpbnRwa3QgX19QKCh1X2NoYXIgKnBrdCwgaW50IGxlbiwKLQkJCSAgICAgIHZvaWQgKCpwcmludGVyKSBfX1AoKHZvaWQgKiwgY2hhciAqLCAuLi4pKSwKLQkJCSAgICAgIHZvaWQgKmFyZykpOwotc3RhdGljIHZvaWQgY2NwX2RhdGFpbnB1dCBfX1AoKGludCB1bml0LCB1X2NoYXIgKnBrdCwgaW50IGxlbikpOwotCi1zdHJ1Y3QgcHJvdGVudCBjY3BfcHJvdGVudCA9IHsKLSAgICBQUFBfQ0NQLAotICAgIGNjcF9pbml0LAotICAgIGNjcF9pbnB1dCwKLSAgICBjY3BfcHJvdHJlaiwKLSAgICBjY3BfbG93ZXJ1cCwKLSAgICBjY3BfbG93ZXJkb3duLAotICAgIGNjcF9vcGVuLAotICAgIGNjcF9jbG9zZSwKLSAgICBjY3BfcHJpbnRwa3QsCi0gICAgY2NwX2RhdGFpbnB1dCwKLSAgICAxLAotICAgICJDQ1AiLAotICAgICJDb21wcmVzc2VkIiwKLSAgICBjY3Bfb3B0aW9uX2xpc3QsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwKLX07Ci0KLWZzbSBjY3BfZnNtW05VTV9QUFBdOwotY2NwX29wdGlvbnMgY2NwX3dhbnRvcHRpb25zW05VTV9QUFBdOwkvKiB3aGF0IHRvIHJlcXVlc3QgdGhlIHBlZXIgdG8gdXNlICovCi1jY3Bfb3B0aW9ucyBjY3BfZ290b3B0aW9uc1tOVU1fUFBQXTsJLyogd2hhdCB0aGUgcGVlciBhZ3JlZWQgdG8gZG8gKi8KLWNjcF9vcHRpb25zIGNjcF9hbGxvd29wdGlvbnNbTlVNX1BQUF07CS8qIHdoYXQgd2UnbGwgYWdyZWUgdG8gZG8gKi8KLWNjcF9vcHRpb25zIGNjcF9oaXNvcHRpb25zW05VTV9QUFBdOwkvKiB3aGF0IHdlIGFncmVlZCB0byBkbyAqLwotCi0vKgotICogQ2FsbGJhY2tzIGZvciBmc20gY29kZS4KLSAqLwotc3RhdGljIHZvaWQgY2NwX3Jlc2V0Y2kgX19QKChmc20gKikpOwotc3RhdGljIGludCAgY2NwX2NpbGVuIF9fUCgoZnNtICopKTsKLXN0YXRpYyB2b2lkIGNjcF9hZGRjaSBfX1AoKGZzbSAqLCB1X2NoYXIgKiwgaW50ICopKTsKLXN0YXRpYyBpbnQgIGNjcF9hY2tjaSBfX1AoKGZzbSAqLCB1X2NoYXIgKiwgaW50KSk7Ci1zdGF0aWMgaW50ICBjY3BfbmFrY2kgX19QKChmc20gKiwgdV9jaGFyICosIGludCwgaW50KSk7Ci1zdGF0aWMgaW50ICBjY3BfcmVqY2kgX19QKChmc20gKiwgdV9jaGFyICosIGludCkpOwotc3RhdGljIGludCAgY2NwX3JlcWNpIF9fUCgoZnNtICosIHVfY2hhciAqLCBpbnQgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBjY3BfdXAgX19QKChmc20gKikpOwotc3RhdGljIHZvaWQgY2NwX2Rvd24gX19QKChmc20gKikpOwotc3RhdGljIGludCAgY2NwX2V4dGNvZGUgX19QKChmc20gKiwgaW50LCBpbnQsIHVfY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGNjcF9yYWNrX3RpbWVvdXQgX19QKCh2b2lkICopKTsKLXN0YXRpYyBjaGFyICptZXRob2RfbmFtZSBfX1AoKGNjcF9vcHRpb25zICosIGNjcF9vcHRpb25zICopKTsKLQotc3RhdGljIGZzbV9jYWxsYmFja3MgY2NwX2NhbGxiYWNrcyA9IHsKLSAgICBjY3BfcmVzZXRjaSwKLSAgICBjY3BfY2lsZW4sCi0gICAgY2NwX2FkZGNpLAotICAgIGNjcF9hY2tjaSwKLSAgICBjY3BfbmFrY2ksCi0gICAgY2NwX3JlamNpLAotICAgIGNjcF9yZXFjaSwKLSAgICBjY3BfdXAsCi0gICAgY2NwX2Rvd24sCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBjY3BfZXh0Y29kZSwKLSAgICAiQ0NQIgotfTsKLQotLyoKLSAqIERvIHdlIHdhbnQgLyBkaWQgd2UgZ2V0IGFueSBjb21wcmVzc2lvbj8KLSAqLwotI2RlZmluZSBBTllfQ09NUFJFU1Mob3B0KQkoKG9wdCkuZGVmbGF0ZSB8fCAob3B0KS5ic2RfY29tcHJlc3MgXAotCQkJCSB8fCAob3B0KS5wcmVkaWN0b3JfMSB8fCAob3B0KS5wcmVkaWN0b3JfMiBcCi0JCQkJIHx8IChvcHQpLm1wcGUpCi0KLS8qCi0gKiBMb2NhbCBzdGF0ZSAobWFpbmx5IGZvciBoYW5kbGluZyByZXNldC1yZXFzIGFuZCByZXNldC1hY2tzKS4KLSAqLwotc3RhdGljIGludCBjY3BfbG9jYWxzdGF0ZVtOVU1fUFBQXTsKLSNkZWZpbmUgUkFDS19QRU5ESU5HCTEJLyogd2FpdGluZyBmb3IgcmVzZXQtYWNrICovCi0jZGVmaW5lIFJSRVFfUkVQRUFUCTIJLyogc2VuZCBhbm90aGVyIHJlc2V0LXJlcSBpZiBubyByZXNldC1hY2sgKi8KLQotI2RlZmluZSBSQUNLVElNRU9VVAkxCS8qIHNlY29uZCAqLwotCi1zdGF0aWMgaW50IGFsbF9yZWplY3RlZFtOVU1fUFBQXTsJLyogd2UgcmVqZWN0ZWQgYWxsIHBlZXIncyBvcHRpb25zICovCi0KLS8qCi0gKiBPcHRpb24gcGFyc2luZy4KLSAqLwotc3RhdGljIGludAotc2V0YnNkY29tcChhcmd2KQotICAgIGNoYXIgKiphcmd2OwotewotICAgIGludCByYml0cywgYWJpdHM7Ci0gICAgY2hhciAqc3RyLCAqZW5kcDsKLQotICAgIHN0ciA9ICphcmd2OwotICAgIGFiaXRzID0gcmJpdHMgPSBzdHJ0b2woc3RyLCAmZW5kcCwgMCk7Ci0gICAgaWYgKGVuZHAgIT0gc3RyICYmICplbmRwID09ICcsJykgewotCXN0ciA9IGVuZHAgKyAxOwotCWFiaXRzID0gc3RydG9sKHN0ciwgJmVuZHAsIDApOwotICAgIH0KLSAgICBpZiAoKmVuZHAgIT0gMCB8fCBlbmRwID09IHN0cikgewotCW9wdGlvbl9lcnJvcigiaW52YWxpZCBwYXJhbWV0ZXIgJyVzJyBmb3IgYnNkY29tcCBvcHRpb24iLCAqYXJndik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmICgocmJpdHMgIT0gMCAmJiAocmJpdHMgPCBCU0RfTUlOX0JJVFMgfHwgcmJpdHMgPiBCU0RfTUFYX0JJVFMpKQotCXx8IChhYml0cyAhPSAwICYmIChhYml0cyA8IEJTRF9NSU5fQklUUyB8fCBhYml0cyA+IEJTRF9NQVhfQklUUykpKSB7Ci0Jb3B0aW9uX2Vycm9yKCJic2Rjb21wIG9wdGlvbiB2YWx1ZXMgbXVzdCBiZSAwIG9yICVkIC4uICVkIiwKLQkJICAgICBCU0RfTUlOX0JJVFMsIEJTRF9NQVhfQklUUyk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChyYml0cyA+IDApIHsKLQljY3Bfd2FudG9wdGlvbnNbMF0uYnNkX2NvbXByZXNzID0gMTsKLQljY3Bfd2FudG9wdGlvbnNbMF0uYnNkX2JpdHMgPSByYml0czsKLSAgICB9IGVsc2UKLQljY3Bfd2FudG9wdGlvbnNbMF0uYnNkX2NvbXByZXNzID0gMDsKLSAgICBpZiAoYWJpdHMgPiAwKSB7Ci0JY2NwX2FsbG93b3B0aW9uc1swXS5ic2RfY29tcHJlc3MgPSAxOwotCWNjcF9hbGxvd29wdGlvbnNbMF0uYnNkX2JpdHMgPSBhYml0czsKLSAgICB9IGVsc2UKLQljY3BfYWxsb3dvcHRpb25zWzBdLmJzZF9jb21wcmVzcyA9IDA7Ci0gICAgc2xwcmludGYoYnNkX3ZhbHVlLCBzaXplb2YoYnNkX3ZhbHVlKSwKLQkgICAgIHJiaXRzID09IGFiaXRzPyAiJWQiOiAiJWQsJWQiLCByYml0cywgYWJpdHMpOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLXNldGRlZmxhdGUoYXJndikKLSAgICBjaGFyICoqYXJndjsKLXsKLSAgICBpbnQgcmJpdHMsIGFiaXRzOwotICAgIGNoYXIgKnN0ciwgKmVuZHA7Ci0KLSAgICBzdHIgPSAqYXJndjsKLSAgICBhYml0cyA9IHJiaXRzID0gc3RydG9sKHN0ciwgJmVuZHAsIDApOwotICAgIGlmIChlbmRwICE9IHN0ciAmJiAqZW5kcCA9PSAnLCcpIHsKLQlzdHIgPSBlbmRwICsgMTsKLQlhYml0cyA9IHN0cnRvbChzdHIsICZlbmRwLCAwKTsKLSAgICB9Ci0gICAgaWYgKCplbmRwICE9IDAgfHwgZW5kcCA9PSBzdHIpIHsKLQlvcHRpb25fZXJyb3IoImludmFsaWQgcGFyYW1ldGVyICclcycgZm9yIGRlZmxhdGUgb3B0aW9uIiwgKmFyZ3YpOwotCXJldHVybiAwOwotICAgIH0KLSAgICBpZiAoKHJiaXRzICE9IDAgJiYgKHJiaXRzIDwgREVGTEFURV9NSU5fU0laRSB8fCByYml0cyA+IERFRkxBVEVfTUFYX1NJWkUpKQotCXx8IChhYml0cyAhPSAwICYmIChhYml0cyA8IERFRkxBVEVfTUlOX1NJWkUKLQkJCSAgfHwgYWJpdHMgPiBERUZMQVRFX01BWF9TSVpFKSkpIHsKLQlvcHRpb25fZXJyb3IoImRlZmxhdGUgb3B0aW9uIHZhbHVlcyBtdXN0IGJlIDAgb3IgJWQgLi4gJWQiLAotCQkgICAgIERFRkxBVEVfTUlOX1NJWkUsIERFRkxBVEVfTUFYX1NJWkUpOwotCXJldHVybiAwOwotICAgIH0KLSAgICBpZiAocmJpdHMgPT0gREVGTEFURV9NSU5fU0laRSB8fCBhYml0cyA9PSBERUZMQVRFX01JTl9TSVpFKSB7Ci0JaWYgKHJiaXRzID09IERFRkxBVEVfTUlOX1NJWkUpCi0JICAgIHJiaXRzID0gREVGTEFURV9NSU5fV09SS1M7Ci0JaWYgKGFiaXRzID09IERFRkxBVEVfTUlOX1NJWkUpCi0JICAgIGFiaXRzID0gREVGTEFURV9NSU5fV09SS1M7Ci0Jd2FybigiZGVmbGF0ZSBvcHRpb24gdmFsdWUgb2YgJWQgY2hhbmdlZCB0byAlZCB0byBhdm9pZCB6bGliIGJ1ZyIsCi0JICAgICBERUZMQVRFX01JTl9TSVpFLCBERUZMQVRFX01JTl9XT1JLUyk7Ci0gICAgfQotICAgIGlmIChyYml0cyA+IDApIHsKLQljY3Bfd2FudG9wdGlvbnNbMF0uZGVmbGF0ZSA9IDE7Ci0JY2NwX3dhbnRvcHRpb25zWzBdLmRlZmxhdGVfc2l6ZSA9IHJiaXRzOwotICAgIH0gZWxzZQotCWNjcF93YW50b3B0aW9uc1swXS5kZWZsYXRlID0gMDsKLSAgICBpZiAoYWJpdHMgPiAwKSB7Ci0JY2NwX2FsbG93b3B0aW9uc1swXS5kZWZsYXRlID0gMTsKLQljY3BfYWxsb3dvcHRpb25zWzBdLmRlZmxhdGVfc2l6ZSA9IGFiaXRzOwotICAgIH0gZWxzZQotCWNjcF9hbGxvd29wdGlvbnNbMF0uZGVmbGF0ZSA9IDA7Ci0gICAgc2xwcmludGYoZGVmbGF0ZV92YWx1ZSwgc2l6ZW9mKGRlZmxhdGVfdmFsdWUpLAotCSAgICAgcmJpdHMgPT0gYWJpdHM/ICIlZCI6ICIlZCwlZCIsIHJiaXRzLCBhYml0cyk7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotLyoKLSAqIGNjcF9pbml0IC0gaW5pdGlhbGl6ZSBDQ1AuCi0gKi8KLXN0YXRpYyB2b2lkCi1jY3BfaW5pdCh1bml0KQotICAgIGludCB1bml0OwotewotICAgIGZzbSAqZiA9ICZjY3BfZnNtW3VuaXRdOwotCi0gICAgZi0+dW5pdCA9IHVuaXQ7Ci0gICAgZi0+cHJvdG9jb2wgPSBQUFBfQ0NQOwotICAgIGYtPmNhbGxiYWNrcyA9ICZjY3BfY2FsbGJhY2tzOwotICAgIGZzbV9pbml0KGYpOwotCi0gICAgbWVtc2V0KCZjY3Bfd2FudG9wdGlvbnNbdW5pdF0sICAwLCBzaXplb2YoY2NwX29wdGlvbnMpKTsKLSAgICBtZW1zZXQoJmNjcF9nb3RvcHRpb25zW3VuaXRdLCAgIDAsIHNpemVvZihjY3Bfb3B0aW9ucykpOwotICAgIG1lbXNldCgmY2NwX2FsbG93b3B0aW9uc1t1bml0XSwgMCwgc2l6ZW9mKGNjcF9vcHRpb25zKSk7Ci0gICAgbWVtc2V0KCZjY3BfaGlzb3B0aW9uc1t1bml0XSwgICAwLCBzaXplb2YoY2NwX29wdGlvbnMpKTsKLQotICAgIGNjcF93YW50b3B0aW9uc1swXS5kZWZsYXRlID0gMTsKLSAgICBjY3Bfd2FudG9wdGlvbnNbMF0uZGVmbGF0ZV9zaXplID0gREVGTEFURV9NQVhfU0laRTsKLSAgICBjY3Bfd2FudG9wdGlvbnNbMF0uZGVmbGF0ZV9jb3JyZWN0ID0gMTsKLSAgICBjY3Bfd2FudG9wdGlvbnNbMF0uZGVmbGF0ZV9kcmFmdCA9IDE7Ci0gICAgY2NwX2FsbG93b3B0aW9uc1swXS5kZWZsYXRlID0gMTsKLSAgICBjY3BfYWxsb3dvcHRpb25zWzBdLmRlZmxhdGVfc2l6ZSA9IERFRkxBVEVfTUFYX1NJWkU7Ci0gICAgY2NwX2FsbG93b3B0aW9uc1swXS5kZWZsYXRlX2NvcnJlY3QgPSAxOwotICAgIGNjcF9hbGxvd29wdGlvbnNbMF0uZGVmbGF0ZV9kcmFmdCA9IDE7Ci0KLSAgICBjY3Bfd2FudG9wdGlvbnNbMF0uYnNkX2NvbXByZXNzID0gMTsKLSAgICBjY3Bfd2FudG9wdGlvbnNbMF0uYnNkX2JpdHMgPSBCU0RfTUFYX0JJVFM7Ci0gICAgY2NwX2FsbG93b3B0aW9uc1swXS5ic2RfY29tcHJlc3MgPSAxOwotICAgIGNjcF9hbGxvd29wdGlvbnNbMF0uYnNkX2JpdHMgPSBCU0RfTUFYX0JJVFM7Ci0KLSAgICBjY3BfYWxsb3dvcHRpb25zWzBdLnByZWRpY3Rvcl8xID0gMTsKLX0KLQotLyoKLSAqIGNjcF9vcGVuIC0gQ0NQIGlzIGFsbG93ZWQgdG8gY29tZSB1cC4KLSAqLwotc3RhdGljIHZvaWQKLWNjcF9vcGVuKHVuaXQpCi0gICAgaW50IHVuaXQ7Ci17Ci0gICAgZnNtICpmID0gJmNjcF9mc21bdW5pdF07Ci0KLSAgICBpZiAoZi0+c3RhdGUgIT0gT1BFTkVEKQotCWNjcF9mbGFnc19zZXQodW5pdCwgMSwgMCk7Ci0KLSAgICAvKgotICAgICAqIEZpbmQgb3V0IHdoaWNoIGNvbXByZXNzb3JzIHRoZSBrZXJuZWwgc3VwcG9ydHMgYmVmb3JlCi0gICAgICogZGVjaWRpbmcgd2hldGhlciB0byBvcGVuIGluIHNpbGVudCBtb2RlLgotICAgICAqLwotICAgIGNjcF9yZXNldGNpKGYpOwotICAgIGlmICghQU5ZX0NPTVBSRVNTKGNjcF9nb3RvcHRpb25zW3VuaXRdKSkKLQlmLT5mbGFncyB8PSBPUFRfU0lMRU5UOwotCi0gICAgZnNtX29wZW4oZik7Ci19Ci0KLS8qCi0gKiBjY3BfY2xvc2UgLSBUZXJtaW5hdGUgQ0NQLgotICovCi1zdGF0aWMgdm9pZAotY2NwX2Nsb3NlKHVuaXQsIHJlYXNvbikKLSAgICBpbnQgdW5pdDsKLSAgICBjaGFyICpyZWFzb247Ci17Ci0gICAgY2NwX2ZsYWdzX3NldCh1bml0LCAwLCAwKTsKLSAgICBmc21fY2xvc2UoJmNjcF9mc21bdW5pdF0sIHJlYXNvbik7Ci19Ci0KLS8qCi0gKiBjY3BfbG93ZXJ1cCAtIHdlIG1heSBub3cgdHJhbnNtaXQgQ0NQIHBhY2tldHMuCi0gKi8KLXN0YXRpYyB2b2lkCi1jY3BfbG93ZXJ1cCh1bml0KQotICAgIGludCB1bml0OwotewotICAgIGZzbV9sb3dlcnVwKCZjY3BfZnNtW3VuaXRdKTsKLX0KLQotLyoKLSAqIGNjcF9sb3dlcmRvd24gLSB3ZSBtYXkgbm90IHRyYW5zbWl0IENDUCBwYWNrZXRzLgotICovCi1zdGF0aWMgdm9pZAotY2NwX2xvd2VyZG93bih1bml0KQotICAgIGludCB1bml0OwotewotICAgIGZzbV9sb3dlcmRvd24oJmNjcF9mc21bdW5pdF0pOwotfQotCi0vKgotICogY2NwX2lucHV0IC0gcHJvY2VzcyBhIHJlY2VpdmVkIENDUCBwYWNrZXQuCi0gKi8KLXN0YXRpYyB2b2lkCi1jY3BfaW5wdXQodW5pdCwgcCwgbGVuKQotICAgIGludCB1bml0OwotICAgIHVfY2hhciAqcDsKLSAgICBpbnQgbGVuOwotewotICAgIGZzbSAqZiA9ICZjY3BfZnNtW3VuaXRdOwotICAgIGludCBvbGRzdGF0ZTsKLQotICAgIC8qCi0gICAgICogQ2hlY2sgZm9yIGEgdGVybWluYXRlLXJlcXVlc3Qgc28gd2UgY2FuIHByaW50IGEgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBvbGRzdGF0ZSA9IGYtPnN0YXRlOwotICAgIGZzbV9pbnB1dChmLCBwLCBsZW4pOwotICAgIGlmIChvbGRzdGF0ZSA9PSBPUEVORUQgJiYgcFswXSA9PSBURVJNUkVRICYmIGYtPnN0YXRlICE9IE9QRU5FRCkgewotCW5vdGljZSgiQ29tcHJlc3Npb24gZGlzYWJsZWQgYnkgcGVlci4iKTsKLSNpZmRlZiBNUFBFCi0JaWYgKGNjcF9nb3RvcHRpb25zW3VuaXRdLm1wcGUpIHsKLQkgICAgZXJyb3IoIk1QUEUgZGlzYWJsZWQsIGNsb3NpbmcgTENQIik7Ci0JICAgIGxjcF9jbG9zZSh1bml0LCAiTVBQRSBkaXNhYmxlZCBieSBwZWVyIik7Ci0JfQotI2VuZGlmCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBJZiB3ZSBnZXQgYSB0ZXJtaW5hdGUtYWNrIGFuZCB3ZSdyZSBub3QgYXNraW5nIGZvciBjb21wcmVzc2lvbiwKLSAgICAgKiBjbG9zZSBDQ1AuCi0gICAgICovCi0gICAgaWYgKG9sZHN0YXRlID09IFJFUVNFTlQgJiYgcFswXSA9PSBURVJNQUNLCi0JJiYgIUFOWV9DT01QUkVTUyhjY3BfZ290b3B0aW9uc1t1bml0XSkpCi0JY2NwX2Nsb3NlKHVuaXQsICJObyBjb21wcmVzc2lvbiBuZWdvdGlhdGVkIik7Ci19Ci0KLS8qCi0gKiBIYW5kbGUgYSBDQ1Atc3BlY2lmaWMgY29kZS4KLSAqLwotc3RhdGljIGludAotY2NwX2V4dGNvZGUoZiwgY29kZSwgaWQsIHAsIGxlbikKLSAgICBmc20gKmY7Ci0gICAgaW50IGNvZGUsIGlkOwotICAgIHVfY2hhciAqcDsKLSAgICBpbnQgbGVuOwotewotICAgIHN3aXRjaCAoY29kZSkgewotICAgIGNhc2UgQ0NQX1JFU0VUUkVROgotCWlmIChmLT5zdGF0ZSAhPSBPUEVORUQpCi0JICAgIGJyZWFrOwotCS8qIHNlbmQgYSByZXNldC1hY2ssIHdoaWNoIHRoZSB0cmFuc21pdHRlciB3aWxsIHNlZSBhbmQKLQkgICByZXNldCBpdHMgY29tcHJlc3Npb24gc3RhdGUuICovCi0JZnNtX3NkYXRhKGYsIENDUF9SRVNFVEFDSywgaWQsIE5VTEwsIDApOwotCWJyZWFrOwotCi0gICAgY2FzZSBDQ1BfUkVTRVRBQ0s6Ci0JaWYgKGNjcF9sb2NhbHN0YXRlW2YtPnVuaXRdICYgUkFDS19QRU5ESU5HICYmIGlkID09IGYtPnJlcWlkKSB7Ci0JICAgIGNjcF9sb2NhbHN0YXRlW2YtPnVuaXRdICY9IH4oUkFDS19QRU5ESU5HIHwgUlJFUV9SRVBFQVQpOwotCSAgICBVTlRJTUVPVVQoY2NwX3JhY2tfdGltZW91dCwgZik7Ci0JfQotCWJyZWFrOwotCi0gICAgZGVmYXVsdDoKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotLyoKLSAqIGNjcF9wcm90cmVqIC0gcGVlciBkb2Vzbid0IHRhbGsgQ0NQLgotICovCi1zdGF0aWMgdm9pZAotY2NwX3Byb3RyZWoodW5pdCkKLSAgICBpbnQgdW5pdDsKLXsKLSAgICBjY3BfZmxhZ3Nfc2V0KHVuaXQsIDAsIDApOwotICAgIGZzbV9sb3dlcmRvd24oJmNjcF9mc21bdW5pdF0pOwotCi0jaWZkZWYgTVBQRQotICAgIGlmIChjY3BfZ290b3B0aW9uc1t1bml0XS5tcHBlKSB7Ci0JZXJyb3IoIk1QUEUgcmVxdWlyZWQgYnV0IHBlZXIgbmVnb3RpYXRpb24gZmFpbGVkIik7Ci0JbGNwX2Nsb3NlKHVuaXQsICJNUFBFIHJlcXVpcmVkIGJ1dCBwZWVyIG5lZ290aWF0aW9uIGZhaWxlZCIpOwotICAgIH0KLSNlbmRpZgotCi19Ci0KLS8qCi0gKiBjY3BfcmVzZXRjaSAtIGluaXRpYWxpemUgYXQgc3RhcnQgb2YgbmVnb3RpYXRpb24uCi0gKi8KLXN0YXRpYyB2b2lkCi1jY3BfcmVzZXRjaShmKQotICAgIGZzbSAqZjsKLXsKLSAgICBjY3Bfb3B0aW9ucyAqZ28gPSAmY2NwX2dvdG9wdGlvbnNbZi0+dW5pdF07Ci0gICAgdV9jaGFyIG9wdF9idWZbQ0NQX01BWF9PUFRJT05fTEVOR1RIXTsKLQotICAgICpnbyA9IGNjcF93YW50b3B0aW9uc1tmLT51bml0XTsKLSAgICBhbGxfcmVqZWN0ZWRbZi0+dW5pdF0gPSAwOwotCi0jaWZkZWYgTVBQRQotICAgIGlmIChnby0+bXBwZSkgewotCWNjcF9vcHRpb25zICphbyA9ICZjY3BfYWxsb3dvcHRpb25zW2YtPnVuaXRdOwotCWludCBhdXRoX21zY2hhcF9iaXRzID0gYXV0aF9kb25lW2YtPnVuaXRdOwotCWludCBudW1iaXRzOwotCi0JLyoKLQkgKiBTdGFydCB3aXRoIGEgYmFzaWMgc2FuaXR5IGNoZWNrOiBtc2NoYXBbdjJdIGF1dGggbXVzdCBiZSBpbgotCSAqIGV4YWN0bHkgb25lIGRpcmVjdGlvbi4gIFJGQyAzMDc5IHNheXMgdGhhdCB0aGUga2V5cyBhcmUKLQkgKiAnZGVyaXZlZCBmcm9tIHRoZSBjcmVkZW50aWFscyBvZiB0aGUgcGVlciB0aGF0IGluaXRpYXRlZCB0aGUgY2FsbCcsCi0JICogaG93ZXZlciB0aGUgUFBQIHByb3RvY29sIGRvZXNuJ3QgaGF2ZSBzdWNoIGEgY29uY2VwdCwgYW5kIHBwcGQKLQkgKiBjYW5ub3QgZ2V0IHRoaXMgaW5mbyBleHRlcm5hbGx5LiAgSW5zdGVhZCB3ZSBkbyB0aGUgYmVzdCB3ZSBjYW4uCi0JICogTkI6IElmIE1QUEUgaXMgcmVxdWlyZWQsIGFsbCBvdGhlciBjb21wcmVzc2lvbiBvcHRzIGFyZSBpbnZhbGlkLgotCSAqICAgICBTbywgd2UgcmV0dXJuIHJpZ2h0IGF3YXkgaWYgd2UgY2FuJ3QgZG8gaXQuCi0JICovCi0KLQkvKiBMZWF2ZSBvbmx5IHRoZSBtc2NoYXAgYXV0aCBiaXRzIHNldCAqLwotCWF1dGhfbXNjaGFwX2JpdHMgJj0gKENIQVBfTVNfV0lUSFBFRVIgIHwgQ0hBUF9NU19QRUVSIHwKLQkJCSAgICAgQ0hBUF9NUzJfV0lUSFBFRVIgfCBDSEFQX01TMl9QRUVSKTsKLQkvKiBDb3VudCB0aGUgbXNjaGFwIGF1dGhzICovCi0JYXV0aF9tc2NoYXBfYml0cyA+Pj0gQ0hBUF9NU19TSElGVDsKLQludW1iaXRzID0gMDsKLQlkbyB7Ci0JICAgIG51bWJpdHMgKz0gYXV0aF9tc2NoYXBfYml0cyAmIDE7Ci0JICAgIGF1dGhfbXNjaGFwX2JpdHMgPj49IDE7Ci0JfSB3aGlsZSAoYXV0aF9tc2NoYXBfYml0cyk7Ci0JaWYgKG51bWJpdHMgPiAxKSB7Ci0JICAgIGVycm9yKCJNUFBFIHJlcXVpcmVkLCBidXQgYXV0aCBkb25lIGluIGJvdGggZGlyZWN0aW9ucy4iKTsKLQkgICAgbGNwX2Nsb3NlKGYtPnVuaXQsICJNUFBFIHJlcXVpcmVkIGJ1dCBub3QgYXZhaWxhYmxlIik7Ci0JICAgIHJldHVybjsKLQl9Ci0JaWYgKCFudW1iaXRzKSB7Ci0JICAgIGVycm9yKCJNUFBFIHJlcXVpcmVkLCBidXQgTVMtQ0hBUFt2Ml0gYXV0aCBub3QgcGVyZm9ybWVkLiIpOwotCSAgICBsY3BfY2xvc2UoZi0+dW5pdCwgIk1QUEUgcmVxdWlyZWQgYnV0IG5vdCBhdmFpbGFibGUiKTsKLQkgICAgcmV0dXJuOwotCX0KLQotCS8qIEEgcGx1Z2luIChlZyByYWRpdXMpIG1heSBub3QgaGF2ZSBvYnRhaW5lZCBrZXkgbWF0ZXJpYWwuICovCi0JaWYgKCFtcHBlX2tleXNfc2V0KSB7Ci0JICAgIGVycm9yKCJNUFBFIHJlcXVpcmVkLCBidXQga2V5cyBhcmUgbm90IGF2YWlsYWJsZS4gICIKLQkJICAiUG9zc2libGUgcGx1Z2luIHByb2JsZW0/Iik7Ci0JICAgIGxjcF9jbG9zZShmLT51bml0LCAiTVBQRSByZXF1aXJlZCBidXQgbm90IGF2YWlsYWJsZSIpOwotCSAgICByZXR1cm47Ci0JfQotCi0JLyogTE0gYXV0aCBub3Qgc3VwcG9ydGVkIGZvciBNUFBFICovCi0JaWYgKGF1dGhfZG9uZVtmLT51bml0XSAmIChDSEFQX01TX1dJVEhQRUVSIHwgQ0hBUF9NU19QRUVSKSkgewotCSAgICAvKiBUaGlzIG1pZ2h0IGJlIG5vaXNlICovCi0JICAgIGlmIChnby0+bXBwZSAmIE1QUEVfT1BUXzQwKSB7Ci0JCW5vdGljZSgiRGlzYWJsaW5nIDQwLWJpdCBNUFBFOyBNUy1DSEFQIExNIG5vdCBzdXBwb3J0ZWQiKTsKLQkJZ28tPm1wcGUgJj0gfk1QUEVfT1BUXzQwOwotCQljY3Bfd2FudG9wdGlvbnNbZi0+dW5pdF0ubXBwZSAmPSB+TVBQRV9PUFRfNDA7Ci0JICAgIH0KLQl9Ci0KLQkvKiBMYXN0IGNoZWNrOiBjYW4gd2UgYWN0dWFsbHkgbmVnb3RpYXRlIHNvbWV0aGluZz8gKi8KLQlpZiAoIShnby0+bXBwZSAmIChNUFBFX09QVF80MCB8IE1QUEVfT1BUXzEyOCkpKSB7Ci0JICAgIC8qIENvdWxkIGJlIG1pc2NvbmZpZywgY291bGQgYmUgNDAtYml0IGRpc2FibGVkIGFib3ZlLiAqLwotCSAgICBlcnJvcigiTVBQRSByZXF1aXJlZCwgYnV0IGJvdGggNDAtYml0IGFuZCAxMjgtYml0IGRpc2FibGVkLiIpOwotCSAgICBsY3BfY2xvc2UoZi0+dW5pdCwgIk1QUEUgcmVxdWlyZWQgYnV0IG5vdCBhdmFpbGFibGUiKTsKLQkgICAgcmV0dXJuOwotCX0KLQotCS8qIHN5bmMgb3B0aW9ucyAqLwotCWFvLT5tcHBlID0gZ28tPm1wcGU7Ci0JLyogTVBQRSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIG90aGVyIGNvbXByZXNzaW9uIHR5cGVzICovCi0JYW8tPmJzZF9jb21wcmVzcyA9IGdvLT5ic2RfY29tcHJlc3MgPSAwOwotCWFvLT5wcmVkaWN0b3JfMSAgPSBnby0+cHJlZGljdG9yXzEgID0gMDsKLQlhby0+cHJlZGljdG9yXzIgID0gZ28tPnByZWRpY3Rvcl8yICA9IDA7Ci0JYW8tPmRlZmxhdGUgICAgICA9IGdvLT5kZWZsYXRlICAgICAgPSAwOwotICAgIH0KLSNlbmRpZiAvKiBNUFBFICovCi0KLSAgICAvKgotICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGtlcm5lbCBrbm93cyBhYm91dCB0aGUgdmFyaW91cwotICAgICAqIGNvbXByZXNzaW9uIG1ldGhvZHMgd2UgbWlnaHQgcmVxdWVzdC4KLSAgICAgKi8KLSNpZmRlZiBNUFBFCi0gICAgaWYgKGdvLT5tcHBlKSB7Ci0Jb3B0X2J1ZlswXSA9IENJX01QUEU7Ci0Jb3B0X2J1ZlsxXSA9IENJTEVOX01QUEU7Ci0JTVBQRV9PUFRTX1RPX0NJKGdvLT5tcHBlLCAmb3B0X2J1ZlsyXSk7Ci0JLyogS2V5IG1hdGVyaWFsIHVuaW1wb3J0YW50IGhlcmUuICovCi0JaWYgKGNjcF90ZXN0KGYtPnVuaXQsIG9wdF9idWYsIENJTEVOX01QUEUgKyBNUFBFX01BWF9LRVlfTEVOLCAwKSA8PSAwKSB7Ci0JICAgIGVycm9yKCJNUFBFIHJlcXVpcmVkLCBidXQga2VybmVsIGhhcyBubyBzdXBwb3J0LiIpOwotCSAgICBsY3BfY2xvc2UoZi0+dW5pdCwgIk1QUEUgcmVxdWlyZWQgYnV0IG5vdCBhdmFpbGFibGUiKTsKLQl9Ci0gICAgfQotI2VuZGlmCi0gICAgaWYgKGdvLT5ic2RfY29tcHJlc3MpIHsKLQlvcHRfYnVmWzBdID0gQ0lfQlNEX0NPTVBSRVNTOwotCW9wdF9idWZbMV0gPSBDSUxFTl9CU0RfQ09NUFJFU1M7Ci0Jb3B0X2J1ZlsyXSA9IEJTRF9NQUtFX09QVChCU0RfQ1VSUkVOVF9WRVJTSU9OLCBCU0RfTUlOX0JJVFMpOwotCWlmIChjY3BfdGVzdChmLT51bml0LCBvcHRfYnVmLCBDSUxFTl9CU0RfQ09NUFJFU1MsIDApIDw9IDApCi0JICAgIGdvLT5ic2RfY29tcHJlc3MgPSAwOwotICAgIH0KLSAgICBpZiAoZ28tPmRlZmxhdGUpIHsKLQlpZiAoZ28tPmRlZmxhdGVfY29ycmVjdCkgewotCSAgICBvcHRfYnVmWzBdID0gQ0lfREVGTEFURTsKLQkgICAgb3B0X2J1ZlsxXSA9IENJTEVOX0RFRkxBVEU7Ci0JICAgIG9wdF9idWZbMl0gPSBERUZMQVRFX01BS0VfT1BUKERFRkxBVEVfTUlOX1dPUktTKTsKLQkgICAgb3B0X2J1ZlszXSA9IERFRkxBVEVfQ0hLX1NFUVVFTkNFOwotCSAgICBpZiAoY2NwX3Rlc3QoZi0+dW5pdCwgb3B0X2J1ZiwgQ0lMRU5fREVGTEFURSwgMCkgPD0gMCkKLQkJZ28tPmRlZmxhdGVfY29ycmVjdCA9IDA7Ci0JfQotCWlmIChnby0+ZGVmbGF0ZV9kcmFmdCkgewotCSAgICBvcHRfYnVmWzBdID0gQ0lfREVGTEFURV9EUkFGVDsKLQkgICAgb3B0X2J1ZlsxXSA9IENJTEVOX0RFRkxBVEU7Ci0JICAgIG9wdF9idWZbMl0gPSBERUZMQVRFX01BS0VfT1BUKERFRkxBVEVfTUlOX1dPUktTKTsKLQkgICAgb3B0X2J1ZlszXSA9IERFRkxBVEVfQ0hLX1NFUVVFTkNFOwotCSAgICBpZiAoY2NwX3Rlc3QoZi0+dW5pdCwgb3B0X2J1ZiwgQ0lMRU5fREVGTEFURSwgMCkgPD0gMCkKLQkJZ28tPmRlZmxhdGVfZHJhZnQgPSAwOwotCX0KLQlpZiAoIWdvLT5kZWZsYXRlX2NvcnJlY3QgJiYgIWdvLT5kZWZsYXRlX2RyYWZ0KQotCSAgICBnby0+ZGVmbGF0ZSA9IDA7Ci0gICAgfQotICAgIGlmIChnby0+cHJlZGljdG9yXzEpIHsKLQlvcHRfYnVmWzBdID0gQ0lfUFJFRElDVE9SXzE7Ci0Jb3B0X2J1ZlsxXSA9IENJTEVOX1BSRURJQ1RPUl8xOwotCWlmIChjY3BfdGVzdChmLT51bml0LCBvcHRfYnVmLCBDSUxFTl9QUkVESUNUT1JfMSwgMCkgPD0gMCkKLQkgICAgZ28tPnByZWRpY3Rvcl8xID0gMDsKLSAgICB9Ci0gICAgaWYgKGdvLT5wcmVkaWN0b3JfMikgewotCW9wdF9idWZbMF0gPSBDSV9QUkVESUNUT1JfMjsKLQlvcHRfYnVmWzFdID0gQ0lMRU5fUFJFRElDVE9SXzI7Ci0JaWYgKGNjcF90ZXN0KGYtPnVuaXQsIG9wdF9idWYsIENJTEVOX1BSRURJQ1RPUl8yLCAwKSA8PSAwKQotCSAgICBnby0+cHJlZGljdG9yXzIgPSAwOwotICAgIH0KLX0KLQotLyoKLSAqIGNjcF9jaWxlbiAtIFJldHVybiB0b3RhbCBsZW5ndGggb2Ygb3VyIGNvbmZpZ3VyYXRpb24gaW5mby4KLSAqLwotc3RhdGljIGludAotY2NwX2NpbGVuKGYpCi0gICAgZnNtICpmOwotewotICAgIGNjcF9vcHRpb25zICpnbyA9ICZjY3BfZ290b3B0aW9uc1tmLT51bml0XTsKLQotICAgIHJldHVybiAoZ28tPmJzZF9jb21wcmVzcz8gQ0lMRU5fQlNEX0NPTVBSRVNTOiAwKQotCSsgKGdvLT5kZWZsYXRlPyBDSUxFTl9ERUZMQVRFOiAwKQotCSsgKGdvLT5wcmVkaWN0b3JfMT8gQ0lMRU5fUFJFRElDVE9SXzE6IDApCi0JKyAoZ28tPnByZWRpY3Rvcl8yPyBDSUxFTl9QUkVESUNUT1JfMjogMCkKLQkrIChnby0+bXBwZT8gQ0lMRU5fTVBQRTogMCk7Ci19Ci0KLS8qCi0gKiBjY3BfYWRkY2kgLSBwdXQgb3VyIHJlcXVlc3RzIGluIGEgcGFja2V0LgotICovCi1zdGF0aWMgdm9pZAotY2NwX2FkZGNpKGYsIHAsIGxlbnApCi0gICAgZnNtICpmOwotICAgIHVfY2hhciAqcDsKLSAgICBpbnQgKmxlbnA7Ci17Ci0gICAgaW50IHJlczsKLSAgICBjY3Bfb3B0aW9ucyAqZ28gPSAmY2NwX2dvdG9wdGlvbnNbZi0+dW5pdF07Ci0gICAgdV9jaGFyICpwMCA9IHA7Ci0KLSAgICAvKgotICAgICAqIEFkZCB0aGUgY29tcHJlc3Npb24gdHlwZXMgdGhhdCB3ZSBjYW4gcmVjZWl2ZSwgaW4gZGVjcmVhc2luZwotICAgICAqIHByZWZlcmVuY2Ugb3JkZXIuICBHZXQgdGhlIGtlcm5lbCB0byBhbGxvY2F0ZSB0aGUgZmlyc3Qgb25lCi0gICAgICogaW4gY2FzZSBpdCBnZXRzIEFja2VkLgotICAgICAqLwotI2lmZGVmIE1QUEUKLSAgICBpZiAoZ28tPm1wcGUpIHsKLQl1X2NoYXIgb3B0X2J1ZltDSUxFTl9NUFBFICsgTVBQRV9NQVhfS0VZX0xFTl07Ci0KLQlwWzBdID0gb3B0X2J1ZlswXSA9IENJX01QUEU7Ci0JcFsxXSA9IG9wdF9idWZbMV0gPSBDSUxFTl9NUFBFOwotCU1QUEVfT1BUU19UT19DSShnby0+bXBwZSwgJnBbMl0pOwotCU1QUEVfT1BUU19UT19DSShnby0+bXBwZSwgJm9wdF9idWZbMl0pOwotCUJDT1BZKG1wcGVfcmVjdl9rZXksICZvcHRfYnVmW0NJTEVOX01QUEVdLCBNUFBFX01BWF9LRVlfTEVOKTsKLQlyZXMgPSBjY3BfdGVzdChmLT51bml0LCBvcHRfYnVmLCBDSUxFTl9NUFBFICsgTVBQRV9NQVhfS0VZX0xFTiwgMCk7Ci0JaWYgKHJlcyA+IDApCi0JICAgIHAgKz0gQ0lMRU5fTVBQRTsKLQllbHNlCi0JICAgIC8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbiwgd2UndmUgYWxyZWFkeSB0ZXN0ZWQgaXQhICovCi0JICAgIGxjcF9jbG9zZShmLT51bml0LCAiTVBQRSByZXF1aXJlZCBidXQgbm90IGF2YWlsYWJsZSBpbiBrZXJuZWwiKTsKLSAgICB9Ci0jZW5kaWYKLSAgICBpZiAoZ28tPmRlZmxhdGUpIHsKLQlwWzBdID0gZ28tPmRlZmxhdGVfY29ycmVjdD8gQ0lfREVGTEFURTogQ0lfREVGTEFURV9EUkFGVDsKLQlwWzFdID0gQ0lMRU5fREVGTEFURTsKLQlwWzJdID0gREVGTEFURV9NQUtFX09QVChnby0+ZGVmbGF0ZV9zaXplKTsKLQlwWzNdID0gREVGTEFURV9DSEtfU0VRVUVOQ0U7Ci0JaWYgKHAgIT0gcDApIHsKLQkgICAgcCArPSBDSUxFTl9ERUZMQVRFOwotCX0gZWxzZSB7Ci0JICAgIGZvciAoOzspIHsKLQkJaWYgKGdvLT5kZWZsYXRlX3NpemUgPCBERUZMQVRFX01JTl9XT1JLUykgewotCQkgICAgZ28tPmRlZmxhdGUgPSAwOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkJcmVzID0gY2NwX3Rlc3QoZi0+dW5pdCwgcCwgQ0lMRU5fREVGTEFURSwgMCk7Ci0JCWlmIChyZXMgPiAwKSB7Ci0JCSAgICBwICs9IENJTEVOX0RFRkxBVEU7Ci0JCSAgICBicmVhazsKLQkJfSBlbHNlIGlmIChyZXMgPCAwKSB7Ci0JCSAgICBnby0+ZGVmbGF0ZSA9IDA7Ci0JCSAgICBicmVhazsKLQkJfQotCQktLWdvLT5kZWZsYXRlX3NpemU7Ci0JCXBbMl0gPSBERUZMQVRFX01BS0VfT1BUKGdvLT5kZWZsYXRlX3NpemUpOwotCSAgICB9Ci0JfQotCWlmIChwICE9IHAwICYmIGdvLT5kZWZsYXRlX2NvcnJlY3QgJiYgZ28tPmRlZmxhdGVfZHJhZnQpIHsKLQkgICAgcFswXSA9IENJX0RFRkxBVEVfRFJBRlQ7Ci0JICAgIHBbMV0gPSBDSUxFTl9ERUZMQVRFOwotCSAgICBwWzJdID0gcFsyIC0gQ0lMRU5fREVGTEFURV07Ci0JICAgIHBbM10gPSBERUZMQVRFX0NIS19TRVFVRU5DRTsKLQkgICAgcCArPSBDSUxFTl9ERUZMQVRFOwotCX0KLSAgICB9Ci0gICAgaWYgKGdvLT5ic2RfY29tcHJlc3MpIHsKLQlwWzBdID0gQ0lfQlNEX0NPTVBSRVNTOwotCXBbMV0gPSBDSUxFTl9CU0RfQ09NUFJFU1M7Ci0JcFsyXSA9IEJTRF9NQUtFX09QVChCU0RfQ1VSUkVOVF9WRVJTSU9OLCBnby0+YnNkX2JpdHMpOwotCWlmIChwICE9IHAwKSB7Ci0JICAgIHAgKz0gQ0lMRU5fQlNEX0NPTVBSRVNTOwkvKiBub3QgdGhlIGZpcnN0IG9wdGlvbiAqLwotCX0gZWxzZSB7Ci0JICAgIGZvciAoOzspIHsKLQkJaWYgKGdvLT5ic2RfYml0cyA8IEJTRF9NSU5fQklUUykgewotCQkgICAgZ28tPmJzZF9jb21wcmVzcyA9IDA7Ci0JCSAgICBicmVhazsKLQkJfQotCQlyZXMgPSBjY3BfdGVzdChmLT51bml0LCBwLCBDSUxFTl9CU0RfQ09NUFJFU1MsIDApOwotCQlpZiAocmVzID4gMCkgewotCQkgICAgcCArPSBDSUxFTl9CU0RfQ09NUFJFU1M7Ci0JCSAgICBicmVhazsKLQkJfSBlbHNlIGlmIChyZXMgPCAwKSB7Ci0JCSAgICBnby0+YnNkX2NvbXByZXNzID0gMDsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCS0tZ28tPmJzZF9iaXRzOwotCQlwWzJdID0gQlNEX01BS0VfT1BUKEJTRF9DVVJSRU5UX1ZFUlNJT04sIGdvLT5ic2RfYml0cyk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIC8qIFhYWCBTaG91bGQgUHJlZGljdG9yIDIgYmUgcHJlZmVyYWJsZSB0byBQcmVkaWN0b3IgMT8gKi8KLSAgICBpZiAoZ28tPnByZWRpY3Rvcl8xKSB7Ci0JcFswXSA9IENJX1BSRURJQ1RPUl8xOwotCXBbMV0gPSBDSUxFTl9QUkVESUNUT1JfMTsKLQlpZiAocCA9PSBwMCAmJiBjY3BfdGVzdChmLT51bml0LCBwLCBDSUxFTl9QUkVESUNUT1JfMSwgMCkgPD0gMCkgewotCSAgICBnby0+cHJlZGljdG9yXzEgPSAwOwotCX0gZWxzZSB7Ci0JICAgIHAgKz0gQ0lMRU5fUFJFRElDVE9SXzE7Ci0JfQotICAgIH0KLSAgICBpZiAoZ28tPnByZWRpY3Rvcl8yKSB7Ci0JcFswXSA9IENJX1BSRURJQ1RPUl8yOwotCXBbMV0gPSBDSUxFTl9QUkVESUNUT1JfMjsKLQlpZiAocCA9PSBwMCAmJiBjY3BfdGVzdChmLT51bml0LCBwLCBDSUxFTl9QUkVESUNUT1JfMiwgMCkgPD0gMCkgewotCSAgICBnby0+cHJlZGljdG9yXzIgPSAwOwotCX0gZWxzZSB7Ci0JICAgIHAgKz0gQ0lMRU5fUFJFRElDVE9SXzI7Ci0JfQotICAgIH0KLQotICAgIGdvLT5tZXRob2QgPSAocCA+IHAwKT8gcDBbMF06IC0xOwotCi0gICAgKmxlbnAgPSBwIC0gcDA7Ci19Ci0KLS8qCi0gKiBjY3BfYWNrY2kgLSBwcm9jZXNzIGEgcmVjZWl2ZWQgY29uZmlndXJlLWFjaywgYW5kIHJldHVybgotICogMSBpZmYgdGhlIHBhY2tldCB3YXMgT0suCi0gKi8KLXN0YXRpYyBpbnQKLWNjcF9hY2tjaShmLCBwLCBsZW4pCi0gICAgZnNtICpmOwotICAgIHVfY2hhciAqcDsKLSAgICBpbnQgbGVuOwotewotICAgIGNjcF9vcHRpb25zICpnbyA9ICZjY3BfZ290b3B0aW9uc1tmLT51bml0XTsKLSAgICB1X2NoYXIgKnAwID0gcDsKLQotI2lmZGVmIE1QUEUKLSAgICBpZiAoZ28tPm1wcGUpIHsKLQl1X2NoYXIgb3B0X2J1ZltDSUxFTl9NUFBFXTsKLQotCW9wdF9idWZbMF0gPSBDSV9NUFBFOwotCW9wdF9idWZbMV0gPSBDSUxFTl9NUFBFOwotCU1QUEVfT1BUU19UT19DSShnby0+bXBwZSwgJm9wdF9idWZbMl0pOwotCWlmIChsZW4gPCBDSUxFTl9NUFBFIHx8IG1lbWNtcChvcHRfYnVmLCBwLCBDSUxFTl9NUFBFKSkKLQkgICAgcmV0dXJuIDA7Ci0JcCArPSBDSUxFTl9NUFBFOwotCWxlbiAtPSBDSUxFTl9NUFBFOwotCS8qIFhYWCBDb3BlIHdpdGggZmlyc3QvZmFzdCBhY2sgKi8KLQlpZiAobGVuID09IDApCi0JICAgIHJldHVybiAxOwotICAgIH0KLSNlbmRpZgotICAgIGlmIChnby0+ZGVmbGF0ZSkgewotCWlmIChsZW4gPCBDSUxFTl9ERUZMQVRFCi0JICAgIHx8IHBbMF0gIT0gKGdvLT5kZWZsYXRlX2NvcnJlY3Q/IENJX0RFRkxBVEU6IENJX0RFRkxBVEVfRFJBRlQpCi0JICAgIHx8IHBbMV0gIT0gQ0lMRU5fREVGTEFURQotCSAgICB8fCBwWzJdICE9IERFRkxBVEVfTUFLRV9PUFQoZ28tPmRlZmxhdGVfc2l6ZSkKLQkgICAgfHwgcFszXSAhPSBERUZMQVRFX0NIS19TRVFVRU5DRSkKLQkgICAgcmV0dXJuIDA7Ci0JcCArPSBDSUxFTl9ERUZMQVRFOwotCWxlbiAtPSBDSUxFTl9ERUZMQVRFOwotCS8qIFhYWCBDb3BlIHdpdGggZmlyc3QvZmFzdCBhY2sgKi8KLQlpZiAobGVuID09IDApCi0JICAgIHJldHVybiAxOwotCWlmIChnby0+ZGVmbGF0ZV9jb3JyZWN0ICYmIGdvLT5kZWZsYXRlX2RyYWZ0KSB7Ci0JICAgIGlmIChsZW4gPCBDSUxFTl9ERUZMQVRFCi0JCXx8IHBbMF0gIT0gQ0lfREVGTEFURV9EUkFGVAotCQl8fCBwWzFdICE9IENJTEVOX0RFRkxBVEUKLQkJfHwgcFsyXSAhPSBERUZMQVRFX01BS0VfT1BUKGdvLT5kZWZsYXRlX3NpemUpCi0JCXx8IHBbM10gIT0gREVGTEFURV9DSEtfU0VRVUVOQ0UpCi0JCXJldHVybiAwOwotCSAgICBwICs9IENJTEVOX0RFRkxBVEU7Ci0JICAgIGxlbiAtPSBDSUxFTl9ERUZMQVRFOwotCX0KLSAgICB9Ci0gICAgaWYgKGdvLT5ic2RfY29tcHJlc3MpIHsKLQlpZiAobGVuIDwgQ0lMRU5fQlNEX0NPTVBSRVNTCi0JICAgIHx8IHBbMF0gIT0gQ0lfQlNEX0NPTVBSRVNTIHx8IHBbMV0gIT0gQ0lMRU5fQlNEX0NPTVBSRVNTCi0JICAgIHx8IHBbMl0gIT0gQlNEX01BS0VfT1BUKEJTRF9DVVJSRU5UX1ZFUlNJT04sIGdvLT5ic2RfYml0cykpCi0JICAgIHJldHVybiAwOwotCXAgKz0gQ0lMRU5fQlNEX0NPTVBSRVNTOwotCWxlbiAtPSBDSUxFTl9CU0RfQ09NUFJFU1M7Ci0JLyogWFhYIENvcGUgd2l0aCBmaXJzdC9mYXN0IGFjayAqLwotCWlmIChwID09IHAwICYmIGxlbiA9PSAwKQotCSAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaWYgKGdvLT5wcmVkaWN0b3JfMSkgewotCWlmIChsZW4gPCBDSUxFTl9QUkVESUNUT1JfMQotCSAgICB8fCBwWzBdICE9IENJX1BSRURJQ1RPUl8xIHx8IHBbMV0gIT0gQ0lMRU5fUFJFRElDVE9SXzEpCi0JICAgIHJldHVybiAwOwotCXAgKz0gQ0lMRU5fUFJFRElDVE9SXzE7Ci0JbGVuIC09IENJTEVOX1BSRURJQ1RPUl8xOwotCS8qIFhYWCBDb3BlIHdpdGggZmlyc3QvZmFzdCBhY2sgKi8KLQlpZiAocCA9PSBwMCAmJiBsZW4gPT0gMCkKLQkgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmIChnby0+cHJlZGljdG9yXzIpIHsKLQlpZiAobGVuIDwgQ0lMRU5fUFJFRElDVE9SXzIKLQkgICAgfHwgcFswXSAhPSBDSV9QUkVESUNUT1JfMiB8fCBwWzFdICE9IENJTEVOX1BSRURJQ1RPUl8yKQotCSAgICByZXR1cm4gMDsKLQlwICs9IENJTEVOX1BSRURJQ1RPUl8yOwotCWxlbiAtPSBDSUxFTl9QUkVESUNUT1JfMjsKLQkvKiBYWFggQ29wZSB3aXRoIGZpcnN0L2Zhc3QgYWNrICovCi0JaWYgKHAgPT0gcDAgJiYgbGVuID09IDApCi0JICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIGlmIChsZW4gIT0gMCkKLQlyZXR1cm4gMDsKLSAgICByZXR1cm4gMTsKLX0KLQotLyoKLSAqIGNjcF9uYWtjaSAtIHByb2Nlc3MgcmVjZWl2ZWQgY29uZmlndXJlLW5hay4KLSAqIFJldHVybnMgMSBpZmYgdGhlIG5hayB3YXMgT0suCi0gKi8KLXN0YXRpYyBpbnQKLWNjcF9uYWtjaShmLCBwLCBsZW4sIHRyZWF0X2FzX3JlamVjdCkKLSAgICBmc20gKmY7Ci0gICAgdV9jaGFyICpwOwotICAgIGludCBsZW47Ci0gICAgaW50IHRyZWF0X2FzX3JlamVjdDsKLXsKLSAgICBjY3Bfb3B0aW9ucyAqZ28gPSAmY2NwX2dvdG9wdGlvbnNbZi0+dW5pdF07Ci0gICAgY2NwX29wdGlvbnMgbm87CQkvKiBvcHRpb25zIHdlJ3ZlIHNlZW4gYWxyZWFkeSAqLwotICAgIGNjcF9vcHRpb25zIHRyeTsJCS8qIG9wdGlvbnMgdG8gYXNrIGZvciBuZXh0IHRpbWUgKi8KLQotICAgIG1lbXNldCgmbm8sIDAsIHNpemVvZihubykpOwotICAgIHRyeSA9ICpnbzsKLQotI2lmZGVmIE1QUEUKLSAgICBpZiAoZ28tPm1wcGUgJiYgbGVuID49IENJTEVOX01QUEUKLQkmJiBwWzBdID09IENJX01QUEUgJiYgcFsxXSA9PSBDSUxFTl9NUFBFKSB7Ci0Jbm8ubXBwZSA9IDE7Ci0JLyoKLQkgKiBQZWVyIHdhbnRzIHVzIHRvIHVzZSBhIGRpZmZlcmVudCBzdHJlbmd0aCBvciBvdGhlciBzZXR0aW5nLgotCSAqIEZhaWwgaWYgd2UgYXJlbid0IHdpbGxpbmcgdG8gdXNlIGhpcyBzdWdnZXN0aW9uLgotCSAqLwotCU1QUEVfQ0lfVE9fT1BUUygmcFsyXSwgdHJ5Lm1wcGUpOwotCWlmICgodHJ5Lm1wcGUgJiBNUFBFX09QVF9TVEFURUZVTCkgJiYgcmVmdXNlX21wcGVfc3RhdGVmdWwpIHsKLQkgICAgZXJyb3IoIlJlZnVzaW5nIE1QUEUgc3RhdGVmdWwgbW9kZSBvZmZlcmVkIGJ5IHBlZXIiKTsKLQkgICAgdHJ5Lm1wcGUgPSAwOwotCX0gZWxzZSBpZiAoKChnby0+bXBwZSB8IE1QUEVfT1BUX1NUQVRFRlVMKSAmIHRyeS5tcHBlKSAhPSB0cnkubXBwZSkgewotCSAgICAvKiBQZWVyIG11c3QgaGF2ZSBzZXQgb3B0aW9ucyB3ZSBkaWRuJ3QgcmVxdWVzdCAoc3VnZ2VzdCkgKi8KLQkgICAgdHJ5Lm1wcGUgPSAwOwotCX0KLQotCWlmICghdHJ5Lm1wcGUpIHsKLQkgICAgZXJyb3IoIk1QUEUgcmVxdWlyZWQgYnV0IHBlZXIgbmVnb3RpYXRpb24gZmFpbGVkIik7Ci0JICAgIGxjcF9jbG9zZShmLT51bml0LCAiTVBQRSByZXF1aXJlZCBidXQgcGVlciBuZWdvdGlhdGlvbiBmYWlsZWQiKTsKLQl9Ci0gICAgfQotI2VuZGlmIC8qIE1QUEUgKi8KLSAgICBpZiAoZ28tPmRlZmxhdGUgJiYgbGVuID49IENJTEVOX0RFRkxBVEUKLQkmJiBwWzBdID09IChnby0+ZGVmbGF0ZV9jb3JyZWN0PyBDSV9ERUZMQVRFOiBDSV9ERUZMQVRFX0RSQUZUKQotCSYmIHBbMV0gPT0gQ0lMRU5fREVGTEFURSkgewotCW5vLmRlZmxhdGUgPSAxOwotCS8qCi0JICogUGVlciB3YW50cyB1cyB0byB1c2UgYSBkaWZmZXJlbnQgY29kZSBzaXplIG9yIHNvbWV0aGluZy4KLQkgKiBTdG9wIGFza2luZyBmb3IgRGVmbGF0ZSBpZiB3ZSBkb24ndCB1bmRlcnN0YW5kIGhpcyBzdWdnZXN0aW9uLgotCSAqLwotCWlmIChERUZMQVRFX01FVEhPRChwWzJdKSAhPSBERUZMQVRFX01FVEhPRF9WQUwKLQkgICAgfHwgREVGTEFURV9TSVpFKHBbMl0pIDwgREVGTEFURV9NSU5fV09SS1MKLQkgICAgfHwgcFszXSAhPSBERUZMQVRFX0NIS19TRVFVRU5DRSkKLQkgICAgdHJ5LmRlZmxhdGUgPSAwOwotCWVsc2UgaWYgKERFRkxBVEVfU0laRShwWzJdKSA8IGdvLT5kZWZsYXRlX3NpemUpCi0JICAgIHRyeS5kZWZsYXRlX3NpemUgPSBERUZMQVRFX1NJWkUocFsyXSk7Ci0JcCArPSBDSUxFTl9ERUZMQVRFOwotCWxlbiAtPSBDSUxFTl9ERUZMQVRFOwotCWlmIChnby0+ZGVmbGF0ZV9jb3JyZWN0ICYmIGdvLT5kZWZsYXRlX2RyYWZ0Ci0JICAgICYmIGxlbiA+PSBDSUxFTl9ERUZMQVRFICYmIHBbMF0gPT0gQ0lfREVGTEFURV9EUkFGVAotCSAgICAmJiBwWzFdID09IENJTEVOX0RFRkxBVEUpIHsKLQkgICAgcCArPSBDSUxFTl9ERUZMQVRFOwotCSAgICBsZW4gLT0gQ0lMRU5fREVGTEFURTsKLQl9Ci0gICAgfQotCi0gICAgaWYgKGdvLT5ic2RfY29tcHJlc3MgJiYgbGVuID49IENJTEVOX0JTRF9DT01QUkVTUwotCSYmIHBbMF0gPT0gQ0lfQlNEX0NPTVBSRVNTICYmIHBbMV0gPT0gQ0lMRU5fQlNEX0NPTVBSRVNTKSB7Ci0Jbm8uYnNkX2NvbXByZXNzID0gMTsKLQkvKgotCSAqIFBlZXIgd2FudHMgdXMgdG8gdXNlIGEgZGlmZmVyZW50IG51bWJlciBvZiBiaXRzCi0JICogb3IgYSBkaWZmZXJlbnQgdmVyc2lvbi4KLQkgKi8KLQlpZiAoQlNEX1ZFUlNJT04ocFsyXSkgIT0gQlNEX0NVUlJFTlRfVkVSU0lPTikKLQkgICAgdHJ5LmJzZF9jb21wcmVzcyA9IDA7Ci0JZWxzZSBpZiAoQlNEX05CSVRTKHBbMl0pIDwgZ28tPmJzZF9iaXRzKQotCSAgICB0cnkuYnNkX2JpdHMgPSBCU0RfTkJJVFMocFsyXSk7Ci0JcCArPSBDSUxFTl9CU0RfQ09NUFJFU1M7Ci0JbGVuIC09IENJTEVOX0JTRF9DT01QUkVTUzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFByZWRpY3Rvci0xIGFuZCAyIGhhdmUgbm8gb3B0aW9ucywgc28gdGhleSBjYW4ndCBiZSBOYWtlZC4KLSAgICAgKgotICAgICAqIFRoZXJlIG1heSBiZSByZW1haW5pbmcgb3B0aW9ucyBidXQgd2UgaWdub3JlIHRoZW0uCi0gICAgICovCi0KLSAgICBpZiAoZi0+c3RhdGUgIT0gT1BFTkVEKQotCSpnbyA9IHRyeTsKLSAgICByZXR1cm4gMTsKLX0KLQotLyoKLSAqIGNjcF9yZWpjaSAtIHJlamVjdCBzb21lIG9mIG91ciBzdWdnZXN0ZWQgY29tcHJlc3Npb24gbWV0aG9kcy4KLSAqLwotc3RhdGljIGludAotY2NwX3JlamNpKGYsIHAsIGxlbikKLSAgICBmc20gKmY7Ci0gICAgdV9jaGFyICpwOwotICAgIGludCBsZW47Ci17Ci0gICAgY2NwX29wdGlvbnMgKmdvID0gJmNjcF9nb3RvcHRpb25zW2YtPnVuaXRdOwotICAgIGNjcF9vcHRpb25zIHRyeTsJCS8qIG9wdGlvbnMgdG8gcmVxdWVzdCBuZXh0IHRpbWUgKi8KLQotICAgIHRyeSA9ICpnbzsKLQotICAgIC8qCi0gICAgICogQ29wZSB3aXRoIGVtcHR5IGNvbmZpZ3VyZS1yZWplY3RzIGJ5IGNlYXNpbmcgdG8gc2VuZAotICAgICAqIGNvbmZpZ3VyZS1yZXF1ZXN0cy4KLSAgICAgKi8KLSAgICBpZiAobGVuID09IDAgJiYgYWxsX3JlamVjdGVkW2YtPnVuaXRdKQotCXJldHVybiAtMTsKLQotI2lmZGVmIE1QUEUKLSAgICBpZiAoZ28tPm1wcGUgJiYgbGVuID49IENJTEVOX01QUEUKLQkmJiBwWzBdID09IENJX01QUEUgJiYgcFsxXSA9PSBDSUxFTl9NUFBFKSB7Ci0JZXJyb3IoIk1QUEUgcmVxdWlyZWQgYnV0IHBlZXIgcmVmdXNlZCIpOwotCWxjcF9jbG9zZShmLT51bml0LCAiTVBQRSByZXF1aXJlZCBidXQgcGVlciByZWZ1c2VkIik7Ci0JcCArPSBDSUxFTl9NUFBFOwotCWxlbiAtPSBDSUxFTl9NUFBFOwotICAgIH0KLSNlbmRpZgotICAgIGlmIChnby0+ZGVmbGF0ZV9jb3JyZWN0ICYmIGxlbiA+PSBDSUxFTl9ERUZMQVRFCi0JJiYgcFswXSA9PSBDSV9ERUZMQVRFICYmIHBbMV0gPT0gQ0lMRU5fREVGTEFURSkgewotCWlmIChwWzJdICE9IERFRkxBVEVfTUFLRV9PUFQoZ28tPmRlZmxhdGVfc2l6ZSkKLQkgICAgfHwgcFszXSAhPSBERUZMQVRFX0NIS19TRVFVRU5DRSkKLQkgICAgcmV0dXJuIDA7CQkvKiBSZWogaXMgYmFkICovCi0JdHJ5LmRlZmxhdGVfY29ycmVjdCA9IDA7Ci0JcCArPSBDSUxFTl9ERUZMQVRFOwotCWxlbiAtPSBDSUxFTl9ERUZMQVRFOwotICAgIH0KLSAgICBpZiAoZ28tPmRlZmxhdGVfZHJhZnQgJiYgbGVuID49IENJTEVOX0RFRkxBVEUKLQkmJiBwWzBdID09IENJX0RFRkxBVEVfRFJBRlQgJiYgcFsxXSA9PSBDSUxFTl9ERUZMQVRFKSB7Ci0JaWYgKHBbMl0gIT0gREVGTEFURV9NQUtFX09QVChnby0+ZGVmbGF0ZV9zaXplKQotCSAgICB8fCBwWzNdICE9IERFRkxBVEVfQ0hLX1NFUVVFTkNFKQotCSAgICByZXR1cm4gMDsJCS8qIFJlaiBpcyBiYWQgKi8KLQl0cnkuZGVmbGF0ZV9kcmFmdCA9IDA7Ci0JcCArPSBDSUxFTl9ERUZMQVRFOwotCWxlbiAtPSBDSUxFTl9ERUZMQVRFOwotICAgIH0KLSAgICBpZiAoIXRyeS5kZWZsYXRlX2NvcnJlY3QgJiYgIXRyeS5kZWZsYXRlX2RyYWZ0KQotCXRyeS5kZWZsYXRlID0gMDsKLSAgICBpZiAoZ28tPmJzZF9jb21wcmVzcyAmJiBsZW4gPj0gQ0lMRU5fQlNEX0NPTVBSRVNTCi0JJiYgcFswXSA9PSBDSV9CU0RfQ09NUFJFU1MgJiYgcFsxXSA9PSBDSUxFTl9CU0RfQ09NUFJFU1MpIHsKLQlpZiAocFsyXSAhPSBCU0RfTUFLRV9PUFQoQlNEX0NVUlJFTlRfVkVSU0lPTiwgZ28tPmJzZF9iaXRzKSkKLQkgICAgcmV0dXJuIDA7Ci0JdHJ5LmJzZF9jb21wcmVzcyA9IDA7Ci0JcCArPSBDSUxFTl9CU0RfQ09NUFJFU1M7Ci0JbGVuIC09IENJTEVOX0JTRF9DT01QUkVTUzsKLSAgICB9Ci0gICAgaWYgKGdvLT5wcmVkaWN0b3JfMSAmJiBsZW4gPj0gQ0lMRU5fUFJFRElDVE9SXzEKLQkmJiBwWzBdID09IENJX1BSRURJQ1RPUl8xICYmIHBbMV0gPT0gQ0lMRU5fUFJFRElDVE9SXzEpIHsKLQl0cnkucHJlZGljdG9yXzEgPSAwOwotCXAgKz0gQ0lMRU5fUFJFRElDVE9SXzE7Ci0JbGVuIC09IENJTEVOX1BSRURJQ1RPUl8xOwotICAgIH0KLSAgICBpZiAoZ28tPnByZWRpY3Rvcl8yICYmIGxlbiA+PSBDSUxFTl9QUkVESUNUT1JfMgotCSYmIHBbMF0gPT0gQ0lfUFJFRElDVE9SXzIgJiYgcFsxXSA9PSBDSUxFTl9QUkVESUNUT1JfMikgewotCXRyeS5wcmVkaWN0b3JfMiA9IDA7Ci0JcCArPSBDSUxFTl9QUkVESUNUT1JfMjsKLQlsZW4gLT0gQ0lMRU5fUFJFRElDVE9SXzI7Ci0gICAgfQotCi0gICAgaWYgKGxlbiAhPSAwKQotCXJldHVybiAwOwotCi0gICAgaWYgKGYtPnN0YXRlICE9IE9QRU5FRCkKLQkqZ28gPSB0cnk7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotLyoKLSAqIGNjcF9yZXFjaSAtIHByb2Nlc3NlZCBhIHJlY2VpdmVkIGNvbmZpZ3VyZS1yZXF1ZXN0LgotICogUmV0dXJucyBDT05GQUNLLCBDT05GTkFLIG9yIENPTkZSRUogYW5kIHRoZSBwYWNrZXQgbW9kaWZpZWQKLSAqIGFwcHJvcHJpYXRlbHkuCi0gKi8KLXN0YXRpYyBpbnQKLWNjcF9yZXFjaShmLCBwLCBsZW5wLCBkb250X25haykKLSAgICBmc20gKmY7Ci0gICAgdV9jaGFyICpwOwotICAgIGludCAqbGVucDsKLSAgICBpbnQgZG9udF9uYWs7Ci17Ci0gICAgaW50IHJldCwgbmV3cmV0LCByZXM7Ci0gICAgdV9jaGFyICpwMCwgKnJldHA7Ci0gICAgaW50IGxlbiwgY2xlbiwgdHlwZSwgbmI7Ci0gICAgY2NwX29wdGlvbnMgKmhvID0gJmNjcF9oaXNvcHRpb25zW2YtPnVuaXRdOwotICAgIGNjcF9vcHRpb25zICphbyA9ICZjY3BfYWxsb3dvcHRpb25zW2YtPnVuaXRdOwotI2lmZGVmIE1QUEUKLSAgICBib29sIHJlal9mb3JfY2lfbXBwZSA9IDE7CS8qIEFyZSB3ZSByZWplY3RpbmcgYmFzZWQgb24gYSBiYWQvbWlzc2luZyAqLwotCQkJCS8qIENJX01QUEUsIG9yIGR1ZSB0byBvdGhlciBvcHRpb25zPyAgICAgICAqLwotI2VuZGlmCi0KLSAgICByZXQgPSBDT05GQUNLOwotICAgIHJldHAgPSBwMCA9IHA7Ci0gICAgbGVuID0gKmxlbnA7Ci0KLSAgICBtZW1zZXQoaG8sIDAsIHNpemVvZihjY3Bfb3B0aW9ucykpOwotICAgIGhvLT5tZXRob2QgPSAobGVuID4gMCk/IHBbMF06IC0xOwotCi0gICAgd2hpbGUgKGxlbiA+IDApIHsKLQluZXdyZXQgPSBDT05GQUNLOwotCWlmIChsZW4gPCAyIHx8IHBbMV0gPCAyIHx8IHBbMV0gPiBsZW4pIHsKLQkgICAgLyogbGVuZ3RoIGlzIGJhZCAqLwotCSAgICBjbGVuID0gbGVuOwotCSAgICBuZXdyZXQgPSBDT05GUkVKOwotCi0JfSBlbHNlIHsKLQkgICAgdHlwZSA9IHBbMF07Ci0JICAgIGNsZW4gPSBwWzFdOwotCi0JICAgIHN3aXRjaCAodHlwZSkgewotI2lmZGVmIE1QUEUKLQkgICAgY2FzZSBDSV9NUFBFOgotCQlpZiAoIWFvLT5tcHBlIHx8IGNsZW4gIT0gQ0lMRU5fTVBQRSkgewotCQkgICAgbmV3cmV0ID0gQ09ORlJFSjsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCU1QUEVfQ0lfVE9fT1BUUygmcFsyXSwgaG8tPm1wcGUpOwotCi0JCS8qIE5hayBpZiBhbnl0aGluZyB1bnN1cHBvcnRlZCBvciB1bmtub3duIGFyZSBzZXQuICovCi0JCWlmIChoby0+bXBwZSAmIE1QUEVfT1BUX1VOU1VQUE9SVEVEKSB7Ci0JCSAgICBuZXdyZXQgPSBDT05GTkFLOwotCQkgICAgaG8tPm1wcGUgJj0gfk1QUEVfT1BUX1VOU1VQUE9SVEVEOwotCQl9Ci0JCWlmIChoby0+bXBwZSAmIE1QUEVfT1BUX1VOS05PV04pIHsKLQkJICAgIG5ld3JldCA9IENPTkZOQUs7Ci0JCSAgICBoby0+bXBwZSAmPSB+TVBQRV9PUFRfVU5LTk9XTjsKLQkJfQotCi0JCS8qIENoZWNrIHN0YXRlIG9wdCAqLwotCQlpZiAoaG8tPm1wcGUgJiBNUFBFX09QVF9TVEFURUZVTCkgewotCQkgICAgLyoKLQkJICAgICAqIFdlIGNhbiBOYWsgYW5kIHJlcXVlc3Qgc3RhdGVsZXNzLCBidXQgaXQncyBhCi0JCSAgICAgKiBsb3QgZWFzaWVyIHRvIGp1c3QgYXNzdW1lIHRoZSBwZWVyIHdpbGwgcmVxdWVzdAotCQkgICAgICogaXQgaWYgaGUgY2FuIGRvIGl0OyBzdGF0ZWZ1bCBtb2RlIGlzIGJhZCBvdmVyCi0JCSAgICAgKiB0aGUgSW50ZXJuZXQgLS0gd2hpY2ggaXMgd2hlcmUgd2UgZXhwZWN0IE1QUEUuCi0JCSAgICAgKi8KLQkJICAgaWYgKHJlZnVzZV9tcHBlX3N0YXRlZnVsKSB7Ci0JCQllcnJvcigiUmVmdXNpbmcgTVBQRSBzdGF0ZWZ1bCBtb2RlIG9mZmVyZWQgYnkgcGVlciIpOwotCQkJbmV3cmV0ID0gQ09ORlJFSjsKLQkJCWJyZWFrOwotCQkgICAgfQotCQl9Ci0KLQkJLyogRmluZCBvdXQgd2hpY2ggb2Yge1MsTH0gYXJlIHNldC4gKi8KLQkJaWYgKChoby0+bXBwZSAmIE1QUEVfT1BUXzEyOCkKLQkJICAgICAmJiAoaG8tPm1wcGUgJiBNUFBFX09QVF80MCkpIHsKLQkJICAgIC8qIEJvdGggYXJlIHNldCwgbmVnb3RpYXRlIHRoZSBzdHJvbmdlc3QuICovCi0JCSAgICBuZXdyZXQgPSBDT05GTkFLOwotCQkgICAgaWYgKGFvLT5tcHBlICYgTVBQRV9PUFRfMTI4KQotCQkJaG8tPm1wcGUgJj0gfk1QUEVfT1BUXzQwOwotCQkgICAgZWxzZSBpZiAoYW8tPm1wcGUgJiBNUFBFX09QVF80MCkKLQkJCWhvLT5tcHBlICY9IH5NUFBFX09QVF8xMjg7Ci0JCSAgICBlbHNlIHsKLQkJCW5ld3JldCA9IENPTkZSRUo7Ci0JCQlicmVhazsKLQkJICAgIH0KLQkJfSBlbHNlIGlmIChoby0+bXBwZSAmIE1QUEVfT1BUXzEyOCkgewotCQkgICAgaWYgKCEoYW8tPm1wcGUgJiBNUFBFX09QVF8xMjgpKSB7Ci0JCQluZXdyZXQgPSBDT05GUkVKOwotCQkJYnJlYWs7Ci0JCSAgICB9Ci0JCX0gZWxzZSBpZiAoaG8tPm1wcGUgJiBNUFBFX09QVF80MCkgewotCQkgICAgaWYgKCEoYW8tPm1wcGUgJiBNUFBFX09QVF80MCkpIHsKLQkJCW5ld3JldCA9IENPTkZSRUo7Ci0JCQlicmVhazsKLQkJICAgIH0KLQkJfSBlbHNlIHsKLQkJICAgIC8qIE5laXRoZXIgYXJlIHNldC4gKi8KLQkJICAgIC8qIFdlIGNhbm5vdCBhY2NlcHQgdGhpcy4gICovCi0JCSAgICBuZXdyZXQgPSBDT05GTkFLOwotCQkgICAgLyogR2l2ZSB0aGUgcGVlciBvdXIgaWRlYSBvZiB3aGF0IGNhbiBiZSB1c2VkLAotCQkgICAgICAgc28gaXQgY2FuIGNob29zZSBhbmQgY29uZmlybSAqLwotCQkgICAgaG8tPm1wcGUgPSBhby0+bXBwZTsKLQkJfQotCi0JCS8qIHJlYnVpbGQgdGhlIG9wdHMgKi8KLQkJTVBQRV9PUFRTX1RPX0NJKGhvLT5tcHBlLCAmcFsyXSk7Ci0JCWlmIChuZXdyZXQgPT0gQ09ORkFDSykgewotCQkgICAgdV9jaGFyIG9wdF9idWZbQ0lMRU5fTVBQRSArIE1QUEVfTUFYX0tFWV9MRU5dOwotCQkgICAgaW50IG10dTsKLQotCQkgICAgQkNPUFkocCwgb3B0X2J1ZiwgQ0lMRU5fTVBQRSk7Ci0JCSAgICBCQ09QWShtcHBlX3NlbmRfa2V5LCAmb3B0X2J1ZltDSUxFTl9NUFBFXSwKLQkJCSAgTVBQRV9NQVhfS0VZX0xFTik7Ci0JCSAgICBpZiAoY2NwX3Rlc3QoZi0+dW5pdCwgb3B0X2J1ZiwKLQkJCQkgQ0lMRU5fTVBQRSArIE1QUEVfTUFYX0tFWV9MRU4sIDEpIDw9IDApIHsKLQkJCS8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbiwgd2UndmUgYWxyZWFkeSB0ZXN0ZWQgaXQhICovCi0JCQllcnJvcigiTVBQRSByZXF1aXJlZCwgYnV0IGtlcm5lbCBoYXMgbm8gc3VwcG9ydC4iKTsKLQkJCWxjcF9jbG9zZShmLT51bml0LCAiTVBQRSByZXF1aXJlZCBidXQgbm90IGF2YWlsYWJsZSIpOwotCQkJbmV3cmV0ID0gQ09ORlJFSjsKLQkJCWJyZWFrOwotCQkgICAgfQotCQkgICAgLyoKLQkJICAgICAqIFdlIG5lZWQgdG8gZGVjcmVhc2UgdGhlIGludGVyZmFjZSBNVFUgYnkgTVBQRV9QQUQKLQkJICAgICAqIGJlY2F1c2UgTVBQRSBmcmFtZXMgKipncm93KiouICBUaGUga2VybmVsIFttdXN0XQotCQkgICAgICogYWxsb2NhdGUgTVBQRV9QQUQgZXh0cmEgYnl0ZXMgaW4geG1pdCBidWZmZXJzLgotCQkgICAgICovCi0JCSAgICBtdHUgPSBuZXRpZl9nZXRfbXR1KGYtPnVuaXQpOwotCQkgICAgaWYgKG10dSkKLQkJCW5ldGlmX3NldF9tdHUoZi0+dW5pdCwgbXR1IC0gTVBQRV9QQUQpOwotCQkgICAgZWxzZQotCQkJbmV3cmV0ID0gQ09ORlJFSjsKLQkJfQotCi0JCS8qCi0JCSAqIFdlIGhhdmUgYWNjZXB0ZWQgTVBQRSBvciBhcmUgd2lsbGluZyB0byBuZWdvdGlhdGUKLQkJICogTVBQRSBwYXJhbWV0ZXJzLiAgQSBDT05GUkVKIGlzIGR1ZSB0byBzdWJzZXF1ZW50Ci0JCSAqIChub24tTVBQRSkgcHJvY2Vzc2luZy4KLQkJICovCi0JCXJlal9mb3JfY2lfbXBwZSA9IDA7Ci0JCWJyZWFrOwotI2VuZGlmIC8qIE1QUEUgKi8KLQkgICAgY2FzZSBDSV9ERUZMQVRFOgotCSAgICBjYXNlIENJX0RFRkxBVEVfRFJBRlQ6Ci0JCWlmICghYW8tPmRlZmxhdGUgfHwgY2xlbiAhPSBDSUxFTl9ERUZMQVRFCi0JCSAgICB8fCAoIWFvLT5kZWZsYXRlX2NvcnJlY3QgJiYgdHlwZSA9PSBDSV9ERUZMQVRFKQotCQkgICAgfHwgKCFhby0+ZGVmbGF0ZV9kcmFmdCAmJiB0eXBlID09IENJX0RFRkxBVEVfRFJBRlQpKSB7Ci0JCSAgICBuZXdyZXQgPSBDT05GUkVKOwotCQkgICAgYnJlYWs7Ci0JCX0KLQotCQloby0+ZGVmbGF0ZSA9IDE7Ci0JCWhvLT5kZWZsYXRlX3NpemUgPSBuYiA9IERFRkxBVEVfU0laRShwWzJdKTsKLQkJaWYgKERFRkxBVEVfTUVUSE9EKHBbMl0pICE9IERFRkxBVEVfTUVUSE9EX1ZBTAotCQkgICAgfHwgcFszXSAhPSBERUZMQVRFX0NIS19TRVFVRU5DRQotCQkgICAgfHwgbmIgPiBhby0+ZGVmbGF0ZV9zaXplIHx8IG5iIDwgREVGTEFURV9NSU5fV09SS1MpIHsKLQkJICAgIG5ld3JldCA9IENPTkZOQUs7Ci0JCSAgICBpZiAoIWRvbnRfbmFrKSB7Ci0JCQlwWzJdID0gREVGTEFURV9NQUtFX09QVChhby0+ZGVmbGF0ZV9zaXplKTsKLQkJCXBbM10gPSBERUZMQVRFX0NIS19TRVFVRU5DRTsKLQkJCS8qIGZhbGwgdGhyb3VnaCB0byB0ZXN0IHRoaXMgI2JpdHMgYmVsb3cgKi8KLQkJICAgIH0gZWxzZQotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKgotCQkgKiBDaGVjayB3aGV0aGVyIHdlIGNhbiBkbyBEZWZsYXRlIHdpdGggdGhlIHdpbmRvdwotCQkgKiBzaXplIHRoZXkgd2FudC4gIElmIHRoZSB3aW5kb3cgaXMgdG9vIGJpZywgcmVkdWNlCi0JCSAqIGl0IHVudGlsIHRoZSBrZXJuZWwgY2FuIGNvcGUgYW5kIG5hayB3aXRoIHRoYXQuCi0JCSAqIFdlIG9ubHkgY2hlY2sgdGhpcyBmb3IgdGhlIGZpcnN0IG9wdGlvbi4KLQkJICovCi0JCWlmIChwID09IHAwKSB7Ci0JCSAgICBmb3IgKDs7KSB7Ci0JCQlyZXMgPSBjY3BfdGVzdChmLT51bml0LCBwLCBDSUxFTl9ERUZMQVRFLCAxKTsKLQkJCWlmIChyZXMgPiAwKQotCQkJICAgIGJyZWFrOwkJLyogaXQncyBPSyBub3cgKi8KLQkJCWlmIChyZXMgPCAwIHx8IG5iID09IERFRkxBVEVfTUlOX1dPUktTIHx8IGRvbnRfbmFrKSB7Ci0JCQkgICAgbmV3cmV0ID0gQ09ORlJFSjsKLQkJCSAgICBwWzJdID0gREVGTEFURV9NQUtFX09QVChoby0+ZGVmbGF0ZV9zaXplKTsKLQkJCSAgICBicmVhazsKLQkJCX0KLQkJCW5ld3JldCA9IENPTkZOQUs7Ci0JCQktLW5iOwotCQkJcFsyXSA9IERFRkxBVEVfTUFLRV9PUFQobmIpOwotCQkgICAgfQotCQl9Ci0JCWJyZWFrOwotCi0JICAgIGNhc2UgQ0lfQlNEX0NPTVBSRVNTOgotCQlpZiAoIWFvLT5ic2RfY29tcHJlc3MgfHwgY2xlbiAhPSBDSUxFTl9CU0RfQ09NUFJFU1MpIHsKLQkJICAgIG5ld3JldCA9IENPTkZSRUo7Ci0JCSAgICBicmVhazsKLQkJfQotCi0JCWhvLT5ic2RfY29tcHJlc3MgPSAxOwotCQloby0+YnNkX2JpdHMgPSBuYiA9IEJTRF9OQklUUyhwWzJdKTsKLQkJaWYgKEJTRF9WRVJTSU9OKHBbMl0pICE9IEJTRF9DVVJSRU5UX1ZFUlNJT04KLQkJICAgIHx8IG5iID4gYW8tPmJzZF9iaXRzIHx8IG5iIDwgQlNEX01JTl9CSVRTKSB7Ci0JCSAgICBuZXdyZXQgPSBDT05GTkFLOwotCQkgICAgaWYgKCFkb250X25haykgewotCQkJcFsyXSA9IEJTRF9NQUtFX09QVChCU0RfQ1VSUkVOVF9WRVJTSU9OLCBhby0+YnNkX2JpdHMpOwotCQkJLyogZmFsbCB0aHJvdWdoIHRvIHRlc3QgdGhpcyAjYml0cyBiZWxvdyAqLwotCQkgICAgfSBlbHNlCi0JCQlicmVhazsKLQkJfQotCi0JCS8qCi0JCSAqIENoZWNrIHdoZXRoZXIgd2UgY2FuIGRvIEJTRC1Db21wcmVzcyB3aXRoIHRoZSBjb2RlCi0JCSAqIHNpemUgdGhleSB3YW50LiAgSWYgdGhlIGNvZGUgc2l6ZSBpcyB0b28gYmlnLCByZWR1Y2UKLQkJICogaXQgdW50aWwgdGhlIGtlcm5lbCBjYW4gY29wZSBhbmQgbmFrIHdpdGggdGhhdC4KLQkJICogV2Ugb25seSBjaGVjayB0aGlzIGZvciB0aGUgZmlyc3Qgb3B0aW9uLgotCQkgKi8KLQkJaWYgKHAgPT0gcDApIHsKLQkJICAgIGZvciAoOzspIHsKLQkJCXJlcyA9IGNjcF90ZXN0KGYtPnVuaXQsIHAsIENJTEVOX0JTRF9DT01QUkVTUywgMSk7Ci0JCQlpZiAocmVzID4gMCkKLQkJCSAgICBicmVhazsKLQkJCWlmIChyZXMgPCAwIHx8IG5iID09IEJTRF9NSU5fQklUUyB8fCBkb250X25haykgewotCQkJICAgIG5ld3JldCA9IENPTkZSRUo7Ci0JCQkgICAgcFsyXSA9IEJTRF9NQUtFX09QVChCU0RfQ1VSUkVOVF9WRVJTSU9OLAotCQkJCQkJaG8tPmJzZF9iaXRzKTsKLQkJCSAgICBicmVhazsKLQkJCX0KLQkJCW5ld3JldCA9IENPTkZOQUs7Ci0JCQktLW5iOwotCQkJcFsyXSA9IEJTRF9NQUtFX09QVChCU0RfQ1VSUkVOVF9WRVJTSU9OLCBuYik7Ci0JCSAgICB9Ci0JCX0KLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSBDSV9QUkVESUNUT1JfMToKLQkJaWYgKCFhby0+cHJlZGljdG9yXzEgfHwgY2xlbiAhPSBDSUxFTl9QUkVESUNUT1JfMSkgewotCQkgICAgbmV3cmV0ID0gQ09ORlJFSjsKLQkJICAgIGJyZWFrOwotCQl9Ci0KLQkJaG8tPnByZWRpY3Rvcl8xID0gMTsKLQkJaWYgKHAgPT0gcDAKLQkJICAgICYmIGNjcF90ZXN0KGYtPnVuaXQsIHAsIENJTEVOX1BSRURJQ1RPUl8xLCAxKSA8PSAwKSB7Ci0JCSAgICBuZXdyZXQgPSBDT05GUkVKOwotCQl9Ci0JCWJyZWFrOwotCi0JICAgIGNhc2UgQ0lfUFJFRElDVE9SXzI6Ci0JCWlmICghYW8tPnByZWRpY3Rvcl8yIHx8IGNsZW4gIT0gQ0lMRU5fUFJFRElDVE9SXzIpIHsKLQkJICAgIG5ld3JldCA9IENPTkZSRUo7Ci0JCSAgICBicmVhazsKLQkJfQotCi0JCWhvLT5wcmVkaWN0b3JfMiA9IDE7Ci0JCWlmIChwID09IHAwCi0JCSAgICAmJiBjY3BfdGVzdChmLT51bml0LCBwLCBDSUxFTl9QUkVESUNUT1JfMiwgMSkgPD0gMCkgewotCQkgICAgbmV3cmV0ID0gQ09ORlJFSjsKLQkJfQotCQlicmVhazsKLQotCSAgICBkZWZhdWx0OgotCQluZXdyZXQgPSBDT05GUkVKOwotCSAgICB9Ci0JfQotCi0JaWYgKG5ld3JldCA9PSBDT05GTkFLICYmIGRvbnRfbmFrKQotCSAgICBuZXdyZXQgPSBDT05GUkVKOwotCWlmICghKG5ld3JldCA9PSBDT05GQUNLIHx8IChuZXdyZXQgPT0gQ09ORk5BSyAmJiByZXQgPT0gQ09ORlJFSikpKSB7Ci0JICAgIC8qIHdlJ3JlIHJldHVybmluZyB0aGlzIG9wdGlvbiAqLwotCSAgICBpZiAobmV3cmV0ID09IENPTkZSRUogJiYgcmV0ID09IENPTkZOQUspCi0JCXJldHAgPSBwMDsKLQkgICAgcmV0ID0gbmV3cmV0OwotCSAgICBpZiAocCAhPSByZXRwKQotCQlCQ09QWShwLCByZXRwLCBjbGVuKTsKLQkgICAgcmV0cCArPSBjbGVuOwotCX0KLQotCXAgKz0gY2xlbjsKLQlsZW4gLT0gY2xlbjsKLSAgICB9Ci0KLSAgICBpZiAocmV0ICE9IENPTkZBQ0spIHsKLQlpZiAocmV0ID09IENPTkZSRUogJiYgKmxlbnAgPT0gcmV0cCAtIHAwKQotCSAgICBhbGxfcmVqZWN0ZWRbZi0+dW5pdF0gPSAxOwotCWVsc2UKLQkgICAgKmxlbnAgPSByZXRwIC0gcDA7Ci0gICAgfQotI2lmZGVmIE1QUEUKLSAgICBpZiAocmV0ID09IENPTkZSRUogJiYgYW8tPm1wcGUgJiYgcmVqX2Zvcl9jaV9tcHBlKSB7Ci0JZXJyb3IoIk1QUEUgcmVxdWlyZWQgYnV0IHBlZXIgbmVnb3RpYXRpb24gZmFpbGVkIik7Ci0JbGNwX2Nsb3NlKGYtPnVuaXQsICJNUFBFIHJlcXVpcmVkIGJ1dCBwZWVyIG5lZ290aWF0aW9uIGZhaWxlZCIpOwotICAgIH0KLSNlbmRpZgotICAgIHJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBNYWtlIGEgc3RyaW5nIG5hbWUgZm9yIGEgY29tcHJlc3Npb24gbWV0aG9kIChvciAyKS4KLSAqLwotc3RhdGljIGNoYXIgKgotbWV0aG9kX25hbWUob3B0LCBvcHQyKQotICAgIGNjcF9vcHRpb25zICpvcHQsICpvcHQyOwotewotICAgIHN0YXRpYyBjaGFyIHJlc3VsdFs2NF07Ci0KLSAgICBpZiAoIUFOWV9DT01QUkVTUygqb3B0KSkKLQlyZXR1cm4gIihub25lKSI7Ci0gICAgc3dpdGNoIChvcHQtPm1ldGhvZCkgewotI2lmZGVmIE1QUEUKLSAgICBjYXNlIENJX01QUEU6Ci0gICAgewotCWNoYXIgKnAgPSByZXN1bHQ7Ci0JY2hhciAqcSA9IHJlc3VsdCArIHNpemVvZihyZXN1bHQpOyAvKiAxIHBhc3QgcmVzdWx0ICovCi0KLQlzbHByaW50ZihwLCBxIC0gcCwgIk1QUEUgIik7Ci0JcCArPSA1OwotCWlmIChvcHQtPm1wcGUgJiBNUFBFX09QVF8xMjgpIHsKLQkgICAgc2xwcmludGYocCwgcSAtIHAsICIxMjgtYml0ICIpOwotCSAgICBwICs9IDg7Ci0JfQotCWlmIChvcHQtPm1wcGUgJiBNUFBFX09QVF80MCkgewotCSAgICBzbHByaW50ZihwLCBxIC0gcCwgIjQwLWJpdCAiKTsKLQkgICAgcCArPSA3OwotCX0KLQlpZiAob3B0LT5tcHBlICYgTVBQRV9PUFRfU1RBVEVGVUwpCi0JICAgIHNscHJpbnRmKHAsIHEgLSBwLCAic3RhdGVmdWwiKTsKLQllbHNlCi0JICAgIHNscHJpbnRmKHAsIHEgLSBwLCAic3RhdGVsZXNzIik7Ci0KLQlicmVhazsKLSAgICB9Ci0jZW5kaWYKLSAgICBjYXNlIENJX0RFRkxBVEU6Ci0gICAgY2FzZSBDSV9ERUZMQVRFX0RSQUZUOgotCWlmIChvcHQyICE9IE5VTEwgJiYgb3B0Mi0+ZGVmbGF0ZV9zaXplICE9IG9wdC0+ZGVmbGF0ZV9zaXplKQotCSAgICBzbHByaW50ZihyZXN1bHQsIHNpemVvZihyZXN1bHQpLCAiRGVmbGF0ZSVzICglZC8lZCkiLAotCQkgICAgIChvcHQtPm1ldGhvZCA9PSBDSV9ERUZMQVRFX0RSQUZUPyAiKG9sZCMpIjogIiIpLAotCQkgICAgIG9wdC0+ZGVmbGF0ZV9zaXplLCBvcHQyLT5kZWZsYXRlX3NpemUpOwotCWVsc2UKLQkgICAgc2xwcmludGYocmVzdWx0LCBzaXplb2YocmVzdWx0KSwgIkRlZmxhdGUlcyAoJWQpIiwKLQkJICAgICAob3B0LT5tZXRob2QgPT0gQ0lfREVGTEFURV9EUkFGVD8gIihvbGQjKSI6ICIiKSwKLQkJICAgICBvcHQtPmRlZmxhdGVfc2l6ZSk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBDSV9CU0RfQ09NUFJFU1M6Ci0JaWYgKG9wdDIgIT0gTlVMTCAmJiBvcHQyLT5ic2RfYml0cyAhPSBvcHQtPmJzZF9iaXRzKQotCSAgICBzbHByaW50ZihyZXN1bHQsIHNpemVvZihyZXN1bHQpLCAiQlNELUNvbXByZXNzICglZC8lZCkiLAotCQkgICAgIG9wdC0+YnNkX2JpdHMsIG9wdDItPmJzZF9iaXRzKTsKLQllbHNlCi0JICAgIHNscHJpbnRmKHJlc3VsdCwgc2l6ZW9mKHJlc3VsdCksICJCU0QtQ29tcHJlc3MgKCVkKSIsCi0JCSAgICAgb3B0LT5ic2RfYml0cyk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBDSV9QUkVESUNUT1JfMToKLQlyZXR1cm4gIlByZWRpY3RvciAxIjsKLSAgICBjYXNlIENJX1BSRURJQ1RPUl8yOgotCXJldHVybiAiUHJlZGljdG9yIDIiOwotICAgIGRlZmF1bHQ6Ci0Jc2xwcmludGYocmVzdWx0LCBzaXplb2YocmVzdWx0KSwgIk1ldGhvZCAlZCIsIG9wdC0+bWV0aG9kKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLSAqIENDUCBoYXMgY29tZSB1cCAtIGluZm9ybSB0aGUga2VybmVsIGRyaXZlciBhbmQgbG9nIGEgbWVzc2FnZS4KLSAqLwotc3RhdGljIHZvaWQKLWNjcF91cChmKQotICAgIGZzbSAqZjsKLXsKLSAgICBjY3Bfb3B0aW9ucyAqZ28gPSAmY2NwX2dvdG9wdGlvbnNbZi0+dW5pdF07Ci0gICAgY2NwX29wdGlvbnMgKmhvID0gJmNjcF9oaXNvcHRpb25zW2YtPnVuaXRdOwotICAgIGNoYXIgbWV0aG9kMVs2NF07Ci0KLSAgICBjY3BfZmxhZ3Nfc2V0KGYtPnVuaXQsIDEsIDEpOwotICAgIGlmIChBTllfQ09NUFJFU1MoKmdvKSkgewotCWlmIChBTllfQ09NUFJFU1MoKmhvKSkgewotCSAgICBpZiAoZ28tPm1ldGhvZCA9PSBoby0+bWV0aG9kKSB7Ci0JCW5vdGljZSgiJXMgY29tcHJlc3Npb24gZW5hYmxlZCIsIG1ldGhvZF9uYW1lKGdvLCBobykpOwotCSAgICB9IGVsc2UgewotCQlzdHJsY3B5KG1ldGhvZDEsIG1ldGhvZF9uYW1lKGdvLCBOVUxMKSwgc2l6ZW9mKG1ldGhvZDEpKTsKLQkJbm90aWNlKCIlcyAvICVzIGNvbXByZXNzaW9uIGVuYWJsZWQiLAotCQkgICAgICAgbWV0aG9kMSwgbWV0aG9kX25hbWUoaG8sIE5VTEwpKTsKLQkgICAgfQotCX0gZWxzZQotCSAgICBub3RpY2UoIiVzIHJlY2VpdmUgY29tcHJlc3Npb24gZW5hYmxlZCIsIG1ldGhvZF9uYW1lKGdvLCBOVUxMKSk7Ci0gICAgfSBlbHNlIGlmIChBTllfQ09NUFJFU1MoKmhvKSkKLQlub3RpY2UoIiVzIHRyYW5zbWl0IGNvbXByZXNzaW9uIGVuYWJsZWQiLCBtZXRob2RfbmFtZShobywgTlVMTCkpOwotI2lmZGVmIE1QUEUKLSAgICBpZiAoZ28tPm1wcGUpIHsKLQlCWkVSTyhtcHBlX3JlY3Zfa2V5LCBNUFBFX01BWF9LRVlfTEVOKTsKLQlCWkVSTyhtcHBlX3NlbmRfa2V5LCBNUFBFX01BWF9LRVlfTEVOKTsKLQljb250aW51ZV9uZXR3b3JrcyhmLT51bml0KTsJCS8qIEJyaW5nIHVwIElQIGV0IGFsICovCi0gICAgfQotI2VuZGlmCi19Ci0KLS8qCi0gKiBDQ1AgaGFzIGdvbmUgZG93biAtIGluZm9ybSB0aGUga2VybmVsIGRyaXZlci4KLSAqLwotc3RhdGljIHZvaWQKLWNjcF9kb3duKGYpCi0gICAgZnNtICpmOwotewotICAgIGlmIChjY3BfbG9jYWxzdGF0ZVtmLT51bml0XSAmIFJBQ0tfUEVORElORykKLQlVTlRJTUVPVVQoY2NwX3JhY2tfdGltZW91dCwgZik7Ci0gICAgY2NwX2xvY2Fsc3RhdGVbZi0+dW5pdF0gPSAwOwotICAgIGNjcF9mbGFnc19zZXQoZi0+dW5pdCwgMSwgMCk7Ci0jaWZkZWYgTVBQRQotICAgIGlmIChjY3BfZ290b3B0aW9uc1tmLT51bml0XS5tcHBlKSB7Ci0JY2NwX2dvdG9wdGlvbnNbZi0+dW5pdF0ubXBwZSA9IDA7Ci0JaWYgKGxjcF9mc21bZi0+dW5pdF0uc3RhdGUgPT0gT1BFTkVEKSB7Ci0JICAgIC8qIElmIExDUCBpcyBub3QgYWxyZWFkeSBnb2luZyBkb3duLCBtYWtlIHN1cmUgaXQgZG9lcy4gKi8KLQkgICAgZXJyb3IoIk1QUEUgZGlzYWJsZWQiKTsKLQkgICAgbGNwX2Nsb3NlKGYtPnVuaXQsICJNUFBFIGRpc2FibGVkIik7Ci0JfQotICAgIH0KLSNlbmRpZgotfQotCi0vKgotICogUHJpbnQgdGhlIGNvbnRlbnRzIG9mIGEgQ0NQIHBhY2tldC4KLSAqLwotc3RhdGljIGNoYXIgKmNjcF9jb2RlbmFtZXNbXSA9IHsKLSAgICAiQ29uZlJlcSIsICJDb25mQWNrIiwgIkNvbmZOYWsiLCAiQ29uZlJlaiIsCi0gICAgIlRlcm1SZXEiLCAiVGVybUFjayIsICJDb2RlUmVqIiwKLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgICJSZXNldFJlcSIsICJSZXNldEFjayIsCi19OwotCi1zdGF0aWMgaW50Ci1jY3BfcHJpbnRwa3QocCwgcGxlbiwgcHJpbnRlciwgYXJnKQotICAgIHVfY2hhciAqcDsKLSAgICBpbnQgcGxlbjsKLSAgICB2b2lkICgqcHJpbnRlcikgX19QKCh2b2lkICosIGNoYXIgKiwgLi4uKSk7Ci0gICAgdm9pZCAqYXJnOwotewotICAgIHVfY2hhciAqcDAsICpvcHRlbmQ7Ci0gICAgaW50IGNvZGUsIGlkLCBsZW47Ci0gICAgaW50IG9wdGxlbjsKLQotICAgIHAwID0gcDsKLSAgICBpZiAocGxlbiA8IEhFQURFUkxFTikKLQlyZXR1cm4gMDsKLSAgICBjb2RlID0gcFswXTsKLSAgICBpZCA9IHBbMV07Ci0gICAgbGVuID0gKHBbMl0gPDwgOCkgKyBwWzNdOwotICAgIGlmIChsZW4gPCBIRUFERVJMRU4gfHwgbGVuID4gcGxlbikKLQlyZXR1cm4gMDsKLQotICAgIGlmIChjb2RlID49IDEgJiYgY29kZSA8PSBzaXplb2YoY2NwX2NvZGVuYW1lcykgLyBzaXplb2YoY2hhciAqKQotCSYmIGNjcF9jb2RlbmFtZXNbY29kZS0xXSAhPSBOVUxMKQotCXByaW50ZXIoYXJnLCAiICVzIiwgY2NwX2NvZGVuYW1lc1tjb2RlLTFdKTsKLSAgICBlbHNlCi0JcHJpbnRlcihhcmcsICIgY29kZT0weCV4IiwgY29kZSk7Ci0gICAgcHJpbnRlcihhcmcsICIgaWQ9MHgleCIsIGlkKTsKLSAgICBsZW4gLT0gSEVBREVSTEVOOwotICAgIHAgKz0gSEVBREVSTEVOOwotCi0gICAgc3dpdGNoIChjb2RlKSB7Ci0gICAgY2FzZSBDT05GUkVROgotICAgIGNhc2UgQ09ORkFDSzoKLSAgICBjYXNlIENPTkZOQUs6Ci0gICAgY2FzZSBDT05GUkVKOgotCS8qIHByaW50IGxpc3Qgb2YgcG9zc2libGUgY29tcHJlc3Npb24gbWV0aG9kcyAqLwotCXdoaWxlIChsZW4gPj0gMikgewotCSAgICBjb2RlID0gcFswXTsKLQkgICAgb3B0bGVuID0gcFsxXTsKLQkgICAgaWYgKG9wdGxlbiA8IDIgfHwgb3B0bGVuID4gbGVuKQotCQlicmVhazsKLQkgICAgcHJpbnRlcihhcmcsICIgPCIpOwotCSAgICBsZW4gLT0gb3B0bGVuOwotCSAgICBvcHRlbmQgPSBwICsgb3B0bGVuOwotCSAgICBzd2l0Y2ggKGNvZGUpIHsKLSNpZmRlZiBNUFBFCi0JICAgIGNhc2UgQ0lfTVBQRToKLQkJaWYgKG9wdGxlbiA+PSBDSUxFTl9NUFBFKSB7Ci0JCSAgICB1X2NoYXIgbXBwZV9vcHRzOwotCi0JCSAgICBNUFBFX0NJX1RPX09QVFMoJnBbMl0sIG1wcGVfb3B0cyk7Ci0JCSAgICBwcmludGVyKGFyZywgIm1wcGUgJXMgJXMgJXMgJXMgJXMgJXMlcyIsCi0JCQkgICAgKHBbMl0gJiBNUFBFX0hfQklUKT8gIitIIjogIi1IIiwKLQkJCSAgICAocFs1XSAmIE1QUEVfTV9CSVQpPyAiK00iOiAiLU0iLAotCQkJICAgIChwWzVdICYgTVBQRV9TX0JJVCk/ICIrUyI6ICItUyIsCi0JCQkgICAgKHBbNV0gJiBNUFBFX0xfQklUKT8gIitMIjogIi1MIiwKLQkJCSAgICAocFs1XSAmIE1QUEVfRF9CSVQpPyAiK0QiOiAiLUQiLAotCQkJICAgIChwWzVdICYgTVBQRV9DX0JJVCk/ICIrQyI6ICItQyIsCi0JCQkgICAgKG1wcGVfb3B0cyAmIE1QUEVfT1BUX1VOS05PV04pPyAiICtVIjogIiIpOwotCQkgICAgaWYgKG1wcGVfb3B0cyAmIE1QUEVfT1BUX1VOS05PV04pCi0JCQlwcmludGVyKGFyZywgIiAoJS4yeCAlLjJ4ICUuMnggJS4yeCkiLAotCQkJCXBbMl0sIHBbM10sIHBbNF0sIHBbNV0pOwotCQkgICAgcCArPSBDSUxFTl9NUFBFOwotCQl9Ci0JCWJyZWFrOwotI2VuZGlmCi0JICAgIGNhc2UgQ0lfREVGTEFURToKLQkgICAgY2FzZSBDSV9ERUZMQVRFX0RSQUZUOgotCQlpZiAob3B0bGVuID49IENJTEVOX0RFRkxBVEUpIHsKLQkJICAgIHByaW50ZXIoYXJnLCAiZGVmbGF0ZSVzICVkIiwKLQkJCSAgICAoY29kZSA9PSBDSV9ERUZMQVRFX0RSQUZUPyAiKG9sZCMpIjogIiIpLAotCQkJICAgIERFRkxBVEVfU0laRShwWzJdKSk7Ci0JCSAgICBpZiAoREVGTEFURV9NRVRIT0QocFsyXSkgIT0gREVGTEFURV9NRVRIT0RfVkFMKQotCQkJcHJpbnRlcihhcmcsICIgbWV0aG9kICVkIiwgREVGTEFURV9NRVRIT0QocFsyXSkpOwotCQkgICAgaWYgKHBbM10gIT0gREVGTEFURV9DSEtfU0VRVUVOQ0UpCi0JCQlwcmludGVyKGFyZywgIiBjaGVjayAlZCIsIHBbM10pOwotCQkgICAgcCArPSBDSUxFTl9ERUZMQVRFOwotCQl9Ci0JCWJyZWFrOwotCSAgICBjYXNlIENJX0JTRF9DT01QUkVTUzoKLQkJaWYgKG9wdGxlbiA+PSBDSUxFTl9CU0RfQ09NUFJFU1MpIHsKLQkJICAgIHByaW50ZXIoYXJnLCAiYnNkIHYlZCAlZCIsIEJTRF9WRVJTSU9OKHBbMl0pLAotCQkJICAgIEJTRF9OQklUUyhwWzJdKSk7Ci0JCSAgICBwICs9IENJTEVOX0JTRF9DT01QUkVTUzsKLQkJfQotCQlicmVhazsKLQkgICAgY2FzZSBDSV9QUkVESUNUT1JfMToKLQkJaWYgKG9wdGxlbiA+PSBDSUxFTl9QUkVESUNUT1JfMSkgewotCQkgICAgcHJpbnRlcihhcmcsICJwcmVkaWN0b3IgMSIpOwotCQkgICAgcCArPSBDSUxFTl9QUkVESUNUT1JfMTsKLQkJfQotCQlicmVhazsKLQkgICAgY2FzZSBDSV9QUkVESUNUT1JfMjoKLQkJaWYgKG9wdGxlbiA+PSBDSUxFTl9QUkVESUNUT1JfMikgewotCQkgICAgcHJpbnRlcihhcmcsICJwcmVkaWN0b3IgMiIpOwotCQkgICAgcCArPSBDSUxFTl9QUkVESUNUT1JfMjsKLQkJfQotCQlicmVhazsKLQkgICAgfQotCSAgICB3aGlsZSAocCA8IG9wdGVuZCkKLQkJcHJpbnRlcihhcmcsICIgJS4yeCIsICpwKyspOwotCSAgICBwcmludGVyKGFyZywgIj4iKTsKLQl9Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIFRFUk1BQ0s6Ci0gICAgY2FzZSBURVJNUkVROgotCWlmIChsZW4gPiAwICYmICpwID49ICcgJyAmJiAqcCA8IDB4N2YpIHsKLQkgICAgcHJpbnRfc3RyaW5nKChjaGFyICopcCwgbGVuLCBwcmludGVyLCBhcmcpOwotCSAgICBwICs9IGxlbjsKLQkgICAgbGVuID0gMDsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotCi0gICAgLyogZHVtcCBvdXQgdGhlIHJlc3Qgb2YgdGhlIHBhY2tldCBpbiBoZXggKi8KLSAgICB3aGlsZSAoLS1sZW4gPj0gMCkKLQlwcmludGVyKGFyZywgIiAlLjJ4IiwgKnArKyk7Ci0KLSAgICByZXR1cm4gcCAtIHAwOwotfQotCi0vKgotICogV2UgaGF2ZSByZWNlaXZlZCBhIHBhY2tldCB0aGF0IHRoZSBkZWNvbXByZXNzb3IgZmFpbGVkIHRvCi0gKiBkZWNvbXByZXNzLiAgSGVyZSB3ZSB3b3VsZCBleHBlY3QgdG8gaXNzdWUgYSByZXNldC1yZXF1ZXN0LCBidXQKLSAqIE1vdG9yb2xhIGhhcyBhIHBhdGVudCBvbiByZXNldHRpbmcgdGhlIGNvbXByZXNzb3IgYXMgYSByZXN1bHQgb2YKLSAqIGRldGVjdGluZyBhbiBlcnJvciBpbiB0aGUgZGVjb21wcmVzc2VkIGRhdGEgYWZ0ZXIgZGVjb21wcmVzc2lvbi4KLSAqIChTZWUgVVMgcGF0ZW50IDUsMTMwLDk5MzsgaW50ZXJuYXRpb25hbCBwYXRlbnQgcHVibGljYXRpb24gbnVtYmVyCi0gKiBXTyA5MS8xMDI4OTsgQXVzdHJhbGlhbiBwYXRlbnQgNzMyOTYvOTEuKQotICoKLSAqIFNvIHdlIGFzayB0aGUga2VybmVsIHdoZXRoZXIgdGhlIGVycm9yIHdhcyBkZXRlY3RlZCBhZnRlcgotICogZGVjb21wcmVzc2lvbjsgaWYgaXQgd2FzLCB3ZSB0YWtlIENDUCBkb3duLCB0aHVzIGRpc2FibGluZwotICogY29tcHJlc3Npb24gOi0oLCBvdGhlcndpc2Ugd2UgaXNzdWUgdGhlIHJlc2V0LXJlcXVlc3QuCi0gKi8KLXN0YXRpYyB2b2lkCi1jY3BfZGF0YWlucHV0KHVuaXQsIHBrdCwgbGVuKQotICAgIGludCB1bml0OwotICAgIHVfY2hhciAqcGt0OwotICAgIGludCBsZW47Ci17Ci0gICAgZnNtICpmOwotCi0gICAgZiA9ICZjY3BfZnNtW3VuaXRdOwotICAgIGlmIChmLT5zdGF0ZSA9PSBPUEVORUQpIHsKLQlpZiAoY2NwX2ZhdGFsX2Vycm9yKHVuaXQpKSB7Ci0JICAgIC8qCi0JICAgICAqIERpc2FibGUgY29tcHJlc3Npb24gYnkgdGFraW5nIENDUCBkb3duLgotCSAgICAgKi8KLQkgICAgZXJyb3IoIkxvc3QgY29tcHJlc3Npb24gc3luYzogZGlzYWJsaW5nIGNvbXByZXNzaW9uIik7Ci0JICAgIGNjcF9jbG9zZSh1bml0LCAiTG9zdCBjb21wcmVzc2lvbiBzeW5jIik7Ci0jaWZkZWYgTVBQRQotCSAgICAvKgotCSAgICAgKiBJZiB3ZSB3ZXJlIGRvaW5nIE1QUEUsIHdlIG11c3QgYWxzbyB0YWtlIHRoZSBsaW5rIGRvd24uCi0JICAgICAqLwotCSAgICBpZiAoY2NwX2dvdG9wdGlvbnNbdW5pdF0ubXBwZSkgewotCQllcnJvcigiVG9vIG1hbnkgTVBQRSBlcnJvcnMsIGNsb3NpbmcgTENQIik7Ci0JCWxjcF9jbG9zZSh1bml0LCAiVG9vIG1hbnkgTVBQRSBlcnJvcnMiKTsKLQkgICAgfQotI2VuZGlmCi0JfSBlbHNlIHsKLQkgICAgLyoKLQkgICAgICogU2VuZCBhIHJlc2V0LXJlcXVlc3QgdG8gcmVzZXQgdGhlIHBlZXIncyBjb21wcmVzc29yLgotCSAgICAgKiBXZSBkb24ndCBkbyB0aGF0IGlmIHdlIGFyZSBzdGlsbCB3YWl0aW5nIGZvciBhbgotCSAgICAgKiBhY2tub3dsZWRnZW1lbnQgdG8gYSBwcmV2aW91cyByZXNldC1yZXF1ZXN0LgotCSAgICAgKi8KLQkgICAgaWYgKCEoY2NwX2xvY2Fsc3RhdGVbZi0+dW5pdF0gJiBSQUNLX1BFTkRJTkcpKSB7Ci0JCWZzbV9zZGF0YShmLCBDQ1BfUkVTRVRSRVEsIGYtPnJlcWlkID0gKytmLT5pZCwgTlVMTCwgMCk7Ci0JCVRJTUVPVVQoY2NwX3JhY2tfdGltZW91dCwgZiwgUkFDS1RJTUVPVVQpOwotCQljY3BfbG9jYWxzdGF0ZVtmLT51bml0XSB8PSBSQUNLX1BFTkRJTkc7Ci0JICAgIH0gZWxzZQotCQljY3BfbG9jYWxzdGF0ZVtmLT51bml0XSB8PSBSUkVRX1JFUEVBVDsKLQl9Ci0gICAgfQotfQotCi0vKgotICogVGltZW91dCB3YWl0aW5nIGZvciByZXNldC1hY2suCi0gKi8KLXN0YXRpYyB2b2lkCi1jY3BfcmFja190aW1lb3V0KGFyZykKLSAgICB2b2lkICphcmc7Ci17Ci0gICAgZnNtICpmID0gYXJnOwotCi0gICAgaWYgKGYtPnN0YXRlID09IE9QRU5FRCAmJiBjY3BfbG9jYWxzdGF0ZVtmLT51bml0XSAmIFJSRVFfUkVQRUFUKSB7Ci0JZnNtX3NkYXRhKGYsIENDUF9SRVNFVFJFUSwgZi0+cmVxaWQsIE5VTEwsIDApOwotCVRJTUVPVVQoY2NwX3JhY2tfdGltZW91dCwgZiwgUkFDS1RJTUVPVVQpOwotCWNjcF9sb2NhbHN0YXRlW2YtPnVuaXRdICY9IH5SUkVRX1JFUEVBVDsKLSAgICB9IGVsc2UKLQljY3BfbG9jYWxzdGF0ZVtmLT51bml0XSAmPSB+UkFDS19QRU5ESU5HOwotfQotCmRpZmYgLS1naXQgYS9wcHBkL2NjcC5oIGIvcHBwZC9jY3AuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY0YTJmZS4uMDAwMDAwMAotLS0gYS9wcHBkL2NjcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIGNjcC5oIC0gRGVmaW5pdGlvbnMgZm9yIFBQUCBDb21wcmVzc2lvbiBDb250cm9sIFByb3RvY29sLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NC0yMDAyIFBhdWwgTWFja2VycmFzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIDMuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgUGF1bCBNYWNrZXJyYXMKLSAqICAgICA8cGF1bHVzQHNhbWJhLm9yZz4iLgotICoKLSAqIFRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLSAqIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotICogQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKgotICogJElkOiBjY3AuaCx2IDEuMTIgMjAwNC8xMS8wNCAxMDowMjoyNiBwYXVsdXMgRXhwICQKLSAqLwotCi10eXBlZGVmIHN0cnVjdCBjY3Bfb3B0aW9ucyB7Ci0gICAgYm9vbCBic2RfY29tcHJlc3M7CQkvKiBkbyBCU0QgQ29tcHJlc3M/ICovCi0gICAgYm9vbCBkZWZsYXRlOwkJLyogZG8gRGVmbGF0ZT8gKi8KLSAgICBib29sIHByZWRpY3Rvcl8xOwkJLyogZG8gUHJlZGljdG9yLTE/ICovCi0gICAgYm9vbCBwcmVkaWN0b3JfMjsJCS8qIGRvIFByZWRpY3Rvci0yPyAqLwotICAgIGJvb2wgZGVmbGF0ZV9jb3JyZWN0OwkvKiB1c2UgY29ycmVjdCBjb2RlIGZvciBkZWZsYXRlPyAqLwotICAgIGJvb2wgZGVmbGF0ZV9kcmFmdDsJCS8qIHVzZSBkcmFmdCBSRkMgY29kZSBmb3IgZGVmbGF0ZT8gKi8KLSAgICBib29sIG1wcGU7CQkJLyogZG8gTVBQRT8gKi8KLSAgICB1X3Nob3J0IGJzZF9iaXRzOwkJLyogIyBiaXRzL2NvZGUgZm9yIEJTRCBDb21wcmVzcyAqLwotICAgIHVfc2hvcnQgZGVmbGF0ZV9zaXplOwkvKiBsZyh3aW5kb3cgc2l6ZSkgZm9yIERlZmxhdGUgKi8KLSAgICBzaG9ydCBtZXRob2Q7CQkvKiBjb2RlIGZvciBjaG9zZW4gY29tcHJlc3Npb24gbWV0aG9kICovCi19IGNjcF9vcHRpb25zOwotCi1leHRlcm4gZnNtIGNjcF9mc21bXTsKLWV4dGVybiBjY3Bfb3B0aW9ucyBjY3Bfd2FudG9wdGlvbnNbXTsKLWV4dGVybiBjY3Bfb3B0aW9ucyBjY3BfZ290b3B0aW9uc1tdOwotZXh0ZXJuIGNjcF9vcHRpb25zIGNjcF9hbGxvd29wdGlvbnNbXTsKLWV4dGVybiBjY3Bfb3B0aW9ucyBjY3BfaGlzb3B0aW9uc1tdOwotCi1leHRlcm4gc3RydWN0IHByb3RlbnQgY2NwX3Byb3RlbnQ7CmRpZmYgLS1naXQgYS9wcHBkL2NoYXAtbWQ1LmMgYi9wcHBkL2NoYXAtbWQ1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZGQ0ZWMuLjAwMDAwMDAKLS0tIGEvcHBwZC9jaGFwLW1kNS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBjaGFwLW1kNS5jIC0gTmV3IENIQVAvTUQ1IGltcGxlbWVudGF0aW9uLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMyBQYXVsIE1hY2tlcnJhcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFRoZSBuYW1lKHMpIG9mIHRoZSBhdXRob3JzIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiAzLiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFBhdWwgTWFja2VycmFzCi0gKiAgICAgPHBhdWx1c0BzYW1iYS5vcmc+Ii4KLSAqCi0gKiBUSEUgQVVUSE9SUyBPRiBUSElTIFNPRlRXQVJFIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi0gKiBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLSAqIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLSAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLSAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNkZWZpbmUgUkNTSUQJIiRJZDogY2hhcC1tZDUuYyx2IDEuNCAyMDA0LzExLzA5IDIyOjM5OjI1IHBhdWx1cyBFeHAgJCIKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgInBwcGQuaCIKLSNpbmNsdWRlICJjaGFwLW5ldy5oIgotI2luY2x1ZGUgImNoYXAtbWQ1LmgiCi0jaW5jbHVkZSAibWFnaWMuaCIKLSNpbmNsdWRlICJtZDUuaCIKLQotI2RlZmluZSBNRDVfSEFTSF9TSVpFCQkxNgotI2RlZmluZSBNRDVfTUlOX0NIQUxMRU5HRQkxNgotI2RlZmluZSBNRDVfTUFYX0NIQUxMRU5HRQkyNAotCi1zdGF0aWMgdm9pZAotY2hhcF9tZDVfZ2VuZXJhdGVfY2hhbGxlbmdlKHVuc2lnbmVkIGNoYXIgKmNwKQotewotCWludCBjbGVuOwotCi0JY2xlbiA9IChpbnQpKGRyYW5kNDgoKSAqIChNRDVfTUFYX0NIQUxMRU5HRSAtIE1ENV9NSU5fQ0hBTExFTkdFKSkKLQkJKyBNRDVfTUlOX0NIQUxMRU5HRTsKLQkqY3ArKyA9IGNsZW47Ci0JcmFuZG9tX2J5dGVzKGNwLCBjbGVuKTsKLX0KLQotc3RhdGljIGludAotY2hhcF9tZDVfdmVyaWZ5X3Jlc3BvbnNlKGludCBpZCwgY2hhciAqbmFtZSwKLQkJCSB1bnNpZ25lZCBjaGFyICpzZWNyZXQsIGludCBzZWNyZXRfbGVuLAotCQkJIHVuc2lnbmVkIGNoYXIgKmNoYWxsZW5nZSwgdW5zaWduZWQgY2hhciAqcmVzcG9uc2UsCi0JCQkgY2hhciAqbWVzc2FnZSwgaW50IG1lc3NhZ2Vfc3BhY2UpCi17Ci0JTUQ1X0NUWCBjdHg7Ci0JdW5zaWduZWQgY2hhciBpZGJ5dGUgPSBpZDsKLQl1bnNpZ25lZCBjaGFyIGhhc2hbTUQ1X0hBU0hfU0laRV07Ci0JaW50IGNoYWxsZW5nZV9sZW4sIHJlc3BvbnNlX2xlbjsKLQotCWNoYWxsZW5nZV9sZW4gPSAqY2hhbGxlbmdlKys7Ci0JcmVzcG9uc2VfbGVuID0gKnJlc3BvbnNlKys7Ci0JaWYgKHJlc3BvbnNlX2xlbiA9PSBNRDVfSEFTSF9TSVpFKSB7Ci0JCS8qIEdlbmVyYXRlIGhhc2ggb2YgSUQsIHNlY3JldCwgY2hhbGxlbmdlICovCi0JCU1ENV9Jbml0KCZjdHgpOwotCQlNRDVfVXBkYXRlKCZjdHgsICZpZGJ5dGUsIDEpOwotCQlNRDVfVXBkYXRlKCZjdHgsIHNlY3JldCwgc2VjcmV0X2xlbik7Ci0JCU1ENV9VcGRhdGUoJmN0eCwgY2hhbGxlbmdlLCBjaGFsbGVuZ2VfbGVuKTsKLQkJTUQ1X0ZpbmFsKGhhc2gsICZjdHgpOwotCi0JCS8qIFRlc3QgaWYgb3VyIGhhc2ggbWF0Y2hlcyB0aGUgcGVlcidzIHJlc3BvbnNlICovCi0JCWlmIChtZW1jbXAoaGFzaCwgcmVzcG9uc2UsIE1ENV9IQVNIX1NJWkUpID09IDApIHsKLQkJCXNscHJpbnRmKG1lc3NhZ2UsIG1lc3NhZ2Vfc3BhY2UsICJBY2Nlc3MgZ3JhbnRlZCIpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0Jc2xwcmludGYobWVzc2FnZSwgbWVzc2FnZV9zcGFjZSwgIkFjY2VzcyBkZW5pZWQiKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLWNoYXBfbWQ1X21ha2VfcmVzcG9uc2UodW5zaWduZWQgY2hhciAqcmVzcG9uc2UsIGludCBpZCwgY2hhciAqb3VyX25hbWUsCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICpjaGFsbGVuZ2UsIGNoYXIgKnNlY3JldCwgaW50IHNlY3JldF9sZW4sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICpwcml2YXRlKQotewotCU1ENV9DVFggY3R4OwotCXVuc2lnbmVkIGNoYXIgaWRieXRlID0gaWQ7Ci0JaW50IGNoYWxsZW5nZV9sZW4gPSAqY2hhbGxlbmdlKys7Ci0KLQlNRDVfSW5pdCgmY3R4KTsKLQlNRDVfVXBkYXRlKCZjdHgsICZpZGJ5dGUsIDEpOwotCU1ENV9VcGRhdGUoJmN0eCwgKHVfY2hhciAqKXNlY3JldCwgc2VjcmV0X2xlbik7Ci0JTUQ1X1VwZGF0ZSgmY3R4LCBjaGFsbGVuZ2UsIGNoYWxsZW5nZV9sZW4pOwotCU1ENV9GaW5hbCgmcmVzcG9uc2VbMV0sICZjdHgpOwotCXJlc3BvbnNlWzBdID0gTUQ1X0hBU0hfU0laRTsKLX0KLQotc3RhdGljIHN0cnVjdCBjaGFwX2RpZ2VzdF90eXBlIG1kNV9kaWdlc3QgPSB7Ci0JQ0hBUF9NRDUsCQkvKiBjb2RlICovCi0JY2hhcF9tZDVfZ2VuZXJhdGVfY2hhbGxlbmdlLAotCWNoYXBfbWQ1X3ZlcmlmeV9yZXNwb25zZSwKLQljaGFwX21kNV9tYWtlX3Jlc3BvbnNlLAotCU5VTEwsCQkJLyogY2hlY2tfc3VjY2VzcyAqLwotCU5VTEwsCQkJLyogaGFuZGxlX2ZhaWx1cmUgKi8KLX07Ci0KLXZvaWQKLWNoYXBfbWQ1X2luaXQodm9pZCkKLXsKLQljaGFwX3JlZ2lzdGVyX2RpZ2VzdCgmbWQ1X2RpZ2VzdCk7Ci19CmRpZmYgLS1naXQgYS9wcHBkL2NoYXAtbWQ1LmggYi9wcHBkL2NoYXAtbWQ1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZDA2NTguLjAwMDAwMDAKLS0tIGEvcHBwZC9jaGFwLW1kNS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIGNoYXAtbWQ1LmggLSBOZXcgQ0hBUC9NRDUgaW1wbGVtZW50YXRpb24uCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAzIFBhdWwgTWFja2VycmFzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIDMuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgUGF1bCBNYWNrZXJyYXMKLSAqICAgICA8cGF1bHVzQHNhbWJhLm9yZz4iLgotICoKLSAqIFRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLSAqIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotICogQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotZXh0ZXJuIHZvaWQgY2hhcF9tZDVfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL3BwcGQvY2hhcC1uZXcuYyBiL3BwcGQvY2hhcC1uZXcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczMGNlMi4uMDAwMDAwMAotLS0gYS9wcHBkL2NoYXAtbmV3LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NTkgKzAsMCBAQAotLyoKLSAqIGNoYXAtbmV3LmMgLSBOZXcgQ0hBUCBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgUGF1bCBNYWNrZXJyYXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBUaGUgbmFtZShzKSBvZiB0aGUgYXV0aG9ycyBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogMy4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBQYXVsIE1hY2tlcnJhcwotICogICAgIDxwYXVsdXNAc2FtYmEub3JnPiIuCi0gKgotICogVEhFIEFVVEhPUlMgT0YgVEhJUyBTT0ZUV0FSRSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotICogVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi0gKiBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi0gKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi0gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jZGVmaW5lIFJDU0lECSIkSWQ6IGNoYXAtbmV3LmMsdiAxLjkgMjAwNy8wNi8xOSAwMjowODozNSBjYXJsc29uaiBFeHAgJCIKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgInBwcGQuaCIKLSNpbmNsdWRlICJzZXNzaW9uLmgiCi0jaW5jbHVkZSAiY2hhcC1uZXcuaCIKLSNpbmNsdWRlICJjaGFwLW1kNS5oIgotI2lmIGRlZmluZWQoX19BTkRST0lEX18pCi0jaW5jbHVkZSAib3BlbnNzbC1oYXNoLmgiCi0jZW5kaWYKLQotI2lmZGVmIENIQVBNUwotI2luY2x1ZGUgImNoYXBfbXMuaCIKLSNkZWZpbmUgTURUWVBFX0FMTCAoTURUWVBFX01JQ1JPU09GVF9WMiB8IE1EVFlQRV9NSUNST1NPRlQgfCBNRFRZUEVfTUQ1KQotI2Vsc2UKLSNkZWZpbmUgTURUWVBFX0FMTCAoTURUWVBFX01ENSkKLSNlbmRpZgotCi1pbnQgY2hhcF9tZHR5cGVfYWxsID0gTURUWVBFX0FMTDsKLQotLyogSG9vayBmb3IgYSBwbHVnaW4gdG8gdmFsaWRhdGUgQ0hBUCBjaGFsbGVuZ2UgKi8KLWludCAoKmNoYXBfdmVyaWZ5X2hvb2spKGNoYXIgKm5hbWUsIGNoYXIgKm91cm5hbWUsIGludCBpZCwKLQkJCXN0cnVjdCBjaGFwX2RpZ2VzdF90eXBlICpkaWdlc3QsCi0JCQl1bnNpZ25lZCBjaGFyICpjaGFsbGVuZ2UsIHVuc2lnbmVkIGNoYXIgKnJlc3BvbnNlLAotCQkJY2hhciAqbWVzc2FnZSwgaW50IG1lc3NhZ2Vfc3BhY2UpID0gTlVMTDsKLQotLyoKLSAqIE9wdGlvbiB2YXJpYWJsZXMuCi0gKi8KLWludCBjaGFwX3RpbWVvdXRfdGltZSA9IDM7Ci1pbnQgY2hhcF9tYXhfdHJhbnNtaXRzID0gMTA7Ci1pbnQgY2hhcF9yZWNoYWxsZW5nZV90aW1lID0gMDsKLQotLyoKLSAqIENvbW1hbmQtbGluZSBvcHRpb25zLgotICovCi1zdGF0aWMgb3B0aW9uX3QgY2hhcF9vcHRpb25fbGlzdFtdID0gewotCXsgImNoYXAtcmVzdGFydCIsIG9faW50LCAmY2hhcF90aW1lb3V0X3RpbWUsCi0JICAiU2V0IHRpbWVvdXQgZm9yIENIQVAiLCBPUFRfUFJJTyB9LAotCXsgImNoYXAtbWF4LWNoYWxsZW5nZSIsIG9faW50LCAmY2hhcF9tYXhfdHJhbnNtaXRzLAotCSAgIlNldCBtYXggI3htaXRzIGZvciBjaGFsbGVuZ2UiLCBPUFRfUFJJTyB9LAotCXsgImNoYXAtaW50ZXJ2YWwiLCBvX2ludCwgJmNoYXBfcmVjaGFsbGVuZ2VfdGltZSwKLQkgICJTZXQgaW50ZXJ2YWwgZm9yIHJlY2hhbGxlbmdlIiwgT1BUX1BSSU8gfSwKLQl7IE5VTEwgfQotfTsKLQotLyoKLSAqIEludGVybmFsIHN0YXRlLgotICovCi1zdGF0aWMgc3RydWN0IGNoYXBfY2xpZW50X3N0YXRlIHsKLQlpbnQgZmxhZ3M7Ci0JY2hhciAqbmFtZTsKLQlzdHJ1Y3QgY2hhcF9kaWdlc3RfdHlwZSAqZGlnZXN0OwotCXVuc2lnbmVkIGNoYXIgcHJpdls2NF07CQkvKiBwcml2YXRlIGFyZWEgZm9yIGRpZ2VzdCdzIHVzZSAqLwotfSBjbGllbnQ7Ci0KLS8qCi0gKiBUaGVzZSBsaW1pdHMgYXBwbHkgdG8gY2hhbGxlbmdlIGFuZCByZXNwb25zZSBwYWNrZXRzIHdlIHNlbmQuCi0gKiBUaGUgKzQgaXMgdGhlICsxIHRoYXQgd2UgYWN0dWFsbHkgbmVlZCByb3VuZGVkIHVwLgotICovCi0jZGVmaW5lIENIQUxfTUFYX1BLVExFTgkoUFBQX0hEUkxFTiArIENIQVBfSERSTEVOICsgNCArIE1BWF9DSEFMTEVOR0VfTEVOICsgTUFYTkFNRUxFTikKLSNkZWZpbmUgUkVTUF9NQVhfUEtUTEVOCShQUFBfSERSTEVOICsgQ0hBUF9IRFJMRU4gKyA0ICsgTUFYX1JFU1BPTlNFX0xFTiArIE1BWE5BTUVMRU4pCi0KLXN0YXRpYyBzdHJ1Y3QgY2hhcF9zZXJ2ZXJfc3RhdGUgewotCWludCBmbGFnczsKLQlpbnQgaWQ7Ci0JY2hhciAqbmFtZTsKLQlzdHJ1Y3QgY2hhcF9kaWdlc3RfdHlwZSAqZGlnZXN0OwotCWludCBjaGFsbGVuZ2VfeG1pdHM7Ci0JaW50IGNoYWxsZW5nZV9wa3RsZW47Ci0JdW5zaWduZWQgY2hhciBjaGFsbGVuZ2VbQ0hBTF9NQVhfUEtUTEVOXTsKLQljaGFyIG1lc3NhZ2VbMjU2XTsKLX0gc2VydmVyOwotCi0vKiBWYWx1ZXMgZm9yIGZsYWdzIGluIGNoYXBfY2xpZW50X3N0YXRlIGFuZCBjaGFwX3NlcnZlcl9zdGF0ZSAqLwotI2RlZmluZSBMT1dFUlVQCQkJMQotI2RlZmluZSBBVVRIX1NUQVJURUQJCTIKLSNkZWZpbmUgQVVUSF9ET05FCQk0Ci0jZGVmaW5lIEFVVEhfRkFJTEVECQk4Ci0jZGVmaW5lIFRJTUVPVVRfUEVORElORwkJMHgxMAotI2RlZmluZSBDSEFMTEVOR0VfVkFMSUQJCTB4MjAKLQotLyoKLSAqIFByb3RvdHlwZXMuCi0gKi8KLXN0YXRpYyB2b2lkIGNoYXBfaW5pdChpbnQgdW5pdCk7Ci1zdGF0aWMgdm9pZCBjaGFwX2xvd2VydXAoaW50IHVuaXQpOwotc3RhdGljIHZvaWQgY2hhcF9sb3dlcmRvd24oaW50IHVuaXQpOwotc3RhdGljIHZvaWQgY2hhcF90aW1lb3V0KHZvaWQgKmFyZyk7Ci1zdGF0aWMgdm9pZCBjaGFwX2dlbmVyYXRlX2NoYWxsZW5nZShzdHJ1Y3QgY2hhcF9zZXJ2ZXJfc3RhdGUgKnNzKTsKLXN0YXRpYyB2b2lkIGNoYXBfaGFuZGxlX3Jlc3BvbnNlKHN0cnVjdCBjaGFwX3NlcnZlcl9zdGF0ZSAqc3MsIGludCBjb2RlLAotCQl1bnNpZ25lZCBjaGFyICpwa3QsIGludCBsZW4pOwotc3RhdGljIGludCBjaGFwX3ZlcmlmeV9yZXNwb25zZShjaGFyICpuYW1lLCBjaGFyICpvdXJuYW1lLCBpbnQgaWQsCi0JCXN0cnVjdCBjaGFwX2RpZ2VzdF90eXBlICpkaWdlc3QsCi0JCXVuc2lnbmVkIGNoYXIgKmNoYWxsZW5nZSwgdW5zaWduZWQgY2hhciAqcmVzcG9uc2UsCi0JCWNoYXIgKm1lc3NhZ2UsIGludCBtZXNzYWdlX3NwYWNlKTsKLXN0YXRpYyB2b2lkIGNoYXBfcmVzcG9uZChzdHJ1Y3QgY2hhcF9jbGllbnRfc3RhdGUgKmNzLCBpbnQgaWQsCi0JCXVuc2lnbmVkIGNoYXIgKnBrdCwgaW50IGxlbik7Ci1zdGF0aWMgdm9pZCBjaGFwX2hhbmRsZV9zdGF0dXMoc3RydWN0IGNoYXBfY2xpZW50X3N0YXRlICpjcywgaW50IGNvZGUsIGludCBpZCwKLQkJdW5zaWduZWQgY2hhciAqcGt0LCBpbnQgbGVuKTsKLXN0YXRpYyB2b2lkIGNoYXBfcHJvdHJlaihpbnQgdW5pdCk7Ci1zdGF0aWMgdm9pZCBjaGFwX2lucHV0KGludCB1bml0LCB1bnNpZ25lZCBjaGFyICpwa3QsIGludCBwa3RsZW4pOwotc3RhdGljIGludCBjaGFwX3ByaW50X3BrdCh1bnNpZ25lZCBjaGFyICpwLCBpbnQgcGxlbiwKLQkJdm9pZCAoKnByaW50ZXIpIF9fUCgodm9pZCAqLCBjaGFyICosIC4uLikpLCB2b2lkICphcmcpOwotCi0vKiBMaXN0IG9mIGRpZ2VzdCB0eXBlcyB0aGF0IHdlIGtub3cgYWJvdXQgKi8KLXN0YXRpYyBzdHJ1Y3QgY2hhcF9kaWdlc3RfdHlwZSAqY2hhcF9kaWdlc3RzOwotCi0vKgotICogY2hhcF9pbml0IC0gcmVzZXQgdG8gaW5pdGlhbCBzdGF0ZS4KLSAqLwotc3RhdGljIHZvaWQKLWNoYXBfaW5pdChpbnQgdW5pdCkKLXsKLQltZW1zZXQoJmNsaWVudCwgMCwgc2l6ZW9mKGNsaWVudCkpOwotCW1lbXNldCgmc2VydmVyLCAwLCBzaXplb2Yoc2VydmVyKSk7Ci0KLQljaGFwX21kNV9pbml0KCk7Ci0jaWZkZWYgQ0hBUE1TCi0JY2hhcG1zX2luaXQoKTsKLSNlbmRpZgotfQotCi0vKgotICogQWRkIGEgbmV3IGRpZ2VzdCB0eXBlIHRvIHRoZSBsaXN0LgotICovCi12b2lkCi1jaGFwX3JlZ2lzdGVyX2RpZ2VzdChzdHJ1Y3QgY2hhcF9kaWdlc3RfdHlwZSAqZHApCi17Ci0JZHAtPm5leHQgPSBjaGFwX2RpZ2VzdHM7Ci0JY2hhcF9kaWdlc3RzID0gZHA7Ci19Ci0KLS8qCi0gKiBjaGFwX2xvd2VydXAgLSB3ZSBjYW4gc3RhcnQgZG9pbmcgc3R1ZmYgbm93LgotICovCi1zdGF0aWMgdm9pZAotY2hhcF9sb3dlcnVwKGludCB1bml0KQotewotCXN0cnVjdCBjaGFwX2NsaWVudF9zdGF0ZSAqY3MgPSAmY2xpZW50OwotCXN0cnVjdCBjaGFwX3NlcnZlcl9zdGF0ZSAqc3MgPSAmc2VydmVyOwotCi0JY3MtPmZsYWdzIHw9IExPV0VSVVA7Ci0Jc3MtPmZsYWdzIHw9IExPV0VSVVA7Ci0JaWYgKHNzLT5mbGFncyAmIEFVVEhfU1RBUlRFRCkKLQkJY2hhcF90aW1lb3V0KHNzKTsKLX0KLQotc3RhdGljIHZvaWQKLWNoYXBfbG93ZXJkb3duKGludCB1bml0KQotewotCXN0cnVjdCBjaGFwX2NsaWVudF9zdGF0ZSAqY3MgPSAmY2xpZW50OwotCXN0cnVjdCBjaGFwX3NlcnZlcl9zdGF0ZSAqc3MgPSAmc2VydmVyOwotCi0JY3MtPmZsYWdzID0gMDsKLQlpZiAoc3MtPmZsYWdzICYgVElNRU9VVF9QRU5ESU5HKQotCQlVTlRJTUVPVVQoY2hhcF90aW1lb3V0LCBzcyk7Ci0Jc3MtPmZsYWdzID0gMDsKLX0KLQotLyoKLSAqIGNoYXBfYXV0aF9wZWVyIC0gU3RhcnQgYXV0aGVudGljYXRpbmcgdGhlIHBlZXIuCi0gKiBJZiB0aGUgbG93ZXIgbGF5ZXIgaXMgYWxyZWFkeSB1cCwgd2Ugc3RhcnQgc2VuZGluZyBjaGFsbGVuZ2VzLAotICogb3RoZXJ3aXNlIHdlIHdhaXQgZm9yIHRoZSBsb3dlciBsYXllciB0byBjb21lIHVwLgotICovCi12b2lkCi1jaGFwX2F1dGhfcGVlcihpbnQgdW5pdCwgY2hhciAqb3VyX25hbWUsIGludCBkaWdlc3RfY29kZSkKLXsKLQlzdHJ1Y3QgY2hhcF9zZXJ2ZXJfc3RhdGUgKnNzID0gJnNlcnZlcjsKLQlzdHJ1Y3QgY2hhcF9kaWdlc3RfdHlwZSAqZHA7Ci0KLQlpZiAoc3MtPmZsYWdzICYgQVVUSF9TVEFSVEVEKSB7Ci0JCWVycm9yKCJDSEFQOiBwZWVyIGF1dGhlbnRpY2F0aW9uIGFscmVhZHkgc3RhcnRlZCEiKTsKLQkJcmV0dXJuOwotCX0KLQlmb3IgKGRwID0gY2hhcF9kaWdlc3RzOyBkcCAhPSBOVUxMOyBkcCA9IGRwLT5uZXh0KQotCQlpZiAoZHAtPmNvZGUgPT0gZGlnZXN0X2NvZGUpCi0JCQlicmVhazsKLQlpZiAoZHAgPT0gTlVMTCkKLQkJZmF0YWwoIkNIQVAgZGlnZXN0IDB4JXggcmVxdWVzdGVkIGJ1dCBub3QgYXZhaWxhYmxlIiwKLQkJICAgICAgZGlnZXN0X2NvZGUpOwotCi0Jc3MtPmRpZ2VzdCA9IGRwOwotCXNzLT5uYW1lID0gb3VyX25hbWU7Ci0JLyogU3RhcnQgd2l0aCBhIHJhbmRvbSBJRCB2YWx1ZSAqLwotCXNzLT5pZCA9ICh1bnNpZ25lZCBjaGFyKShkcmFuZDQ4KCkgKiAyNTYpOwotCXNzLT5mbGFncyB8PSBBVVRIX1NUQVJURUQ7Ci0JaWYgKHNzLT5mbGFncyAmIExPV0VSVVApCi0JCWNoYXBfdGltZW91dChzcyk7Ci19Ci0KLS8qCi0gKiBjaGFwX2F1dGhfd2l0aF9wZWVyIC0gUHJlcGFyZSB0byBhdXRoZW50aWNhdGUgb3Vyc2VsdmVzIHRvIHRoZSBwZWVyLgotICogVGhlcmUgaXNuJ3QgbXVjaCB0byBkbyB1bnRpbCB3ZSByZWNlaXZlIGEgY2hhbGxlbmdlLgotICovCi12b2lkCi1jaGFwX2F1dGhfd2l0aF9wZWVyKGludCB1bml0LCBjaGFyICpvdXJfbmFtZSwgaW50IGRpZ2VzdF9jb2RlKQotewotCXN0cnVjdCBjaGFwX2NsaWVudF9zdGF0ZSAqY3MgPSAmY2xpZW50OwotCXN0cnVjdCBjaGFwX2RpZ2VzdF90eXBlICpkcDsKLQotCWlmIChjcy0+ZmxhZ3MgJiBBVVRIX1NUQVJURUQpIHsKLQkJZXJyb3IoIkNIQVA6IGF1dGhlbnRpY2F0aW9uIHdpdGggcGVlciBhbHJlYWR5IHN0YXJ0ZWQhIik7Ci0JCXJldHVybjsKLQl9Ci0JZm9yIChkcCA9IGNoYXBfZGlnZXN0czsgZHAgIT0gTlVMTDsgZHAgPSBkcC0+bmV4dCkKLQkJaWYgKGRwLT5jb2RlID09IGRpZ2VzdF9jb2RlKQotCQkJYnJlYWs7Ci0JaWYgKGRwID09IE5VTEwpCi0JCWZhdGFsKCJDSEFQIGRpZ2VzdCAweCV4IHJlcXVlc3RlZCBidXQgbm90IGF2YWlsYWJsZSIsCi0JCSAgICAgIGRpZ2VzdF9jb2RlKTsKLQotCWNzLT5kaWdlc3QgPSBkcDsKLQljcy0+bmFtZSA9IG91cl9uYW1lOwotCWNzLT5mbGFncyB8PSBBVVRIX1NUQVJURUQ7Ci19Ci0KLS8qCi0gKiBjaGFwX3RpbWVvdXQgLSBJdCdzIHRpbWUgdG8gc2VuZCBhbm90aGVyIGNoYWxsZW5nZSB0byB0aGUgcGVlci4KLSAqIFRoaXMgY291bGQgYmUgZWl0aGVyIGEgcmV0cmFuc21pc3Npb24gb2YgYSBwcmV2aW91cyBjaGFsbGVuZ2UsCi0gKiBvciBhIG5ldyBjaGFsbGVuZ2UgdG8gc3RhcnQgcmUtYXV0aGVudGljYXRpb24uCi0gKi8KLXN0YXRpYyB2b2lkCi1jaGFwX3RpbWVvdXQodm9pZCAqYXJnKQotewotCXN0cnVjdCBjaGFwX3NlcnZlcl9zdGF0ZSAqc3MgPSBhcmc7Ci0KLQlzcy0+ZmxhZ3MgJj0gflRJTUVPVVRfUEVORElORzsKLQlpZiAoKHNzLT5mbGFncyAmIENIQUxMRU5HRV9WQUxJRCkgPT0gMCkgewotCQlzcy0+Y2hhbGxlbmdlX3htaXRzID0gMDsKLQkJY2hhcF9nZW5lcmF0ZV9jaGFsbGVuZ2Uoc3MpOwotCQlzcy0+ZmxhZ3MgfD0gQ0hBTExFTkdFX1ZBTElEOwotCX0gZWxzZSBpZiAoc3MtPmNoYWxsZW5nZV94bWl0cyA+PSBjaGFwX21heF90cmFuc21pdHMpIHsKLQkJc3MtPmZsYWdzICY9IH5DSEFMTEVOR0VfVkFMSUQ7Ci0JCXNzLT5mbGFncyB8PSBBVVRIX0RPTkUgfCBBVVRIX0ZBSUxFRDsKLQkJYXV0aF9wZWVyX2ZhaWwoMCwgUFBQX0NIQVApOwotCQlyZXR1cm47Ci0JfQotCi0Jb3V0cHV0KDAsIHNzLT5jaGFsbGVuZ2UsIHNzLT5jaGFsbGVuZ2VfcGt0bGVuKTsKLQkrK3NzLT5jaGFsbGVuZ2VfeG1pdHM7Ci0Jc3MtPmZsYWdzIHw9IFRJTUVPVVRfUEVORElORzsKLQlUSU1FT1VUKGNoYXBfdGltZW91dCwgYXJnLCBjaGFwX3RpbWVvdXRfdGltZSk7Ci19Ci0KLS8qCi0gKiBjaGFwX2dlbmVyYXRlX2NoYWxsZW5nZSAtIGdlbmVyYXRlIGEgY2hhbGxlbmdlIHN0cmluZyBhbmQgZm9ybWF0Ci0gKiB0aGUgY2hhbGxlbmdlIHBhY2tldCBpbiBzcy0+Y2hhbGxlbmdlX3BrdC4KLSAqLwotc3RhdGljIHZvaWQKLWNoYXBfZ2VuZXJhdGVfY2hhbGxlbmdlKHN0cnVjdCBjaGFwX3NlcnZlcl9zdGF0ZSAqc3MpCi17Ci0JaW50IGNsZW4gPSAxLCBubGVuLCBsZW47Ci0JdW5zaWduZWQgY2hhciAqcDsKLQotCXAgPSBzcy0+Y2hhbGxlbmdlOwotCU1BS0VIRUFERVIocCwgUFBQX0NIQVApOwotCXAgKz0gQ0hBUF9IRFJMRU47Ci0Jc3MtPmRpZ2VzdC0+Z2VuZXJhdGVfY2hhbGxlbmdlKHApOwotCWNsZW4gPSAqcDsKLQlubGVuID0gc3RybGVuKHNzLT5uYW1lKTsKLQltZW1jcHkocCArIDEgKyBjbGVuLCBzcy0+bmFtZSwgbmxlbik7Ci0KLQlsZW4gPSBDSEFQX0hEUkxFTiArIDEgKyBjbGVuICsgbmxlbjsKLQlzcy0+Y2hhbGxlbmdlX3BrdGxlbiA9IFBQUF9IRFJMRU4gKyBsZW47Ci0KLQlwID0gc3MtPmNoYWxsZW5nZSArIFBQUF9IRFJMRU47Ci0JcFswXSA9IENIQVBfQ0hBTExFTkdFOwotCXBbMV0gPSArK3NzLT5pZDsKLQlwWzJdID0gbGVuID4+IDg7Ci0JcFszXSA9IGxlbjsKLX0KLQotLyoKLSAqIGNoYXBfaGFuZGxlX3Jlc3BvbnNlIC0gY2hlY2sgdGhlIHJlc3BvbnNlIHRvIG91ciBjaGFsbGVuZ2UuCi0gKi8KLXN0YXRpYyB2b2lkCi1jaGFwX2hhbmRsZV9yZXNwb25zZShzdHJ1Y3QgY2hhcF9zZXJ2ZXJfc3RhdGUgKnNzLCBpbnQgaWQsCi0JCSAgICAgdW5zaWduZWQgY2hhciAqcGt0LCBpbnQgbGVuKQotewotCWludCByZXNwb25zZV9sZW4sIG9rLCBtbGVuOwotCXVuc2lnbmVkIGNoYXIgKnJlc3BvbnNlLCAqcDsKLQljaGFyICpuYW1lID0gTlVMTDsJLyogaW5pdGlhbGl6ZWQgdG8gc2h1dCBnY2MgdXAgKi8KLQlpbnQgKCp2ZXJpZmllcikoY2hhciAqLCBjaGFyICosIGludCwgc3RydWN0IGNoYXBfZGlnZXN0X3R5cGUgKiwKLQkJdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIGNoYXIgKiwgaW50KTsKLQljaGFyIHJuYW1lW01BWE5BTUVMRU4rMV07Ci0KLQlpZiAoKHNzLT5mbGFncyAmIExPV0VSVVApID09IDApCi0JCXJldHVybjsKLQlpZiAoaWQgIT0gc3MtPmNoYWxsZW5nZVtQUFBfSERSTEVOKzFdIHx8IGxlbiA8IDIpCi0JCXJldHVybjsKLQlpZiAoc3MtPmZsYWdzICYgQ0hBTExFTkdFX1ZBTElEKSB7Ci0JCXJlc3BvbnNlID0gcGt0OwotCQlHRVRDSEFSKHJlc3BvbnNlX2xlbiwgcGt0KTsKLQkJbGVuIC09IHJlc3BvbnNlX2xlbiArIDE7CS8qIGxlbmd0aCBvZiBuYW1lICovCi0JCW5hbWUgPSAoY2hhciAqKXBrdCArIHJlc3BvbnNlX2xlbjsKLQkJaWYgKGxlbiA8IDApCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHNzLT5mbGFncyAmIFRJTUVPVVRfUEVORElORykgewotCQkJc3MtPmZsYWdzICY9IH5USU1FT1VUX1BFTkRJTkc7Ci0JCQlVTlRJTUVPVVQoY2hhcF90aW1lb3V0LCBzcyk7Ci0JCX0KLQotCQlpZiAoZXhwbGljaXRfcmVtb3RlKSB7Ci0JCQluYW1lID0gcmVtb3RlX25hbWU7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBOdWxsIHRlcm1pbmF0ZSBhbmQgY2xlYW4gcmVtb3RlIG5hbWUuICovCi0JCQlzbHByaW50ZihybmFtZSwgc2l6ZW9mKHJuYW1lKSwgIiUuKnYiLCBsZW4sIG5hbWUpOwotCQkJbmFtZSA9IHJuYW1lOwotCQl9Ci0KLQkJaWYgKGNoYXBfdmVyaWZ5X2hvb2spCi0JCQl2ZXJpZmllciA9IGNoYXBfdmVyaWZ5X2hvb2s7Ci0JCWVsc2UKLQkJCXZlcmlmaWVyID0gY2hhcF92ZXJpZnlfcmVzcG9uc2U7Ci0JCW9rID0gKCp2ZXJpZmllcikobmFtZSwgc3MtPm5hbWUsIGlkLCBzcy0+ZGlnZXN0LAotCQkJCSBzcy0+Y2hhbGxlbmdlICsgUFBQX0hEUkxFTiArIENIQVBfSERSTEVOLAotCQkJCSByZXNwb25zZSwgc3MtPm1lc3NhZ2UsIHNpemVvZihzcy0+bWVzc2FnZSkpOwotCQlpZiAoIW9rIHx8ICFhdXRoX251bWJlcigpKSB7Ci0JCQlzcy0+ZmxhZ3MgfD0gQVVUSF9GQUlMRUQ7Ci0JCQl3YXJuKCJQZWVyICVxIGZhaWxlZCBDSEFQIGF1dGhlbnRpY2F0aW9uIiwgbmFtZSk7Ci0JCX0KLQl9IGVsc2UgaWYgKChzcy0+ZmxhZ3MgJiBBVVRIX0RPTkUpID09IDApCi0JCXJldHVybjsKLQotCS8qIHNlbmQgdGhlIHJlc3BvbnNlICovCi0JcCA9IG91dHBhY2tldF9idWY7Ci0JTUFLRUhFQURFUihwLCBQUFBfQ0hBUCk7Ci0JbWxlbiA9IHN0cmxlbihzcy0+bWVzc2FnZSk7Ci0JbGVuID0gQ0hBUF9IRFJMRU4gKyBtbGVuOwotCXBbMF0gPSAoc3MtPmZsYWdzICYgQVVUSF9GQUlMRUQpPyBDSEFQX0ZBSUxVUkU6IENIQVBfU1VDQ0VTUzsKLQlwWzFdID0gaWQ7Ci0JcFsyXSA9IGxlbiA+PiA4OwotCXBbM10gPSBsZW47Ci0JaWYgKG1sZW4gPiAwKQotCQltZW1jcHkocCArIENIQVBfSERSTEVOLCBzcy0+bWVzc2FnZSwgbWxlbik7Ci0Jb3V0cHV0KDAsIG91dHBhY2tldF9idWYsIFBQUF9IRFJMRU4gKyBsZW4pOwotCi0JaWYgKHNzLT5mbGFncyAmIENIQUxMRU5HRV9WQUxJRCkgewotCQlzcy0+ZmxhZ3MgJj0gfkNIQUxMRU5HRV9WQUxJRDsKLQkJaWYgKCEoc3MtPmZsYWdzICYgQVVUSF9ET05FKSAmJiAhKHNzLT5mbGFncyAmIEFVVEhfRkFJTEVEKSkgewotCQkgICAgLyoKLQkJICAgICAqIEF1dGggaXMgT0ssIHNvIG5vdyB3ZSBuZWVkIHRvIGNoZWNrIHNlc3Npb24gcmVzdHJpY3Rpb25zCi0JCSAgICAgKiB0byBlbnN1cmUgZXZlcnl0aGluZyBpcyBPSywgYnV0IG9ubHkgaWYgd2UgdXNlZCBhCi0JCSAgICAgKiBwbHVnaW4sIGFuZCBvbmx5IGlmIHdlJ3JlIGNvbmZpZ3VyZWQgdG8gY2hlY2suICBUaGlzCi0JCSAgICAgKiBhbGxvd3MgdXMgdG8gZG8gUEFNIGNoZWNrcyBvbiBQUFAgc2VydmVycyB0aGF0Ci0JCSAgICAgKiBhdXRoZW50aWNhdGUgYWdhaW5zdCBBY3RpdmVEaXJlY3RvcnksIGFuZCB1c2UgQUQgZm9yCi0JCSAgICAgKiBhY2NvdW50IGluZm8gKGxpa2Ugd2hlbiB1c2luZyBXaW5iaW5kIGludGVncmF0ZWQgd2l0aAotCQkgICAgICogUEFNKS4KLQkJICAgICAqLwotCQkgICAgaWYgKHNlc3Npb25fbWdtdCAmJgotCQkJc2Vzc2lvbl9jaGVjayhuYW1lLCBOVUxMLCBkZXZuYW0sIE5VTEwpID09IDApIHsKLQkJCXNzLT5mbGFncyB8PSBBVVRIX0ZBSUxFRDsKLQkJCXdhcm4oIlBlZXIgJXEgZmFpbGVkIENIQVAgU2Vzc2lvbiB2ZXJpZmljYXRpb24iLCBuYW1lKTsKLQkJICAgIH0KLQkJfQotCQlpZiAoc3MtPmZsYWdzICYgQVVUSF9GQUlMRUQpIHsKLQkJCWF1dGhfcGVlcl9mYWlsKDAsIFBQUF9DSEFQKTsKLQkJfSBlbHNlIHsKLQkJCWlmICgoc3MtPmZsYWdzICYgQVVUSF9ET05FKSA9PSAwKQotCQkJCWF1dGhfcGVlcl9zdWNjZXNzKDAsIFBQUF9DSEFQLAotCQkJCQkJICBzcy0+ZGlnZXN0LT5jb2RlLAotCQkJCQkJICBuYW1lLCBzdHJsZW4obmFtZSkpOwotCQkJaWYgKGNoYXBfcmVjaGFsbGVuZ2VfdGltZSkgewotCQkJCXNzLT5mbGFncyB8PSBUSU1FT1VUX1BFTkRJTkc7Ci0JCQkJVElNRU9VVChjaGFwX3RpbWVvdXQsIHNzLAotCQkJCQljaGFwX3JlY2hhbGxlbmdlX3RpbWUpOwotCQkJfQotCQl9Ci0JCXNzLT5mbGFncyB8PSBBVVRIX0RPTkU7Ci0JfQotfQotCi0vKgotICogY2hhcF92ZXJpZnlfcmVzcG9uc2UgLSBjaGVjayB3aGV0aGVyIHRoZSBwZWVyJ3MgcmVzcG9uc2UgbWF0Y2hlcwotICogd2hhdCB3ZSB0aGluayBpdCBzaG91bGQgYmUuICBSZXR1cm5zIDEgaWYgaXQgZG9lcyAoYXV0aGVudGljYXRpb24KLSAqIHN1Y2NlZWRlZCksIG9yIDAgaWYgaXQgZG9lc24ndC4KLSAqLwotc3RhdGljIGludAotY2hhcF92ZXJpZnlfcmVzcG9uc2UoY2hhciAqbmFtZSwgY2hhciAqb3VybmFtZSwgaW50IGlkLAotCQkgICAgIHN0cnVjdCBjaGFwX2RpZ2VzdF90eXBlICpkaWdlc3QsCi0JCSAgICAgdW5zaWduZWQgY2hhciAqY2hhbGxlbmdlLCB1bnNpZ25lZCBjaGFyICpyZXNwb25zZSwKLQkJICAgICBjaGFyICptZXNzYWdlLCBpbnQgbWVzc2FnZV9zcGFjZSkKLXsKLQlpbnQgb2s7Ci0JdW5zaWduZWQgY2hhciBzZWNyZXRbTUFYU0VDUkVUTEVOXTsKLQlpbnQgc2VjcmV0X2xlbjsKLQotCS8qIEdldCB0aGUgc2VjcmV0IHRoYXQgdGhlIHBlZXIgaXMgc3VwcG9zZWQgdG8ga25vdyAqLwotCWlmICghZ2V0X3NlY3JldCgwLCBuYW1lLCBvdXJuYW1lLCAoY2hhciAqKXNlY3JldCwgJnNlY3JldF9sZW4sIDEpKSB7Ci0JCWVycm9yKCJObyBDSEFQIHNlY3JldCBmb3VuZCBmb3IgYXV0aGVudGljYXRpbmcgJXEiLCBuYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jb2sgPSBkaWdlc3QtPnZlcmlmeV9yZXNwb25zZShpZCwgbmFtZSwgc2VjcmV0LCBzZWNyZXRfbGVuLCBjaGFsbGVuZ2UsCi0JCQkJICAgICByZXNwb25zZSwgbWVzc2FnZSwgbWVzc2FnZV9zcGFjZSk7Ci0JbWVtc2V0KHNlY3JldCwgMCwgc2l6ZW9mKHNlY3JldCkpOwotCi0JcmV0dXJuIG9rOwotfQotCi0vKgotICogY2hhcF9yZXNwb25kIC0gR2VuZXJhdGUgYW5kIHNlbmQgYSByZXNwb25zZSB0byBhIGNoYWxsZW5nZS4KLSAqLwotc3RhdGljIHZvaWQKLWNoYXBfcmVzcG9uZChzdHJ1Y3QgY2hhcF9jbGllbnRfc3RhdGUgKmNzLCBpbnQgaWQsCi0JICAgICB1bnNpZ25lZCBjaGFyICpwa3QsIGludCBsZW4pCi17Ci0JaW50IGNsZW4sIG5sZW47Ci0JaW50IHNlY3JldF9sZW47Ci0JdW5zaWduZWQgY2hhciAqcDsKLQl1bnNpZ25lZCBjaGFyIHJlc3BvbnNlW1JFU1BfTUFYX1BLVExFTl07Ci0JY2hhciBybmFtZVtNQVhOQU1FTEVOKzFdOwotCWNoYXIgc2VjcmV0W01BWFNFQ1JFVExFTisxXTsKLQotCWlmICgoY3MtPmZsYWdzICYgKExPV0VSVVAgfCBBVVRIX1NUQVJURUQpKSAhPSAoTE9XRVJVUCB8IEFVVEhfU1RBUlRFRCkpCi0JCXJldHVybjsJCS8qIG5vdCByZWFkeSAqLwotCWlmIChsZW4gPCAyIHx8IGxlbiA8IHBrdFswXSArIDEpCi0JCXJldHVybjsJCS8qIHRvbyBzaG9ydCAqLwotCWNsZW4gPSBwa3RbMF07Ci0JbmxlbiA9IGxlbiAtIChjbGVuICsgMSk7Ci0KLQkvKiBOdWxsIHRlcm1pbmF0ZSBhbmQgY2xlYW4gcmVtb3RlIG5hbWUuICovCi0Jc2xwcmludGYocm5hbWUsIHNpemVvZihybmFtZSksICIlLip2IiwgbmxlbiwgcGt0ICsgY2xlbiArIDEpOwotCi0JLyogTWljcm9zb2Z0IGRvZXNuJ3Qgc2VuZCB0aGVpciBuYW1lIGJhY2sgaW4gdGhlIFBQUCBwYWNrZXQgKi8KLQlpZiAoZXhwbGljaXRfcmVtb3RlIHx8IChyZW1vdGVfbmFtZVswXSAhPSAwICYmIHJuYW1lWzBdID09IDApKQotCQlzdHJsY3B5KHJuYW1lLCByZW1vdGVfbmFtZSwgc2l6ZW9mKHJuYW1lKSk7Ci0KLQkvKiBnZXQgc2VjcmV0IGZvciBhdXRoZW50aWNhdGluZyBvdXJzZWx2ZXMgd2l0aCB0aGUgc3BlY2lmaWVkIGhvc3QgKi8KLQlpZiAoIWdldF9zZWNyZXQoMCwgY3MtPm5hbWUsIHJuYW1lLCBzZWNyZXQsICZzZWNyZXRfbGVuLCAwKSkgewotCQlzZWNyZXRfbGVuID0gMDsJLyogYXNzdW1lIG51bGwgc2VjcmV0IGlmIGNhbid0IGZpbmQgb25lICovCi0JCXdhcm4oIk5vIENIQVAgc2VjcmV0IGZvdW5kIGZvciBhdXRoZW50aWNhdGluZyB1cyB0byAlcSIsIHJuYW1lKTsKLQl9Ci0KLQlwID0gcmVzcG9uc2U7Ci0JTUFLRUhFQURFUihwLCBQUFBfQ0hBUCk7Ci0JcCArPSBDSEFQX0hEUkxFTjsKLQotCWNzLT5kaWdlc3QtPm1ha2VfcmVzcG9uc2UocCwgaWQsIGNzLT5uYW1lLCBwa3QsCi0JCQkJICBzZWNyZXQsIHNlY3JldF9sZW4sIGNzLT5wcml2KTsKLQltZW1zZXQoc2VjcmV0LCAwLCBzZWNyZXRfbGVuKTsKLQotCWNsZW4gPSAqcDsKLQlubGVuID0gc3RybGVuKGNzLT5uYW1lKTsKLQltZW1jcHkocCArIGNsZW4gKyAxLCBjcy0+bmFtZSwgbmxlbik7Ci0KLQlwID0gcmVzcG9uc2UgKyBQUFBfSERSTEVOOwotCWxlbiA9IENIQVBfSERSTEVOICsgY2xlbiArIDEgKyBubGVuOwotCXBbMF0gPSBDSEFQX1JFU1BPTlNFOwotCXBbMV0gPSBpZDsKLQlwWzJdID0gbGVuID4+IDg7Ci0JcFszXSA9IGxlbjsKLQotCW91dHB1dCgwLCByZXNwb25zZSwgUFBQX0hEUkxFTiArIGxlbik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGFwX2hhbmRsZV9zdGF0dXMoc3RydWN0IGNoYXBfY2xpZW50X3N0YXRlICpjcywgaW50IGNvZGUsIGludCBpZCwKLQkJICAgdW5zaWduZWQgY2hhciAqcGt0LCBpbnQgbGVuKQotewotCWNvbnN0IGNoYXIgKm1zZyA9IE5VTEw7Ci0KLQlpZiAoKGNzLT5mbGFncyAmIChBVVRIX0RPTkV8QVVUSF9TVEFSVEVEfExPV0VSVVApKQotCSAgICAhPSAoQVVUSF9TVEFSVEVEfExPV0VSVVApKQotCQlyZXR1cm47Ci0JY3MtPmZsYWdzIHw9IEFVVEhfRE9ORTsKLQotCWlmIChjb2RlID09IENIQVBfU1VDQ0VTUykgewotCQkvKiB1c2VkIGZvciBNUy1DSEFQIHYyIG11dHVhbCBhdXRoLCB5dWNrICovCi0JCWlmIChjcy0+ZGlnZXN0LT5jaGVja19zdWNjZXNzICE9IE5VTEwpIHsKLQkJCWlmICghKCpjcy0+ZGlnZXN0LT5jaGVja19zdWNjZXNzKShpZCwgcGt0LCBsZW4pKQotCQkJCWNvZGUgPSBDSEFQX0ZBSUxVUkU7Ci0JCX0gZWxzZQotCQkJbXNnID0gIkNIQVAgYXV0aGVudGljYXRpb24gc3VjY2VlZGVkIjsKLQl9IGVsc2UgewotCQlpZiAoY3MtPmRpZ2VzdC0+aGFuZGxlX2ZhaWx1cmUgIT0gTlVMTCkKLQkJCSgqY3MtPmRpZ2VzdC0+aGFuZGxlX2ZhaWx1cmUpKHBrdCwgbGVuKTsKLQkJZWxzZQotCQkJbXNnID0gIkNIQVAgYXV0aGVudGljYXRpb24gZmFpbGVkIjsKLQl9Ci0JaWYgKG1zZykgewotCQlpZiAobGVuID4gMCkKLQkJCWluZm8oIiVzOiAlLip2IiwgbXNnLCBsZW4sIHBrdCk7Ci0JCWVsc2UKLQkJCWluZm8oIiVzIiwgbXNnKTsKLQl9Ci0JaWYgKGNvZGUgPT0gQ0hBUF9TVUNDRVNTKQotCQlhdXRoX3dpdGhwZWVyX3N1Y2Nlc3MoMCwgUFBQX0NIQVAsIGNzLT5kaWdlc3QtPmNvZGUpOwotCWVsc2UgewotCQljcy0+ZmxhZ3MgfD0gQVVUSF9GQUlMRUQ7Ci0JCWVycm9yKCJDSEFQIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCIpOwotCQlhdXRoX3dpdGhwZWVyX2ZhaWwoMCwgUFBQX0NIQVApOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWNoYXBfaW5wdXQoaW50IHVuaXQsIHVuc2lnbmVkIGNoYXIgKnBrdCwgaW50IHBrdGxlbikKLXsKLQlzdHJ1Y3QgY2hhcF9jbGllbnRfc3RhdGUgKmNzID0gJmNsaWVudDsKLQlzdHJ1Y3QgY2hhcF9zZXJ2ZXJfc3RhdGUgKnNzID0gJnNlcnZlcjsKLQl1bnNpZ25lZCBjaGFyIGNvZGUsIGlkOwotCWludCBsZW47Ci0KLQlpZiAocGt0bGVuIDwgQ0hBUF9IRFJMRU4pCi0JCXJldHVybjsKLQlHRVRDSEFSKGNvZGUsIHBrdCk7Ci0JR0VUQ0hBUihpZCwgcGt0KTsKLQlHRVRTSE9SVChsZW4sIHBrdCk7Ci0JaWYgKGxlbiA8IENIQVBfSERSTEVOIHx8IGxlbiA+IHBrdGxlbikKLQkJcmV0dXJuOwotCWxlbiAtPSBDSEFQX0hEUkxFTjsKLQotCXN3aXRjaCAoY29kZSkgewotCWNhc2UgQ0hBUF9DSEFMTEVOR0U6Ci0JCWNoYXBfcmVzcG9uZChjcywgaWQsIHBrdCwgbGVuKTsKLQkJYnJlYWs7Ci0JY2FzZSBDSEFQX1JFU1BPTlNFOgotCQljaGFwX2hhbmRsZV9yZXNwb25zZShzcywgaWQsIHBrdCwgbGVuKTsKLQkJYnJlYWs7Ci0JY2FzZSBDSEFQX0ZBSUxVUkU6Ci0JY2FzZSBDSEFQX1NVQ0NFU1M6Ci0JCWNoYXBfaGFuZGxlX3N0YXR1cyhjcywgY29kZSwgaWQsIHBrdCwgbGVuKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotY2hhcF9wcm90cmVqKGludCB1bml0KQotewotCXN0cnVjdCBjaGFwX2NsaWVudF9zdGF0ZSAqY3MgPSAmY2xpZW50OwotCXN0cnVjdCBjaGFwX3NlcnZlcl9zdGF0ZSAqc3MgPSAmc2VydmVyOwotCi0JaWYgKHNzLT5mbGFncyAmIFRJTUVPVVRfUEVORElORykgewotCQlzcy0+ZmxhZ3MgJj0gflRJTUVPVVRfUEVORElORzsKLQkJVU5USU1FT1VUKGNoYXBfdGltZW91dCwgc3MpOwotCX0KLQlpZiAoc3MtPmZsYWdzICYgQVVUSF9TVEFSVEVEKSB7Ci0JCXNzLT5mbGFncyA9IDA7Ci0JCWF1dGhfcGVlcl9mYWlsKDAsIFBQUF9DSEFQKTsKLQl9Ci0JaWYgKChjcy0+ZmxhZ3MgJiAoQVVUSF9TVEFSVEVEfEFVVEhfRE9ORSkpID09IEFVVEhfU1RBUlRFRCkgewotCQljcy0+ZmxhZ3MgJj0gfkFVVEhfU1RBUlRFRDsKLQkJZXJyb3IoIkNIQVAgYXV0aGVudGljYXRpb24gZmFpbGVkIGR1ZSB0byBwcm90b2NvbC1yZWplY3QiKTsKLQkJYXV0aF93aXRocGVlcl9mYWlsKDAsIFBQUF9DSEFQKTsKLQl9Ci19Ci0KLS8qCi0gKiBjaGFwX3ByaW50X3BrdCAtIHByaW50IHRoZSBjb250ZW50cyBvZiBhIENIQVAgcGFja2V0LgotICovCi1zdGF0aWMgY2hhciAqY2hhcF9jb2RlX25hbWVzW10gPSB7Ci0JIkNoYWxsZW5nZSIsICJSZXNwb25zZSIsICJTdWNjZXNzIiwgIkZhaWx1cmUiCi19OwotCi1zdGF0aWMgaW50Ci1jaGFwX3ByaW50X3BrdCh1bnNpZ25lZCBjaGFyICpwLCBpbnQgcGxlbiwKLQkgICAgICAgdm9pZCAoKnByaW50ZXIpIF9fUCgodm9pZCAqLCBjaGFyICosIC4uLikpLCB2b2lkICphcmcpCi17Ci0JaW50IGNvZGUsIGlkLCBsZW47Ci0JaW50IGNsZW4sIG5sZW47Ci0JdW5zaWduZWQgY2hhciB4OwotCi0JaWYgKHBsZW4gPCBDSEFQX0hEUkxFTikKLQkJcmV0dXJuIDA7Ci0JR0VUQ0hBUihjb2RlLCBwKTsKLQlHRVRDSEFSKGlkLCBwKTsKLQlHRVRTSE9SVChsZW4sIHApOwotCWlmIChsZW4gPCBDSEFQX0hEUkxFTiB8fCBsZW4gPiBwbGVuKQotCQlyZXR1cm4gMDsKLQotCWlmIChjb2RlID49IDEgJiYgY29kZSA8PSBzaXplb2YoY2hhcF9jb2RlX25hbWVzKSAvIHNpemVvZihjaGFyICopKQotCQlwcmludGVyKGFyZywgIiAlcyIsIGNoYXBfY29kZV9uYW1lc1tjb2RlLTFdKTsKLQllbHNlCi0JCXByaW50ZXIoYXJnLCAiIGNvZGU9MHgleCIsIGNvZGUpOwotCXByaW50ZXIoYXJnLCAiIGlkPTB4JXgiLCBpZCk7Ci0JbGVuIC09IENIQVBfSERSTEVOOwotCXN3aXRjaCAoY29kZSkgewotCWNhc2UgQ0hBUF9DSEFMTEVOR0U6Ci0JY2FzZSBDSEFQX1JFU1BPTlNFOgotCQlpZiAobGVuIDwgMSkKLQkJCWJyZWFrOwotCQljbGVuID0gcFswXTsKLQkJaWYgKGxlbiA8IGNsZW4gKyAxKQotCQkJYnJlYWs7Ci0JCSsrcDsKLQkJbmxlbiA9IGxlbiAtIGNsZW4gLSAxOwotCQlwcmludGVyKGFyZywgIiA8Iik7Ci0JCWZvciAoOyBjbGVuID4gMDsgLS1jbGVuKSB7Ci0JCQlHRVRDSEFSKHgsIHApOwotCQkJcHJpbnRlcihhcmcsICIlLjJ4IiwgeCk7Ci0JCX0KLQkJcHJpbnRlcihhcmcsICI+LCBuYW1lID0gIik7Ci0JCXByaW50X3N0cmluZygoY2hhciAqKXAsIG5sZW4sIHByaW50ZXIsIGFyZyk7Ci0JCWJyZWFrOwotCWNhc2UgQ0hBUF9GQUlMVVJFOgotCWNhc2UgQ0hBUF9TVUNDRVNTOgotCQlwcmludGVyKGFyZywgIiAiKTsKLQkJcHJpbnRfc3RyaW5nKChjaGFyICopcCwgbGVuLCBwcmludGVyLCBhcmcpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlmb3IgKGNsZW4gPSBsZW47IGNsZW4gPiAwOyAtLWNsZW4pIHsKLQkJCUdFVENIQVIoeCwgcCk7Ci0JCQlwcmludGVyKGFyZywgIiAlLjJ4IiwgeCk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gbGVuICsgQ0hBUF9IRFJMRU47Ci19Ci0KLXN0cnVjdCBwcm90ZW50IGNoYXBfcHJvdGVudCA9IHsKLQlQUFBfQ0hBUCwKLQljaGFwX2luaXQsCi0JY2hhcF9pbnB1dCwKLQljaGFwX3Byb3RyZWosCi0JY2hhcF9sb3dlcnVwLAotCWNoYXBfbG93ZXJkb3duLAotCU5VTEwsCQkvKiBvcGVuICovCi0JTlVMTCwJCS8qIGNsb3NlICovCi0JY2hhcF9wcmludF9wa3QsCi0JTlVMTCwJCS8qIGRhdGFpbnB1dCAqLwotCTEsCQkvKiBlbmFibGVkX2ZsYWcgKi8KLQkiQ0hBUCIsCQkvKiBuYW1lICovCi0JTlVMTCwJCS8qIGRhdGFfbmFtZSAqLwotCWNoYXBfb3B0aW9uX2xpc3QsCi0JTlVMTCwJCS8qIGNoZWNrX29wdGlvbnMgKi8KLX07CmRpZmYgLS1naXQgYS9wcHBkL2NoYXAtbmV3LmggYi9wcHBkL2NoYXAtbmV3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NWU3OGYuLjAwMDAwMDAKLS0tIGEvcHBwZC9jaGFwLW5ldy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiBjaGFwLW5ldy5jIC0gTmV3IENIQVAgaW1wbGVtZW50YXRpb24uCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAzIFBhdWwgTWFja2VycmFzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIDMuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgUGF1bCBNYWNrZXJyYXMKLSAqICAgICA8cGF1bHVzQHNhbWJhLm9yZz4iLgotICoKLSAqIFRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLSAqIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotICogQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotLyoKLSAqIENIQVAgcGFja2V0cyBiZWdpbiB3aXRoIGEgc3RhbmRhcmQgaGVhZGVyIHdpdGggY29kZSwgaWQsIGxlbiAoMiBieXRlcykuCi0gKi8KLSNkZWZpbmUgQ0hBUF9IRFJMRU4JNAotCi0vKgotICogVmFsdWVzIGZvciB0aGUgY29kZSBmaWVsZC4KLSAqLwotI2RlZmluZSBDSEFQX0NIQUxMRU5HRQkxCi0jZGVmaW5lIENIQVBfUkVTUE9OU0UJMgotI2RlZmluZSBDSEFQX1NVQ0NFU1MJMwotI2RlZmluZSBDSEFQX0ZBSUxVUkUJNAotCi0vKgotICogQ0hBUCBkaWdlc3QgY29kZXMuCi0gKi8KLSNkZWZpbmUgQ0hBUF9NRDUJCTUKLSNkZWZpbmUgQ0hBUF9NSUNST1NPRlQJCTB4ODAKLSNkZWZpbmUgQ0hBUF9NSUNST1NPRlRfVjIJMHg4MQotCi0vKgotICogU2VtaS1hcmJpdHJhcnkgbGltaXRzIG9uIGNoYWxsZW5nZSBhbmQgcmVzcG9uc2UgZmllbGRzLgotICovCi0jZGVmaW5lIE1BWF9DSEFMTEVOR0VfTEVOCTY0Ci0jZGVmaW5lIE1BWF9SRVNQT05TRV9MRU4JNjQKLQotLyogYml0bWFzayBvZiBzdXBwb3J0ZWQgYWxnb3JpdGhtcyAqLwotI2RlZmluZSBNRFRZUEVfTUlDUk9TT0ZUX1YyCTB4MQotI2RlZmluZSBNRFRZUEVfTUlDUk9TT0ZUCTB4MgotI2RlZmluZSBNRFRZUEVfTUQ1CQkweDQKLSNkZWZpbmUgTURUWVBFX05PTkUJCTAKLQotLyogaGFzaGVzIHN1cHBvcnRlZCBieSB0aGlzIGluc3RhbmNlIG9mIHBwcGQgKi8KLWV4dGVybiBpbnQgY2hhcF9tZHR5cGVfYWxsOwotCi0vKiBSZXR1cm4gdGhlIGRpZ2VzdCBhbGcuIElEIGZvciB0aGUgbW9zdCBwcmVmZXJyZWQgZGlnZXN0IHR5cGUuICovCi0jZGVmaW5lIENIQVBfRElHRVNUKG1kdHlwZSkgXAotICAgICgobWR0eXBlKSAmIE1EVFlQRV9NRDUpPyBDSEFQX01ENTogXAotICAgICgobWR0eXBlKSAmIE1EVFlQRV9NSUNST1NPRlRfVjIpPyBDSEFQX01JQ1JPU09GVF9WMjogXAotICAgICgobWR0eXBlKSAmIE1EVFlQRV9NSUNST1NPRlQpPyBDSEFQX01JQ1JPU09GVDogXAotICAgIDAKLQotLyogUmV0dXJuIHRoZSBiaXQgZmxhZyAobHNiIHNldCkgZm9yIG91ciBtb3N0IHByZWZlcnJlZCBkaWdlc3QgdHlwZS4gKi8KLSNkZWZpbmUgQ0hBUF9NRFRZUEUobWR0eXBlKSAoKG1kdHlwZSkgXiAoKG1kdHlwZSkgLSAxKSkgJiAobWR0eXBlKQotCi0vKiBSZXR1cm4gdGhlIGJpdCBmbGFnIGZvciBhIGdpdmVuIGRpZ2VzdCBhbGdvcml0aG0gSUQuICovCi0jZGVmaW5lIENIQVBfTURUWVBFX0QoZGlnZXN0KSBcCi0gICAgKChkaWdlc3QpID09IENIQVBfTUlDUk9TT0ZUX1YyKT8gTURUWVBFX01JQ1JPU09GVF9WMjogXAotICAgICgoZGlnZXN0KSA9PSBDSEFQX01JQ1JPU09GVCk/IE1EVFlQRV9NSUNST1NPRlQ6IFwKLSAgICAoKGRpZ2VzdCkgPT0gQ0hBUF9NRDUpPyBNRFRZUEVfTUQ1OiBcCi0gICAgMAotCi0vKiBDYW4gd2UgZG8gdGhlIHJlcXVlc3RlZCBkaWdlc3Q/ICovCi0jZGVmaW5lIENIQVBfQ0FORElHRVNUKG1kdHlwZSwgZGlnZXN0KSBcCi0gICAgKChkaWdlc3QpID09IENIQVBfTUlDUk9TT0ZUX1YyKT8gKG1kdHlwZSkgJiBNRFRZUEVfTUlDUk9TT0ZUX1YyOiBcCi0gICAgKChkaWdlc3QpID09IENIQVBfTUlDUk9TT0ZUKT8gKG1kdHlwZSkgJiBNRFRZUEVfTUlDUk9TT0ZUOiBcCi0gICAgKChkaWdlc3QpID09IENIQVBfTUQ1KT8gKG1kdHlwZSkgJiBNRFRZUEVfTUQ1OiBcCi0gICAgMAotCi0vKgotICogVGhlIGNvZGUgZm9yIGVhY2ggZGlnZXN0IHR5cGUgaGFzIHRvIHN1cHBseSBvbmUgb2YgdGhlc2UuCi0gKi8KLXN0cnVjdCBjaGFwX2RpZ2VzdF90eXBlIHsKLQlpbnQgY29kZTsKLQotCS8qCi0JICogTm90ZTogY2hhbGxlbmdlIGFuZCByZXNwb25zZSBhcmd1bWVudHMgYmVsb3cgYXJlIGZvcm1hdHRlZCBhcwotCSAqIGEgbGVuZ3RoIGJ5dGUgZm9sbG93ZWQgYnkgdGhlIGFjdHVhbCBjaGFsbGVuZ2UvcmVzcG9uc2UgZGF0YS4KLQkgKi8KLQl2b2lkICgqZ2VuZXJhdGVfY2hhbGxlbmdlKSh1bnNpZ25lZCBjaGFyICpjaGFsbGVuZ2UpOwotCWludCAoKnZlcmlmeV9yZXNwb25zZSkoaW50IGlkLCBjaGFyICpuYW1lLAotCQl1bnNpZ25lZCBjaGFyICpzZWNyZXQsIGludCBzZWNyZXRfbGVuLAotCQl1bnNpZ25lZCBjaGFyICpjaGFsbGVuZ2UsIHVuc2lnbmVkIGNoYXIgKnJlc3BvbnNlLAotCQljaGFyICptZXNzYWdlLCBpbnQgbWVzc2FnZV9zcGFjZSk7Ci0Jdm9pZCAoKm1ha2VfcmVzcG9uc2UpKHVuc2lnbmVkIGNoYXIgKnJlc3BvbnNlLCBpbnQgaWQsIGNoYXIgKm91cl9uYW1lLAotCQl1bnNpZ25lZCBjaGFyICpjaGFsbGVuZ2UsIGNoYXIgKnNlY3JldCwgaW50IHNlY3JldF9sZW4sCi0JCXVuc2lnbmVkIGNoYXIgKnByaXYpOwotCWludCAoKmNoZWNrX3N1Y2Nlc3MpKGludCBpZCwgdW5zaWduZWQgY2hhciAqcGt0LCBpbnQgbGVuKTsKLQl2b2lkICgqaGFuZGxlX2ZhaWx1cmUpKHVuc2lnbmVkIGNoYXIgKnBrdCwgaW50IGxlbik7Ci0KLQlzdHJ1Y3QgY2hhcF9kaWdlc3RfdHlwZSAqbmV4dDsKLX07Ci0KLS8qIEhvb2sgZm9yIGEgcGx1Z2luIHRvIHZhbGlkYXRlIENIQVAgY2hhbGxlbmdlICovCi1leHRlcm4gaW50ICgqY2hhcF92ZXJpZnlfaG9vaykoY2hhciAqbmFtZSwgY2hhciAqb3VybmFtZSwgaW50IGlkLAotCQkJc3RydWN0IGNoYXBfZGlnZXN0X3R5cGUgKmRpZ2VzdCwKLQkJCXVuc2lnbmVkIGNoYXIgKmNoYWxsZW5nZSwgdW5zaWduZWQgY2hhciAqcmVzcG9uc2UsCi0JCQljaGFyICptZXNzYWdlLCBpbnQgbWVzc2FnZV9zcGFjZSk7Ci0KLS8qIENhbGxlZCBieSBkaWdlc3QgY29kZSB0byByZWdpc3RlciBhIGRpZ2VzdCB0eXBlICovCi1leHRlcm4gdm9pZCBjaGFwX3JlZ2lzdGVyX2RpZ2VzdChzdHJ1Y3QgY2hhcF9kaWdlc3RfdHlwZSAqKTsKLQotLyogQ2FsbGVkIGJ5IGF1dGhlbnRpY2F0aW9uIGNvZGUgdG8gc3RhcnQgYXV0aGVudGljYXRpbmcgdGhlIHBlZXIuICovCi1leHRlcm4gdm9pZCBjaGFwX2F1dGhfcGVlcihpbnQgdW5pdCwgY2hhciAqb3VyX25hbWUsIGludCBkaWdlc3RfY29kZSk7Ci0KLS8qIENhbGxlZCBieSBhdXRoLiBjb2RlIHRvIHN0YXJ0IGF1dGhlbnRpY2F0aW5nIHVzIHRvIHRoZSBwZWVyLiAqLwotZXh0ZXJuIHZvaWQgY2hhcF9hdXRoX3dpdGhfcGVlcihpbnQgdW5pdCwgY2hhciAqb3VyX25hbWUsIGludCBkaWdlc3RfY29kZSk7Ci0KLS8qIFJlcHJlc2VudHMgdGhlIENIQVAgcHJvdG9jb2wgdG8gdGhlIG1haW4gcHBwZCBjb2RlICovCi1leHRlcm4gc3RydWN0IHByb3RlbnQgY2hhcF9wcm90ZW50OwpkaWZmIC0tZ2l0IGEvcHBwZC9jaGFwX21zLmMgYi9wcHBkL2NoYXBfbXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MwZTUyYy4uMDAwMDAwMAotLS0gYS9wcHBkL2NoYXBfbXMuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMTUgKzAsMCBAQAotLyoKLSAqIGNoYXBfbXMuYyAtIE1pY3Jvc29mdCBNUy1DSEFQIGNvbXBhdGlibGUgaW1wbGVtZW50YXRpb24uCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk1IEVyaWMgUm9zZW5xdWlzdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLSAqIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotICogQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotLyoKLSAqIE1vZGlmaWNhdGlvbnMgYnkgTGF1cmkgUGVzb25lbiAvIGxwZXNvbmVuQGNsaW5ldC5maSwgYXByaWwgMTk5NwotICoKLSAqICAgSW1wbGVtZW50ZWQgTEFOTWFuYWdlciB0eXBlIHBhc3N3b3JkIHJlc3BvbnNlIHRvIE1TLUNIQVAgY2hhbGxlbmdlcy4KLSAqICAgTm93IHBwcGQgcHJvdmlkZXMgYm90aCBOVCBzdHlsZSBhbmQgTEFOTWFuIHN0eWxlIGJsb2NrcywgYW5kIHRoZQotICogICBwcmVmZXJlZCBpcyBzZXQgYnkgb3B0aW9uICJtcy1sYW5tYW4iLiBEZWZhdWx0IGlzIHRvIHVzZSBOVC4KLSAqICAgVGhlIGhhc2ggdGV4dCAoU3RkVGV4dCkgd2FzIHRha2VuIGZyb20gV2luOTUgUkFTQVBJMzIuRExMLgotICoKLSAqICAgWW91IHNob3VsZCBhbHNvIHVzZSBET01BSU5cXFVTRVJOQU1FIGFzIGRlc2NyaWJlZCBpbiBSRUFETUUuTVNDSEFQODAKLSAqLwotCi0vKgotICogTW9kaWZpY2F0aW9ucyBieSBGcmFuayBDdXNhY2ssIGZyYW5rQGdvb2dsZS5jb20sIE1hcmNoIDIwMDIuCi0gKgotICogICBJbXBsZW1lbnRlZCBNUy1DSEFQdjIgZnVuY3Rpb25hbGl0eSwgaGVhdmlseSBiYXNlZCBvbiBzYW1wbGUKLSAqICAgaW1wbGVtZW50YXRpb24gaW4gUkZDIDI3NTkuICBJbXBsZW1lbnRlZCBNUFBFIGZ1bmN0aW9uYWxpdHksCi0gKiAgIGhlYXZpbHkgYmFzZWQgb24gc2FtcGxlIGltcGxlbWVudGF0aW9uIGluIFJGQyAzMDc5LgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMiBHb29nbGUsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLSAqIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotICogQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKgotICovCi0KLSNkZWZpbmUgUkNTSUQJIiRJZDogY2hhcF9tcy5jLHYgMS4zOCAyMDA3LzEyLzAxIDIwOjEwOjUxIGNhcmxzb25qIEV4cCAkIgotCi0jaWZkZWYgQ0hBUE1TCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgInBwcGQuaCIKLSNpbmNsdWRlICJjaGFwLW5ldy5oIgotI2luY2x1ZGUgImNoYXBfbXMuaCIKLSNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKQotI2luY2x1ZGUgIm9wZW5zc2wtaGFzaC5oIgotI2Vsc2UKLSNpbmNsdWRlICJtZDQuaCIKLSNpbmNsdWRlICJzaGExLmgiCi0jZW5kaWYKLSNpbmNsdWRlICJwcHBjcnlwdC5oIgotI2luY2x1ZGUgIm1hZ2ljLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gPSBSQ1NJRDsKLQotCi1zdGF0aWMgdm9pZAlhc2NpaTJ1bmljb2RlIF9fUCgoY2hhcltdLCBpbnQsIHVfY2hhcltdKSk7Ci1zdGF0aWMgdm9pZAlOVFBhc3N3b3JkSGFzaCBfX1AoKHVfY2hhciAqLCBpbnQsIHVfY2hhcltNRDRfU0lHTkFUVVJFX1NJWkVdKSk7Ci1zdGF0aWMgdm9pZAlDaGFsbGVuZ2VSZXNwb25zZSBfX1AoKHVfY2hhciAqLCB1X2NoYXIgKiwgdV9jaGFyWzI0XSkpOwotc3RhdGljIHZvaWQJQ2hhcE1TX05UIF9fUCgodV9jaGFyICosIGNoYXIgKiwgaW50LCB1X2NoYXJbMjRdKSk7Ci1zdGF0aWMgdm9pZAlDaGFwTVMyX05UIF9fUCgodV9jaGFyICosIHVfY2hhclsxNl0sIGNoYXIgKiwgY2hhciAqLCBpbnQsCi0JCQkJdV9jaGFyWzI0XSkpOwotc3RhdGljIHZvaWQJR2VuZXJhdGVBdXRoZW50aWNhdG9yUmVzcG9uc2VQbGFpbgotCQkJX19QKChjaGFyKiwgaW50LCB1X2NoYXJbMjRdLCB1X2NoYXJbMTZdLCB1X2NoYXIgKiwKLQkJCSAgICAgY2hhciAqLCB1X2NoYXJbNDFdKSk7Ci0jaWZkZWYgTVNMQU5NQU4KLXN0YXRpYyB2b2lkCUNoYXBNU19MQU5NYW4gX19QKCh1X2NoYXIgKiwgY2hhciAqLCBpbnQsIHVfY2hhciAqKSk7Ci0jZW5kaWYKLQotI2lmZGVmIE1QUEUKLXN0YXRpYyB2b2lkCVNldF9TdGFydF9LZXkgX19QKCh1X2NoYXIgKiwgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkCVNldE1hc3RlcktleXMgX19QKChjaGFyICosIGludCwgdV9jaGFyWzI0XSwgaW50KSk7Ci0jZW5kaWYKLQotI2lmZGVmIE1TTEFOTUFOCi1ib29sCW1zX2xhbm1hbiA9IDA7ICAgIAkvKiBVc2UgTGFuTWFuIHBhc3N3b3JkIGluc3RlYWQgb2YgTlQgKi8KLQkJCSAgCS8qIEhhcyBtZWFuaW5nIG9ubHkgd2l0aCBNUy1DSEFQIGNoYWxsZW5nZXMgKi8KLSNlbmRpZgotCi0jaWZkZWYgTVBQRQotdV9jaGFyIG1wcGVfc2VuZF9rZXlbTVBQRV9NQVhfS0VZX0xFTl07Ci11X2NoYXIgbXBwZV9yZWN2X2tleVtNUFBFX01BWF9LRVlfTEVOXTsKLWludCBtcHBlX2tleXNfc2V0ID0gMDsJCS8qIEhhdmUgdGhlIE1QUEUga2V5cyBiZWVuIHNldD8gKi8KLQotI2lmZGVmIERFQlVHTVBQRUtFWQotLyogRm9yIE1QUEUgZGVidWcgKi8KLS8qIFVzZSAiW118fXs/Lz48LGAhMiYmKCIgKHNhbnMgcXVvdGVzKSBmb3IgUkZDIDMwNzkgTVMtQ0hBUHYyIHRlc3QgdmFsdWUgKi8KLXN0YXRpYyBjaGFyICptc2NoYXBfY2hhbGxlbmdlID0gTlVMTDsKLS8qIFVzZSAiIUBcIyQlXiYqKClfKzozfH4iIChzYW5zIHF1b3RlcywgYmFja3NsYXNoIGlzIHRvIGVzY2FwZSAjKSBmb3IgLi4uICovCi1zdGF0aWMgY2hhciAqbXNjaGFwMl9wZWVyX2NoYWxsZW5nZSA9IE5VTEw7Ci0jZW5kaWYKLQotI2luY2x1ZGUgImZzbS5oIgkJLyogTmVlZCB0byBwb2tlIE1QUEUgb3B0aW9ucyAqLwotI2luY2x1ZGUgImNjcC5oIgotI2luY2x1ZGUgPG5ldC9wcHAtY29tcC5oPgotI2VuZGlmCi0KLS8qCi0gKiBDb21tYW5kLWxpbmUgb3B0aW9ucy4KLSAqLwotc3RhdGljIG9wdGlvbl90IGNoYXBtc19vcHRpb25fbGlzdFtdID0gewotI2lmZGVmIE1TTEFOTUFOCi0JeyAibXMtbGFubWFuIiwgb19ib29sLCAmbXNfbGFubWFuLAotCSAgIlVzZSBMYW5NYW4gcGFzc3dkIHdoZW4gdXNpbmcgTVMtQ0hBUCIsIDEgfSwKLSNlbmRpZgotI2lmZGVmIERFQlVHTVBQRUtFWQotCXsgIm1zY2hhcC1jaGFsbGVuZ2UiLCBvX3N0cmluZywgJm1zY2hhcF9jaGFsbGVuZ2UsCi0JICAic3BlY2lmeSBDSEFQIGNoYWxsZW5nZSIgfSwKLQl7ICJtc2NoYXAyLXBlZXItY2hhbGxlbmdlIiwgb19zdHJpbmcsICZtc2NoYXAyX3BlZXJfY2hhbGxlbmdlLAotCSAgInNwZWNpZnkgQ0hBUCBwZWVyIGNoYWxsZW5nZSIgfSwKLSNlbmRpZgotCXsgTlVMTCB9Ci19OwotCi0vKgotICogY2hhcG1zX2dlbmVyYXRlX2NoYWxsZW5nZSAtIGdlbmVyYXRlIGEgY2hhbGxlbmdlIGZvciBNUy1DSEFQLgotICogRm9yIE1TLUNIQVAgdGhlIGNoYWxsZW5nZSBsZW5ndGggaXMgZml4ZWQgYXQgOCBieXRlcy4KLSAqIFRoZSBsZW5ndGggZ29lcyBpbiBjaGFsbGVuZ2VbMF0gYW5kIHRoZSBhY3R1YWwgY2hhbGxlbmdlIHN0YXJ0cwotICogYXQgY2hhbGxlbmdlWzFdLgotICovCi1zdGF0aWMgdm9pZAotY2hhcG1zX2dlbmVyYXRlX2NoYWxsZW5nZSh1bnNpZ25lZCBjaGFyICpjaGFsbGVuZ2UpCi17Ci0JKmNoYWxsZW5nZSsrID0gODsKLSNpZmRlZiBERUJVR01QUEVLRVkKLQlpZiAobXNjaGFwX2NoYWxsZW5nZSAmJiBzdHJsZW4obXNjaGFwX2NoYWxsZW5nZSkgPT0gOCkKLQkJbWVtY3B5KGNoYWxsZW5nZSwgbXNjaGFwX2NoYWxsZW5nZSwgOCk7Ci0JZWxzZQotI2VuZGlmCi0JCXJhbmRvbV9ieXRlcyhjaGFsbGVuZ2UsIDgpOwotfQotCi1zdGF0aWMgdm9pZAotY2hhcG1zMl9nZW5lcmF0ZV9jaGFsbGVuZ2UodW5zaWduZWQgY2hhciAqY2hhbGxlbmdlKQotewotCSpjaGFsbGVuZ2UrKyA9IDE2OwotI2lmZGVmIERFQlVHTVBQRUtFWQotCWlmIChtc2NoYXBfY2hhbGxlbmdlICYmIHN0cmxlbihtc2NoYXBfY2hhbGxlbmdlKSA9PSAxNikKLQkJbWVtY3B5KGNoYWxsZW5nZSwgbXNjaGFwX2NoYWxsZW5nZSwgMTYpOwotCWVsc2UKLSNlbmRpZgotCQlyYW5kb21fYnl0ZXMoY2hhbGxlbmdlLCAxNik7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoYXBtc192ZXJpZnlfcmVzcG9uc2UoaW50IGlkLCBjaGFyICpuYW1lLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqc2VjcmV0LCBpbnQgc2VjcmV0X2xlbiwKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmNoYWxsZW5nZSwgdW5zaWduZWQgY2hhciAqcmVzcG9uc2UsCi0JCSAgICAgICBjaGFyICptZXNzYWdlLCBpbnQgbWVzc2FnZV9zcGFjZSkKLXsKLQl1bnNpZ25lZCBjaGFyIG1kW01TX0NIQVBfUkVTUE9OU0VfTEVOXTsKLQlpbnQgZGlmZjsKLQlpbnQgY2hhbGxlbmdlX2xlbiwgcmVzcG9uc2VfbGVuOwotCi0JY2hhbGxlbmdlX2xlbiA9ICpjaGFsbGVuZ2UrKzsJLyogc2tpcCBsZW5ndGgsIGlzIDggKi8KLQlyZXNwb25zZV9sZW4gPSAqcmVzcG9uc2UrKzsKLQlpZiAocmVzcG9uc2VfbGVuICE9IE1TX0NIQVBfUkVTUE9OU0VfTEVOKQotCQlnb3RvIGJhZDsKLQotI2lmbmRlZiBNU0xBTk1BTgotCWlmICghcmVzcG9uc2VbTVNfQ0hBUF9VU0VOVF0pIHsKLQkJLyogU2hvdWxkIHJlYWxseSBwcm9wYWdhdGUgdGhpcyBpbnRvIHRoZSBlcnJvciBwYWNrZXQuICovCi0JCW5vdGljZSgiUGVlciByZXF1ZXN0IGZvciBMQU5NQU4gYXV0aCBub3Qgc3VwcG9ydGVkIik7Ci0JCWdvdG8gYmFkOwotCX0KLSNlbmRpZgotCi0JLyogR2VuZXJhdGUgdGhlIGV4cGVjdGVkIHJlc3BvbnNlLiAqLwotCUNoYXBNUyhjaGFsbGVuZ2UsIChjaGFyICopc2VjcmV0LCBzZWNyZXRfbGVuLCBtZCk7Ci0KLSNpZmRlZiBNU0xBTk1BTgotCS8qIERldGVybWluZSB3aGljaCBwYXJ0IG9mIHJlc3BvbnNlIHRvIHZlcmlmeSBhZ2FpbnN0ICovCi0JaWYgKCFyZXNwb25zZVtNU19DSEFQX1VTRU5UXSkKLQkJZGlmZiA9IG1lbWNtcCgmcmVzcG9uc2VbTVNfQ0hBUF9MQU5NQU5SRVNQXSwKLQkJCSAgICAgICZtZFtNU19DSEFQX0xBTk1BTlJFU1BdLCBNU19DSEFQX0xBTk1BTlJFU1BfTEVOKTsKLQllbHNlCi0jZW5kaWYKLQkJZGlmZiA9IG1lbWNtcCgmcmVzcG9uc2VbTVNfQ0hBUF9OVFJFU1BdLCAmbWRbTVNfQ0hBUF9OVFJFU1BdLAotCQkJICAgICAgTVNfQ0hBUF9OVFJFU1BfTEVOKTsKLQotCWlmIChkaWZmID09IDApIHsKLQkJc2xwcmludGYobWVzc2FnZSwgbWVzc2FnZV9zcGFjZSwgIkFjY2VzcyBncmFudGVkIik7Ci0JCXJldHVybiAxOwotCX0KLQotIGJhZDoKLQkvKiBTZWUgY29tbWVudHMgYmVsb3cgZm9yIE1TLUNIQVAgVjIgKi8KLQlzbHByaW50ZihtZXNzYWdlLCBtZXNzYWdlX3NwYWNlLCAiRT02OTEgUj0xIEM9JTAuKkIgVj0wIiwKLQkJIGNoYWxsZW5nZV9sZW4sIGNoYWxsZW5nZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoYXBtczJfdmVyaWZ5X3Jlc3BvbnNlKGludCBpZCwgY2hhciAqbmFtZSwKLQkJCXVuc2lnbmVkIGNoYXIgKnNlY3JldCwgaW50IHNlY3JldF9sZW4sCi0JCQl1bnNpZ25lZCBjaGFyICpjaGFsbGVuZ2UsIHVuc2lnbmVkIGNoYXIgKnJlc3BvbnNlLAotCQkJY2hhciAqbWVzc2FnZSwgaW50IG1lc3NhZ2Vfc3BhY2UpCi17Ci0JdW5zaWduZWQgY2hhciBtZFtNU19DSEFQMl9SRVNQT05TRV9MRU5dOwotCWNoYXIgc2FyZXNwb25zZVtNU19BVVRIX1JFU1BPTlNFX0xFTkdUSCsxXTsKLQlpbnQgY2hhbGxlbmdlX2xlbiwgcmVzcG9uc2VfbGVuOwotCi0JY2hhbGxlbmdlX2xlbiA9ICpjaGFsbGVuZ2UrKzsJLyogc2tpcCBsZW5ndGgsIGlzIDE2ICovCi0JcmVzcG9uc2VfbGVuID0gKnJlc3BvbnNlKys7Ci0JaWYgKHJlc3BvbnNlX2xlbiAhPSBNU19DSEFQMl9SRVNQT05TRV9MRU4pCi0JCWdvdG8gYmFkOwkvKiBub3QgZXZlbiB0aGUgcmlnaHQgbGVuZ3RoICovCi0KLQkvKiBHZW5lcmF0ZSB0aGUgZXhwZWN0ZWQgcmVzcG9uc2UgYW5kIG91ciBtdXR1YWwgYXV0aC4gKi8KLQlDaGFwTVMyKGNoYWxsZW5nZSwgJnJlc3BvbnNlW01TX0NIQVAyX1BFRVJfQ0hBTExFTkdFXSwgbmFtZSwKLQkJKGNoYXIgKilzZWNyZXQsIHNlY3JldF9sZW4sIG1kLAotCQkodW5zaWduZWQgY2hhciAqKXNhcmVzcG9uc2UsIE1TX0NIQVAyX0FVVEhFTlRJQ0FUT1IpOwotCi0JLyogY29tcGFyZSBNRHMgYW5kIHNlbmQgdGhlIGFwcHJvcHJpYXRlIHN0YXR1cyAqLwotCS8qCi0JICogUGVyIFJGQyAyNzU5LCBzdWNjZXNzIG1lc3NhZ2UgbXVzdCBiZSBmb3JtYXR0ZWQgYXMKLQkgKiAgICAgIlM9PGF1dGhfc3RyaW5nPiBNPTxtZXNzYWdlPiIKLQkgKiB3aGVyZQotCSAqICAgICA8YXV0aF9zdHJpbmc+IGlzIHRoZSBBdXRoZW50aWNhdG9yIFJlc3BvbnNlIChtdXR1YWwgYXV0aCkKLQkgKiAgICAgPG1lc3NhZ2U+IGlzIGEgdGV4dCBtZXNzYWdlCi0JICoKLQkgKiBIb3dldmVyLCBzb21lIHZlcnNpb25zIG9mIFdpbmRvd3MgKHdpbjk4IHRlc3RlZCkgZG8gbm90IGtub3cKLQkgKiBhYm91dCB0aGUgTT08bWVzc2FnZT4gcGFydCAocmVxdWlyZWQgcGVyIFJGQyAyNzU5KSBhbmQgZmxhZwotCSAqIGl0IGFzIGFuIGVycm9yIChyZXBvcnRlZCBpbmNvcnJlY3RseSBhcyBhbiBlbmNyeXB0aW9uIGVycm9yCi0JICogdG8gdGhlIHVzZXIpLiAgU2luY2UgdGhlIFJGQyByZXF1aXJlcyBpdCwgYW5kIGl0IGNhbiBiZQotCSAqIHVzZWZ1bCBpbmZvcm1hdGlvbiwgd2Ugc3VwcGx5IGl0IGlmIHRoZSBwZWVyIGlzIGEgY29uZm9ybWluZwotCSAqIHN5c3RlbS4gIEx1Y2tpbHkgKD8pLCB3aW45OCBzZXRzIHRoZSBGbGFncyBmaWVsZCB0byAweDA0Ci0JICogKGNvbnRyYXJ5IHRvIFJGQyByZXF1aXJlbWVudHMpIHNvIHdlIGNhbiB1c2UgdGhhdCB0bwotCSAqIGRpc3Rpbmd1aXNoIGJldHdlZW4gY29uZm9ybWluZyBhbmQgbm9uLWNvbmZvcm1pbmcgc3lzdGVtcy4KLQkgKgotCSAqIFNwZWNpYWwgdGhhbmtzIHRvIEFsZXggU3dpcmlkb3YgPHNheUByZWFsLmtoYXJrb3YudWE+IGZvcgotCSAqIGhlbHAgZGVidWdnaW5nIHRoaXMuCi0JICovCi0JaWYgKG1lbWNtcCgmbWRbTVNfQ0hBUDJfTlRSRVNQXSwgJnJlc3BvbnNlW01TX0NIQVAyX05UUkVTUF0sCi0JCSAgIE1TX0NIQVAyX05UUkVTUF9MRU4pID09IDApIHsKLQkJaWYgKHJlc3BvbnNlW01TX0NIQVAyX0ZMQUdTXSkKLQkJCXNscHJpbnRmKG1lc3NhZ2UsIG1lc3NhZ2Vfc3BhY2UsICJTPSVzIiwgc2FyZXNwb25zZSk7Ci0JCWVsc2UKLQkJCXNscHJpbnRmKG1lc3NhZ2UsIG1lc3NhZ2Vfc3BhY2UsICJTPSVzIE09JXMiLAotCQkJCSBzYXJlc3BvbnNlLCAiQWNjZXNzIGdyYW50ZWQiKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0gYmFkOgotCS8qCi0JICogRmFpbHVyZSBtZXNzYWdlIG11c3QgYmUgZm9ybWF0dGVkIGFzCi0JICogICAgICJFPWUgUj1yIEM9YyBWPXYgTT1tIgotCSAqIHdoZXJlCi0JICogICAgIGUgPSBlcnJvciBjb2RlICh3ZSB1c2UgNjkxLCBFUlJPUl9BVVRIRU5USUNBVElPTl9GQUlMVVJFKQotCSAqICAgICByID0gcmV0cnkgKHdlIHVzZSAxLCBvayB0byByZXRyeSkKLQkgKiAgICAgYyA9IGNoYWxsZW5nZSB0byB1c2UgZm9yIG5leHQgcmVzcG9uc2UsIHdlIHJldXNlIHByZXZpb3VzCi0JICogICAgIHYgPSBDaGFuZ2UgUGFzc3dvcmQgdmVyc2lvbiBzdXBwb3J0ZWQsIHdlIHVzZSAwCi0JICogICAgIG0gPSB0ZXh0IG1lc3NhZ2UKLQkgKgotCSAqIFRoZSBNPW0gcGFydCBpcyBvbmx5IGZvciBNUy1DSEFQdjIuICBOZWl0aGVyIHdpbjJrIG5vcgotCSAqIHdpbjk4IChvdGhlcnMgdW50ZXN0ZWQpIGRpc3BsYXkgdGhlIG1lc3NhZ2UgdG8gdGhlIHVzZXIgYW55d2F5LgotCSAqIFRoZXkgYWxzbyBib3RoIGlnbm9yZSB0aGUgRT1lIGNvZGUuCi0JICoKLQkgKiBOb3RlIHRoYXQgaXQncyBzYWZlIHRvIHJldXNlIHRoZSBzYW1lIGNoYWxsZW5nZSBhcyB3ZSBkb24ndAotCSAqIGFjdHVhbGx5IGFjY2VwdCBhbm90aGVyIHJlc3BvbnNlIGJhc2VkIG9uIHRoZSBlcnJvciBtZXNzYWdlCi0JICogKGFuZCBubyBjbGllbnRzIHRyeSB0byByZXNlbmQgYSByZXNwb25zZSBhbnl3YXkpLgotCSAqCi0JICogQmFzaWNhbGx5LCB0aGlzIHdob2xlIGJpdCBpcyB1c2VsZXNzIGNvZGUsIGV2ZW4gdGhlIHNtYWxsCi0JICogaW1wbGVtZW50YXRpb24gaGVyZSBpcyBvbmx5IGJlY2F1c2Ugb2Ygb3ZlcnNwZWNpZmljYXRpb24uCi0JICovCi0Jc2xwcmludGYobWVzc2FnZSwgbWVzc2FnZV9zcGFjZSwgIkU9NjkxIFI9MSBDPSUwLipCIFY9MCBNPSVzIiwKLQkJIGNoYWxsZW5nZV9sZW4sIGNoYWxsZW5nZSwgIkFjY2VzcyBkZW5pZWQiKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLWNoYXBtc19tYWtlX3Jlc3BvbnNlKHVuc2lnbmVkIGNoYXIgKnJlc3BvbnNlLCBpbnQgaWQsIGNoYXIgKm91cl9uYW1lLAotCQkgICAgIHVuc2lnbmVkIGNoYXIgKmNoYWxsZW5nZSwgY2hhciAqc2VjcmV0LCBpbnQgc2VjcmV0X2xlbiwKLQkJICAgICB1bnNpZ25lZCBjaGFyICpwcml2YXRlKQotewotCWNoYWxsZW5nZSsrOwkvKiBza2lwIGxlbmd0aCwgc2hvdWxkIGJlIDggKi8KLQkqcmVzcG9uc2UrKyA9IE1TX0NIQVBfUkVTUE9OU0VfTEVOOwotCUNoYXBNUyhjaGFsbGVuZ2UsIHNlY3JldCwgc2VjcmV0X2xlbiwgcmVzcG9uc2UpOwotfQotCi1zdHJ1Y3QgY2hhcG1zMl9yZXNwb25zZV9jYWNoZV9lbnRyeSB7Ci0JaW50IGlkOwotCXVuc2lnbmVkIGNoYXIgY2hhbGxlbmdlWzE2XTsKLQl1bnNpZ25lZCBjaGFyIHJlc3BvbnNlW01TX0NIQVAyX1JFU1BPTlNFX0xFTl07Ci0JdW5zaWduZWQgY2hhciBhdXRoX3Jlc3BvbnNlW01TX0FVVEhfUkVTUE9OU0VfTEVOR1RIXTsKLX07Ci0KLSNkZWZpbmUgQ0hBUE1TMl9NQVhfUkVTUE9OU0VfQ0FDSEVfU0laRSAxMAotc3RhdGljIHN0cnVjdCBjaGFwbXMyX3Jlc3BvbnNlX2NhY2hlX2VudHJ5Ci0gICAgY2hhcG1zMl9yZXNwb25zZV9jYWNoZVtDSEFQTVMyX01BWF9SRVNQT05TRV9DQUNIRV9TSVpFXTsKLXN0YXRpYyBpbnQgY2hhcG1zMl9yZXNwb25zZV9jYWNoZV9uZXh0X2luZGV4ID0gMDsKLXN0YXRpYyBpbnQgY2hhcG1zMl9yZXNwb25zZV9jYWNoZV9zaXplID0gMDsKLQotc3RhdGljIHZvaWQKLWNoYXBtczJfYWRkX3RvX3Jlc3BvbnNlX2NhY2hlKGludCBpZCwgdW5zaWduZWQgY2hhciAqY2hhbGxlbmdlLAotCQkJICAgICAgdW5zaWduZWQgY2hhciAqcmVzcG9uc2UsCi0JCQkgICAgICB1bnNpZ25lZCBjaGFyICphdXRoX3Jlc3BvbnNlKQotewotCWludCBpID0gY2hhcG1zMl9yZXNwb25zZV9jYWNoZV9uZXh0X2luZGV4OwotCi0JY2hhcG1zMl9yZXNwb25zZV9jYWNoZVtpXS5pZCA9IGlkOwotCW1lbWNweShjaGFwbXMyX3Jlc3BvbnNlX2NhY2hlW2ldLmNoYWxsZW5nZSwgY2hhbGxlbmdlLCAxNik7Ci0JbWVtY3B5KGNoYXBtczJfcmVzcG9uc2VfY2FjaGVbaV0ucmVzcG9uc2UsIHJlc3BvbnNlLAotCSAgICAgICBNU19DSEFQMl9SRVNQT05TRV9MRU4pOwotCW1lbWNweShjaGFwbXMyX3Jlc3BvbnNlX2NhY2hlW2ldLmF1dGhfcmVzcG9uc2UsCi0JICAgICAgIGF1dGhfcmVzcG9uc2UsIE1TX0FVVEhfUkVTUE9OU0VfTEVOR1RIKTsKLQljaGFwbXMyX3Jlc3BvbnNlX2NhY2hlX25leHRfaW5kZXggPQotCQkoaSArIDEpICUgQ0hBUE1TMl9NQVhfUkVTUE9OU0VfQ0FDSEVfU0laRTsKLQlpZiAoY2hhcG1zMl9yZXNwb25zZV9jYWNoZV9uZXh0X2luZGV4ID4gY2hhcG1zMl9yZXNwb25zZV9jYWNoZV9zaXplKQotCQljaGFwbXMyX3Jlc3BvbnNlX2NhY2hlX3NpemUgPSBjaGFwbXMyX3Jlc3BvbnNlX2NhY2hlX25leHRfaW5kZXg7Ci0JZGJnbG9nKCJhZGRlZCByZXNwb25zZSBjYWNoZSBlbnRyeSAlZCIsIGkpOwotfQotCi1zdGF0aWMgc3RydWN0IGNoYXBtczJfcmVzcG9uc2VfY2FjaGVfZW50cnkqCi1jaGFwbXMyX2ZpbmRfaW5fcmVzcG9uc2VfY2FjaGUoaW50IGlkLCB1bnNpZ25lZCBjaGFyICpjaGFsbGVuZ2UsCi0JCSAgICAgIHVuc2lnbmVkIGNoYXIgKmF1dGhfcmVzcG9uc2UpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY2hhcG1zMl9yZXNwb25zZV9jYWNoZV9zaXplOyBpKyspIHsKLQkJaWYgKGlkID09IGNoYXBtczJfcmVzcG9uc2VfY2FjaGVbaV0uaWQKLQkJICAgICYmICghY2hhbGxlbmdlCi0JCQl8fCBtZW1jbXAoY2hhbGxlbmdlLAotCQkJCSAgY2hhcG1zMl9yZXNwb25zZV9jYWNoZVtpXS5jaGFsbGVuZ2UsCi0JCQkJICAxNikgPT0gMCkKLQkJICAgICYmICghYXV0aF9yZXNwb25zZQotCQkJfHwgbWVtY21wKGF1dGhfcmVzcG9uc2UsCi0JCQkJICBjaGFwbXMyX3Jlc3BvbnNlX2NhY2hlW2ldLmF1dGhfcmVzcG9uc2UsCi0JCQkJICBNU19BVVRIX1JFU1BPTlNFX0xFTkdUSCkgPT0gMCkpIHsKLQkJCWRiZ2xvZygicmVzcG9uc2UgZm91bmQgaW4gY2FjaGUgKGVudHJ5ICVkKSIsIGkpOwotCQkJcmV0dXJuICZjaGFwbXMyX3Jlc3BvbnNlX2NhY2hlW2ldOwotCQl9Ci0JfQotCXJldHVybiBOVUxMOyAgLyogbm90IGZvdW5kICovCi19Ci0KLXN0YXRpYyB2b2lkCi1jaGFwbXMyX21ha2VfcmVzcG9uc2UodW5zaWduZWQgY2hhciAqcmVzcG9uc2UsIGludCBpZCwgY2hhciAqb3VyX25hbWUsCi0JCSAgICAgIHVuc2lnbmVkIGNoYXIgKmNoYWxsZW5nZSwgY2hhciAqc2VjcmV0LCBpbnQgc2VjcmV0X2xlbiwKLQkJICAgICAgdW5zaWduZWQgY2hhciAqcHJpdmF0ZSkKLXsKLQljb25zdCBzdHJ1Y3QgY2hhcG1zMl9yZXNwb25zZV9jYWNoZV9lbnRyeSAqY2FjaGVfZW50cnk7Ci0JdW5zaWduZWQgY2hhciBhdXRoX3Jlc3BvbnNlW01TX0FVVEhfUkVTUE9OU0VfTEVOR1RIKzFdOwotCi0JY2hhbGxlbmdlKys7CS8qIHNraXAgbGVuZ3RoLCBzaG91bGQgYmUgMTYgKi8KLQkqcmVzcG9uc2UrKyA9IE1TX0NIQVAyX1JFU1BPTlNFX0xFTjsKLQljYWNoZV9lbnRyeSA9IGNoYXBtczJfZmluZF9pbl9yZXNwb25zZV9jYWNoZShpZCwgY2hhbGxlbmdlLCBOVUxMKTsKLQlpZiAoY2FjaGVfZW50cnkpIHsKLQkJbWVtY3B5KHJlc3BvbnNlLCBjYWNoZV9lbnRyeS0+cmVzcG9uc2UsIE1TX0NIQVAyX1JFU1BPTlNFX0xFTik7Ci0JCXJldHVybjsKLQl9Ci0JQ2hhcE1TMihjaGFsbGVuZ2UsCi0jaWZkZWYgREVCVUdNUFBFS0VZCi0JCW1zY2hhcDJfcGVlcl9jaGFsbGVuZ2UsCi0jZWxzZQotCQlOVUxMLAotI2VuZGlmCi0JCW91cl9uYW1lLCBzZWNyZXQsIHNlY3JldF9sZW4sIHJlc3BvbnNlLCBhdXRoX3Jlc3BvbnNlLAotCQlNU19DSEFQMl9BVVRIRU5USUNBVEVFKTsKLQljaGFwbXMyX2FkZF90b19yZXNwb25zZV9jYWNoZShpZCwgY2hhbGxlbmdlLCByZXNwb25zZSwgYXV0aF9yZXNwb25zZSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoYXBtczJfY2hlY2tfc3VjY2VzcyhpbnQgaWQsIHVuc2lnbmVkIGNoYXIgKm1zZywgaW50IGxlbikKLXsKLQlpZiAoKGxlbiA8IE1TX0FVVEhfUkVTUE9OU0VfTEVOR1RIICsgMikgfHwKLQkgICAgc3RybmNtcCgoY2hhciAqKW1zZywgIlM9IiwgMikgIT0gMCkgewotCQkvKiBQYWNrZXQgZG9lcyBub3Qgc3RhcnQgd2l0aCAiUz0iICovCi0JCWVycm9yKCJNUy1DSEFQdjIgU3VjY2VzcyBwYWNrZXQgaXMgYmFkbHkgZm9ybWVkLiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JbXNnICs9IDI7Ci0JbGVuIC09IDI7Ci0JaWYgKGxlbiA8IE1TX0FVVEhfUkVTUE9OU0VfTEVOR1RICi0JICAgIHx8ICFjaGFwbXMyX2ZpbmRfaW5fcmVzcG9uc2VfY2FjaGUoaWQsIE5VTEwgLyogY2hhbGxlbmdlICovLCBtc2cpKSB7Ci0JCS8qIEF1dGhlbnRpY2F0b3IgUmVzcG9uc2UgZGlkIG5vdCBtYXRjaCBleHBlY3RlZC4gKi8KLQkJZXJyb3IoIk1TLUNIQVB2MiBtdXR1YWwgYXV0aGVudGljYXRpb24gZmFpbGVkLiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyogQXV0aGVudGljYXRvciBSZXNwb25zZSBtYXRjaGVzLiAqLwotCW1zZyArPSBNU19BVVRIX1JFU1BPTlNFX0xFTkdUSDsgLyogRWF0IGl0ICovCi0JbGVuIC09IE1TX0FVVEhfUkVTUE9OU0VfTEVOR1RIOwotCWlmICgobGVuID49IDMpICYmICFzdHJuY21wKChjaGFyICopbXNnLCAiIE09IiwgMykpIHsKLQkJbXNnICs9IDM7IC8qIEVhdCB0aGUgZGVsaW1pdGVyICovCi0JfSBlbHNlIGlmIChsZW4pIHsKLQkJLyogUGFja2V0IGhhcyBleHRyYSB0ZXh0IHdoaWNoIGRvZXMgbm90IGJlZ2luICIgTT0iICovCi0JCWVycm9yKCJNUy1DSEFQdjIgU3VjY2VzcyBwYWNrZXQgaXMgYmFkbHkgZm9ybWVkLiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGFwbXNfaGFuZGxlX2ZhaWx1cmUodW5zaWduZWQgY2hhciAqaW5wLCBpbnQgbGVuKQotewotCWludCBlcnI7Ci0JY2hhciAqcCwgKm1zZzsKLQotCS8qIFdlIHdhbnQgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGZvciBzdHJ4eHgoKS4gKi8KLQltc2cgPSBtYWxsb2MobGVuICsgMSk7Ci0JaWYgKCFtc2cpIHsKLQkJbm90aWNlKCJPdXQgb2YgbWVtb3J5IGluIGNoYXBtc19oYW5kbGVfZmFpbHVyZSIpOwotCQlyZXR1cm47Ci0JfQotCUJDT1BZKGlucCwgbXNnLCBsZW4pOwotCW1zZ1tsZW5dID0gMDsKLQlwID0gbXNnOwotCi0JLyoKLQkgKiBEZWFsIHdpdGggTVMtQ0hBUCBmb3JtYXR0ZWQgZmFpbHVyZSBtZXNzYWdlczsganVzdCBwcmludCB0aGUKLQkgKiBNPTxtZXNzYWdlPiBwYXJ0IChpZiBhbnkpLiAgRm9yIE1TLUNIQVAgd2UncmUgbm90IHJlYWxseSBzdXBwb3NlZAotCSAqIHRvIHVzZSBNPTxtZXNzYWdlPiwgYnV0IGl0IHNob3VsZG4ndCBodXJ0LiAgU2VlCi0JICogY2hhcG1zWzJdX3ZlcmlmeV9yZXNwb25zZS4KLQkgKi8KLQlpZiAoIXN0cm5jbXAocCwgIkU9IiwgMikpCi0JCWVyciA9IHN0cnRvbChwKzIsIE5VTEwsIDEwKTsgLyogUmVtZW1iZXIgdGhlIGVycm9yIGNvZGUuICovCi0JZWxzZQotCQlnb3RvIHByaW50X21zZzsgLyogTWVzc2FnZSBpcyBiYWRseSBmb3JtYXR0ZWQuICovCi0KLQlpZiAobGVuICYmICgocCA9IHN0cnN0cihwLCAiIE09IikpICE9IE5VTEwpKSB7Ci0JCS8qIE09PG1lc3NhZ2U+IGZpZWxkIGZvdW5kLiAqLwotCQlwICs9IDM7Ci0JfSBlbHNlIHsKLQkJLyogTm8gTT08bWVzc2FnZT47IHVzZSB0aGUgZXJyb3IgY29kZS4gKi8KLQkJc3dpdGNoIChlcnIpIHsKLQkJY2FzZSBNU19DSEFQX0VSUk9SX1JFU1RSSUNURURfTE9HT05fSE9VUlM6Ci0JCQlwID0gIkU9NjQ2IFJlc3RyaWN0ZWQgbG9nb24gaG91cnMiOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNU19DSEFQX0VSUk9SX0FDQ1RfRElTQUJMRUQ6Ci0JCQlwID0gIkU9NjQ3IEFjY291bnQgZGlzYWJsZWQiOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNU19DSEFQX0VSUk9SX1BBU1NXRF9FWFBJUkVEOgotCQkJcCA9ICJFPTY0OCBQYXNzd29yZCBleHBpcmVkIjsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTVNfQ0hBUF9FUlJPUl9OT19ESUFMSU5fUEVSTUlTU0lPTjoKLQkJCXAgPSAiRT02NDkgTm8gZGlhbGluIHBlcm1pc3Npb24iOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNU19DSEFQX0VSUk9SX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkU6Ci0JCQlwID0gIkU9NjkxIEF1dGhlbnRpY2F0aW9uIGZhaWx1cmUiOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNU19DSEFQX0VSUk9SX0NIQU5HSU5HX1BBU1NXT1JEOgotCQkJLyogU2hvdWxkIG5ldmVyIHNlZSB0aGlzLCB3ZSBkb24ndCBzdXBwb3J0IENoYW5nZSBQYXNzd29yZC4gKi8KLQkJCXAgPSAiRT03MDkgRXJyb3IgY2hhbmdpbmcgcGFzc3dvcmQiOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWZyZWUobXNnKTsKLQkJCWVycm9yKCJVbmtub3duIE1TLUNIQVAgYXV0aGVudGljYXRpb24gZmFpbHVyZTogJS4qdiIsCi0JCQkgICAgICBsZW4sIGlucCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci1wcmludF9tc2c6Ci0JaWYgKHAgIT0gTlVMTCkKLQkJZXJyb3IoIk1TLUNIQVAgYXV0aGVudGljYXRpb24gZmFpbGVkOiAldiIsIHApOwotCWZyZWUobXNnKTsKLX0KLQotc3RhdGljIHZvaWQKLUNoYWxsZW5nZVJlc3BvbnNlKHVfY2hhciAqY2hhbGxlbmdlLAotCQkgIHVfY2hhciBQYXNzd29yZEhhc2hbTUQ0X1NJR05BVFVSRV9TSVpFXSwKLQkJICB1X2NoYXIgcmVzcG9uc2VbMjRdKQotewotICAgIHVfY2hhciAgICBaUGFzc3dvcmRIYXNoWzIxXTsKLQotICAgIEJaRVJPKFpQYXNzd29yZEhhc2gsIHNpemVvZihaUGFzc3dvcmRIYXNoKSk7Ci0gICAgQkNPUFkoUGFzc3dvcmRIYXNoLCBaUGFzc3dvcmRIYXNoLCBNRDRfU0lHTkFUVVJFX1NJWkUpOwotCi0jaWYgMAotICAgIGRiZ2xvZygiQ2hhbGxlbmdlUmVzcG9uc2UgLSBaUGFzc3dvcmRIYXNoICUuKkIiLAotCSAgIHNpemVvZihaUGFzc3dvcmRIYXNoKSwgWlBhc3N3b3JkSGFzaCk7Ci0jZW5kaWYKLQotICAgICh2b2lkKSBEZXNTZXRrZXkoWlBhc3N3b3JkSGFzaCArIDApOwotICAgIERlc0VuY3J5cHQoY2hhbGxlbmdlLCByZXNwb25zZSArIDApOwotICAgICh2b2lkKSBEZXNTZXRrZXkoWlBhc3N3b3JkSGFzaCArIDcpOwotICAgIERlc0VuY3J5cHQoY2hhbGxlbmdlLCByZXNwb25zZSArIDgpOwotICAgICh2b2lkKSBEZXNTZXRrZXkoWlBhc3N3b3JkSGFzaCArIDE0KTsKLSAgICBEZXNFbmNyeXB0KGNoYWxsZW5nZSwgcmVzcG9uc2UgKyAxNik7Ci0KLSNpZiAwCi0gICAgZGJnbG9nKCJDaGFsbGVuZ2VSZXNwb25zZSAtIHJlc3BvbnNlICUuMjRCIiwgcmVzcG9uc2UpOwotI2VuZGlmCi19Ci0KLXZvaWQKLUNoYWxsZW5nZUhhc2godV9jaGFyIFBlZXJDaGFsbGVuZ2VbMTZdLCB1X2NoYXIgKnJjaGFsbGVuZ2UsCi0JICAgICAgY2hhciAqdXNlcm5hbWUsIHVfY2hhciBDaGFsbGVuZ2VbOF0pCi0gICAgCi17Ci0gICAgU0hBMV9DVFgJc2hhMUNvbnRleHQ7Ci0gICAgdV9jaGFyCXNoYTFIYXNoW1NIQTFfU0lHTkFUVVJFX1NJWkVdOwotICAgIGNoYXIJKnVzZXI7Ci0KLSAgICAvKiByZW1vdmUgZG9tYWluIGZyb20gImRvbWFpblx1c2VybmFtZSIgKi8KLSAgICBpZiAoKHVzZXIgPSBzdHJyY2hyKHVzZXJuYW1lLCAnXFwnKSkgIT0gTlVMTCkKLQkrK3VzZXI7Ci0gICAgZWxzZQotCXVzZXIgPSB1c2VybmFtZTsKLQotICAgIFNIQTFfSW5pdCgmc2hhMUNvbnRleHQpOwotICAgIFNIQTFfVXBkYXRlKCZzaGExQ29udGV4dCwgUGVlckNoYWxsZW5nZSwgMTYpOwotICAgIFNIQTFfVXBkYXRlKCZzaGExQ29udGV4dCwgcmNoYWxsZW5nZSwgMTYpOwotICAgIFNIQTFfVXBkYXRlKCZzaGExQ29udGV4dCwgKHVuc2lnbmVkIGNoYXIgKil1c2VyLCBzdHJsZW4odXNlcikpOwotICAgIFNIQTFfRmluYWwoc2hhMUhhc2gsICZzaGExQ29udGV4dCk7Ci0KLSAgICBCQ09QWShzaGExSGFzaCwgQ2hhbGxlbmdlLCA4KTsKLX0KLQotLyoKLSAqIENvbnZlcnQgdGhlIEFTQ0lJIHZlcnNpb24gb2YgdGhlIHBhc3N3b3JkIHRvIFVuaWNvZGUuCi0gKiBUaGlzIGltcGxpY2l0bHkgc3VwcG9ydHMgOC1iaXQgSVNPODg1OS8xIGNoYXJhY3RlcnMuCi0gKiBUaGlzIGdpdmVzIHVzIHRoZSBsaXR0bGUtZW5kaWFuIHJlcHJlc2VudGF0aW9uLCB3aGljaAotICogaXMgYXNzdW1lZCBieSBhbGwgTSQgQ0hBUCBSRkNzLiAgKFVuaWNvZGUgYnl0ZSBvcmRlcmluZwotICogaXMgbWFjaGluZS1kZXBlbmRlbnQuKQotICovCi1zdGF0aWMgdm9pZAotYXNjaWkydW5pY29kZShjaGFyIGFzY2lpW10sIGludCBhc2NpaV9sZW4sIHVfY2hhciB1bmljb2RlW10pCi17Ci0gICAgaW50IGk7Ci0KLSAgICBCWkVSTyh1bmljb2RlLCBhc2NpaV9sZW4gKiAyKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgYXNjaWlfbGVuOyBpKyspCi0JdW5pY29kZVtpICogMl0gPSAodV9jaGFyKSBhc2NpaVtpXTsKLX0KLQotc3RhdGljIHZvaWQKLU5UUGFzc3dvcmRIYXNoKHVfY2hhciAqc2VjcmV0LCBpbnQgc2VjcmV0X2xlbiwgdV9jaGFyIGhhc2hbTUQ0X1NJR05BVFVSRV9TSVpFXSkKLXsKLSNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKQotICAgIC8qIFdlIGxpbmsgd2l0aCBNRDQgcm91dGluZXMgaW4gb3BlbnNzbCwgd2UgaGF2ZSB0byB0YWtlIGJ5dGVzIGluc3RlYWQgKi8KLSAgICBpbnQJCQltZGxlbiA9IHNlY3JldF9sZW47Ci0jZWxzZQotI2lmZGVmIF9fTmV0QlNEX18KLSAgICAvKiBOZXRCU0QgdXNlcyB0aGUgbGliYyBtZDQgcm91dGluZXMgd2hpY2ggdGFrZSBieXRlcyBpbnN0ZWFkIG9mIGJpdHMgKi8KLSAgICBpbnQJCQltZGxlbiA9IHNlY3JldF9sZW47Ci0jZWxzZQotICAgIGludAkJCW1kbGVuID0gc2VjcmV0X2xlbiAqIDg7Ci0jZW5kaWYKLSNlbmRpZgotICAgIE1ENF9DVFgJCW1kNENvbnRleHQ7Ci0KLSAgICBNRDRJbml0KCZtZDRDb250ZXh0KTsKLSAgICAvKiBNRDRVcGRhdGUgY2FuIHRha2UgYXQgbW9zdCA2NCBieXRlcyBhdCBhIHRpbWUgKi8KLSAgICB3aGlsZSAobWRsZW4gPiA1MTIpIHsKLQlNRDRVcGRhdGUoJm1kNENvbnRleHQsIHNlY3JldCwgNTEyKTsKLQlzZWNyZXQgKz0gNjQ7Ci0JbWRsZW4gLT0gNTEyOwotICAgIH0KLSAgICBNRDRVcGRhdGUoJm1kNENvbnRleHQsIHNlY3JldCwgbWRsZW4pOwotICAgIE1ENEZpbmFsKGhhc2gsICZtZDRDb250ZXh0KTsKLQotfQotCi1zdGF0aWMgdm9pZAotQ2hhcE1TX05UKHVfY2hhciAqcmNoYWxsZW5nZSwgY2hhciAqc2VjcmV0LCBpbnQgc2VjcmV0X2xlbiwKLQkgIHVfY2hhciBOVFJlc3BvbnNlWzI0XSkKLXsKLSAgICB1X2NoYXIJdW5pY29kZVBhc3N3b3JkW01BWF9OVF9QQVNTV09SRCAqIDJdOwotICAgIHVfY2hhcglQYXNzd29yZEhhc2hbTUQ0X1NJR05BVFVSRV9TSVpFXTsKLQotICAgIC8qIEhhc2ggdGhlIFVuaWNvZGUgdmVyc2lvbiBvZiB0aGUgc2VjcmV0ICg9PSBwYXNzd29yZCkuICovCi0gICAgYXNjaWkydW5pY29kZShzZWNyZXQsIHNlY3JldF9sZW4sIHVuaWNvZGVQYXNzd29yZCk7Ci0gICAgTlRQYXNzd29yZEhhc2godW5pY29kZVBhc3N3b3JkLCBzZWNyZXRfbGVuICogMiwgUGFzc3dvcmRIYXNoKTsKLQotICAgIENoYWxsZW5nZVJlc3BvbnNlKHJjaGFsbGVuZ2UsIFBhc3N3b3JkSGFzaCwgTlRSZXNwb25zZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1DaGFwTVMyX05UKHVfY2hhciAqcmNoYWxsZW5nZSwgdV9jaGFyIFBlZXJDaGFsbGVuZ2VbMTZdLCBjaGFyICp1c2VybmFtZSwKLQkgICBjaGFyICpzZWNyZXQsIGludCBzZWNyZXRfbGVuLCB1X2NoYXIgTlRSZXNwb25zZVsyNF0pCi17Ci0gICAgdV9jaGFyCXVuaWNvZGVQYXNzd29yZFtNQVhfTlRfUEFTU1dPUkQgKiAyXTsKLSAgICB1X2NoYXIJUGFzc3dvcmRIYXNoW01ENF9TSUdOQVRVUkVfU0laRV07Ci0gICAgdV9jaGFyCUNoYWxsZW5nZVs4XTsKLQotICAgIENoYWxsZW5nZUhhc2goUGVlckNoYWxsZW5nZSwgcmNoYWxsZW5nZSwgdXNlcm5hbWUsIENoYWxsZW5nZSk7Ci0KLSAgICAvKiBIYXNoIHRoZSBVbmljb2RlIHZlcnNpb24gb2YgdGhlIHNlY3JldCAoPT0gcGFzc3dvcmQpLiAqLwotICAgIGFzY2lpMnVuaWNvZGUoc2VjcmV0LCBzZWNyZXRfbGVuLCB1bmljb2RlUGFzc3dvcmQpOwotICAgIE5UUGFzc3dvcmRIYXNoKHVuaWNvZGVQYXNzd29yZCwgc2VjcmV0X2xlbiAqIDIsIFBhc3N3b3JkSGFzaCk7Ci0KLSAgICBDaGFsbGVuZ2VSZXNwb25zZShDaGFsbGVuZ2UsIFBhc3N3b3JkSGFzaCwgTlRSZXNwb25zZSk7Ci19Ci0KLSNpZmRlZiBNU0xBTk1BTgotc3RhdGljIHVfY2hhciAqU3RkVGV4dCA9ICh1X2NoYXIgKikiS0dTIUAjJCUiOyAvKiBrZXkgZnJvbSByYXNhcGkzMi5kbGwgKi8KLQotc3RhdGljIHZvaWQKLUNoYXBNU19MQU5NYW4odV9jaGFyICpyY2hhbGxlbmdlLCBjaGFyICpzZWNyZXQsIGludCBzZWNyZXRfbGVuLAotCSAgICAgIHVuc2lnbmVkIGNoYXIgKnJlc3BvbnNlKQotewotICAgIGludAkJCWk7Ci0gICAgdV9jaGFyCQlVY2FzZVBhc3N3b3JkW01BWF9OVF9QQVNTV09SRF07IC8qIG1heCBpcyBhY3R1YWxseSAxNCAqLwotICAgIHVfY2hhcgkJUGFzc3dvcmRIYXNoW01ENF9TSUdOQVRVUkVfU0laRV07Ci0KLSAgICAvKiBMQU5NYW4gcGFzc3dvcmQgaXMgY2FzZSBpbnNlbnNpdGl2ZSAqLwotICAgIEJaRVJPKFVjYXNlUGFzc3dvcmQsIHNpemVvZihVY2FzZVBhc3N3b3JkKSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IHNlY3JldF9sZW47IGkrKykKLSAgICAgICBVY2FzZVBhc3N3b3JkW2ldID0gKHVfY2hhcil0b3VwcGVyKHNlY3JldFtpXSk7Ci0gICAgKHZvaWQpIERlc1NldGtleShVY2FzZVBhc3N3b3JkICsgMCk7Ci0gICAgRGVzRW5jcnlwdCggU3RkVGV4dCwgUGFzc3dvcmRIYXNoICsgMCApOwotICAgICh2b2lkKSBEZXNTZXRrZXkoVWNhc2VQYXNzd29yZCArIDcpOwotICAgIERlc0VuY3J5cHQoIFN0ZFRleHQsIFBhc3N3b3JkSGFzaCArIDggKTsKLSAgICBDaGFsbGVuZ2VSZXNwb25zZShyY2hhbGxlbmdlLCBQYXNzd29yZEhhc2gsICZyZXNwb25zZVtNU19DSEFQX0xBTk1BTlJFU1BdKTsKLX0KLSNlbmRpZgotCi0KLXZvaWQKLUdlbmVyYXRlQXV0aGVudGljYXRvclJlc3BvbnNlKHVfY2hhciBQYXNzd29yZEhhc2hIYXNoW01ENF9TSUdOQVRVUkVfU0laRV0sCi0JCQkgICAgICB1X2NoYXIgTlRSZXNwb25zZVsyNF0sIHVfY2hhciBQZWVyQ2hhbGxlbmdlWzE2XSwKLQkJCSAgICAgIHVfY2hhciAqcmNoYWxsZW5nZSwgY2hhciAqdXNlcm5hbWUsCi0JCQkgICAgICB1X2NoYXIgYXV0aFJlc3BvbnNlW01TX0FVVEhfUkVTUE9OU0VfTEVOR1RIKzFdKQotewotICAgIC8qCi0gICAgICogIk1hZ2ljIiBjb25zdGFudHMgdXNlZCBpbiByZXNwb25zZSBnZW5lcmF0aW9uLCBmcm9tIFJGQyAyNzU5LgotICAgICAqLwotICAgIHVfY2hhciBNYWdpYzFbMzldID0gLyogIk1hZ2ljIHNlcnZlciB0byBjbGllbnQgc2lnbmluZyBjb25zdGFudCIgKi8KLQl7IDB4NEQsIDB4NjEsIDB4NjcsIDB4NjksIDB4NjMsIDB4MjAsIDB4NzMsIDB4NjUsIDB4NzIsIDB4NzYsCi0JICAweDY1LCAweDcyLCAweDIwLCAweDc0LCAweDZGLCAweDIwLCAweDYzLCAweDZDLCAweDY5LCAweDY1LAotCSAgMHg2RSwgMHg3NCwgMHgyMCwgMHg3MywgMHg2OSwgMHg2NywgMHg2RSwgMHg2OSwgMHg2RSwgMHg2NywKLQkgIDB4MjAsIDB4NjMsIDB4NkYsIDB4NkUsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NkUsIDB4NzQgfTsKLSAgICB1X2NoYXIgTWFnaWMyWzQxXSA9IC8qICJQYWQgdG8gbWFrZSBpdCBkbyBtb3JlIHRoYW4gb25lIGl0ZXJhdGlvbiIgKi8KLQl7IDB4NTAsIDB4NjEsIDB4NjQsIDB4MjAsIDB4NzQsIDB4NkYsIDB4MjAsIDB4NkQsIDB4NjEsIDB4NkIsCi0JICAweDY1LCAweDIwLCAweDY5LCAweDc0LCAweDIwLCAweDY0LCAweDZGLCAweDIwLCAweDZELCAweDZGLAotCSAgMHg3MiwgMHg2NSwgMHgyMCwgMHg3NCwgMHg2OCwgMHg2MSwgMHg2RSwgMHgyMCwgMHg2RiwgMHg2RSwKLQkgIDB4NjUsIDB4MjAsIDB4NjksIDB4NzQsIDB4NjUsIDB4NzIsIDB4NjEsIDB4NzQsIDB4NjksIDB4NkYsCi0JICAweDZFIH07Ci0KLSAgICBpbnQJCWk7Ci0gICAgU0hBMV9DVFgJc2hhMUNvbnRleHQ7Ci0gICAgdV9jaGFyCURpZ2VzdFtTSEExX1NJR05BVFVSRV9TSVpFXTsKLSAgICB1X2NoYXIJQ2hhbGxlbmdlWzhdOwotCi0gICAgU0hBMV9Jbml0KCZzaGExQ29udGV4dCk7Ci0gICAgU0hBMV9VcGRhdGUoJnNoYTFDb250ZXh0LCBQYXNzd29yZEhhc2hIYXNoLCBNRDRfU0lHTkFUVVJFX1NJWkUpOwotICAgIFNIQTFfVXBkYXRlKCZzaGExQ29udGV4dCwgTlRSZXNwb25zZSwgMjQpOwotICAgIFNIQTFfVXBkYXRlKCZzaGExQ29udGV4dCwgTWFnaWMxLCBzaXplb2YoTWFnaWMxKSk7Ci0gICAgU0hBMV9GaW5hbChEaWdlc3QsICZzaGExQ29udGV4dCk7Ci0KLSAgICBDaGFsbGVuZ2VIYXNoKFBlZXJDaGFsbGVuZ2UsIHJjaGFsbGVuZ2UsIHVzZXJuYW1lLCBDaGFsbGVuZ2UpOwotCi0gICAgU0hBMV9Jbml0KCZzaGExQ29udGV4dCk7Ci0gICAgU0hBMV9VcGRhdGUoJnNoYTFDb250ZXh0LCBEaWdlc3QsIHNpemVvZihEaWdlc3QpKTsKLSAgICBTSEExX1VwZGF0ZSgmc2hhMUNvbnRleHQsIENoYWxsZW5nZSwgc2l6ZW9mKENoYWxsZW5nZSkpOwotICAgIFNIQTFfVXBkYXRlKCZzaGExQ29udGV4dCwgTWFnaWMyLCBzaXplb2YoTWFnaWMyKSk7Ci0gICAgU0hBMV9GaW5hbChEaWdlc3QsICZzaGExQ29udGV4dCk7Ci0KLSAgICAvKiBDb252ZXJ0IHRvIEFTQ0lJIGhleCBzdHJpbmcuICovCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWCgoTVNfQVVUSF9SRVNQT05TRV9MRU5HVEggLyAyKSwgc2l6ZW9mKERpZ2VzdCkpOyBpKyspCi0Jc3ByaW50ZigoY2hhciAqKSZhdXRoUmVzcG9uc2VbaSAqIDJdLCAiJTAyWCIsIERpZ2VzdFtpXSk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLUdlbmVyYXRlQXV0aGVudGljYXRvclJlc3BvbnNlUGxhaW4KLQkJKGNoYXIgKnNlY3JldCwgaW50IHNlY3JldF9sZW4sCi0JCSB1X2NoYXIgTlRSZXNwb25zZVsyNF0sIHVfY2hhciBQZWVyQ2hhbGxlbmdlWzE2XSwKLQkJIHVfY2hhciAqcmNoYWxsZW5nZSwgY2hhciAqdXNlcm5hbWUsCi0JCSB1X2NoYXIgYXV0aFJlc3BvbnNlW01TX0FVVEhfUkVTUE9OU0VfTEVOR1RIKzFdKQotewotICAgIHVfY2hhcgl1bmljb2RlUGFzc3dvcmRbTUFYX05UX1BBU1NXT1JEICogMl07Ci0gICAgdV9jaGFyCVBhc3N3b3JkSGFzaFtNRDRfU0lHTkFUVVJFX1NJWkVdOwotICAgIHVfY2hhcglQYXNzd29yZEhhc2hIYXNoW01ENF9TSUdOQVRVUkVfU0laRV07Ci0KLSAgICAvKiBIYXNoICh4MikgdGhlIFVuaWNvZGUgdmVyc2lvbiBvZiB0aGUgc2VjcmV0ICg9PSBwYXNzd29yZCkuICovCi0gICAgYXNjaWkydW5pY29kZShzZWNyZXQsIHNlY3JldF9sZW4sIHVuaWNvZGVQYXNzd29yZCk7Ci0gICAgTlRQYXNzd29yZEhhc2godW5pY29kZVBhc3N3b3JkLCBzZWNyZXRfbGVuICogMiwgUGFzc3dvcmRIYXNoKTsKLSAgICBOVFBhc3N3b3JkSGFzaChQYXNzd29yZEhhc2gsIHNpemVvZihQYXNzd29yZEhhc2gpLAotCQkgICBQYXNzd29yZEhhc2hIYXNoKTsKLQotICAgIEdlbmVyYXRlQXV0aGVudGljYXRvclJlc3BvbnNlKFBhc3N3b3JkSGFzaEhhc2gsIE5UUmVzcG9uc2UsIFBlZXJDaGFsbGVuZ2UsCi0JCQkJICByY2hhbGxlbmdlLCB1c2VybmFtZSwgYXV0aFJlc3BvbnNlKTsKLX0KLQotCi0jaWZkZWYgTVBQRQotLyoKLSAqIFNldCBtcHBlX3h4eHhfa2V5IGZyb20gdGhlIE5UUGFzc3dvcmRIYXNoSGFzaC4KLSAqIFJGQyAyNTQ4IChSQURJVVMgc3VwcG9ydCkgcmVxdWlyZXMgdXMgdG8gZXhwb3J0IHRoaXMgZnVuY3Rpb24gKHVnaCkuCi0gKi8KLXZvaWQKLW1wcGVfc2V0X2tleXModV9jaGFyICpyY2hhbGxlbmdlLCB1X2NoYXIgUGFzc3dvcmRIYXNoSGFzaFtNRDRfU0lHTkFUVVJFX1NJWkVdKQotewotICAgIFNIQTFfQ1RYCXNoYTFDb250ZXh0OwotICAgIHVfY2hhcglEaWdlc3RbU0hBMV9TSUdOQVRVUkVfU0laRV07CS8qID49IE1QUEVfTUFYX0tFWV9MRU4gKi8KLQotICAgIFNIQTFfSW5pdCgmc2hhMUNvbnRleHQpOwotICAgIFNIQTFfVXBkYXRlKCZzaGExQ29udGV4dCwgUGFzc3dvcmRIYXNoSGFzaCwgTUQ0X1NJR05BVFVSRV9TSVpFKTsKLSAgICBTSEExX1VwZGF0ZSgmc2hhMUNvbnRleHQsIFBhc3N3b3JkSGFzaEhhc2gsIE1ENF9TSUdOQVRVUkVfU0laRSk7Ci0gICAgU0hBMV9VcGRhdGUoJnNoYTFDb250ZXh0LCByY2hhbGxlbmdlLCA4KTsKLSAgICBTSEExX0ZpbmFsKERpZ2VzdCwgJnNoYTFDb250ZXh0KTsKLQotICAgIC8qIFNhbWUga2V5IGluIGJvdGggZGlyZWN0aW9ucy4gKi8KLSAgICBCQ09QWShEaWdlc3QsIG1wcGVfc2VuZF9rZXksIHNpemVvZihtcHBlX3NlbmRfa2V5KSk7Ci0gICAgQkNPUFkoRGlnZXN0LCBtcHBlX3JlY3Zfa2V5LCBzaXplb2YobXBwZV9yZWN2X2tleSkpOwotCi0gICAgbXBwZV9rZXlzX3NldCA9IDE7Ci19Ci0KLS8qCi0gKiBTZXQgbXBwZV94eHh4X2tleSBmcm9tIE1TLUNIQVAgY3JlZGVudGlhbHMuIChzZWUgUkZDIDMwNzkpCi0gKi8KLXN0YXRpYyB2b2lkCi1TZXRfU3RhcnRfS2V5KHVfY2hhciAqcmNoYWxsZW5nZSwgY2hhciAqc2VjcmV0LCBpbnQgc2VjcmV0X2xlbikKLXsKLSAgICB1X2NoYXIJdW5pY29kZVBhc3N3b3JkW01BWF9OVF9QQVNTV09SRCAqIDJdOwotICAgIHVfY2hhcglQYXNzd29yZEhhc2hbTUQ0X1NJR05BVFVSRV9TSVpFXTsKLSAgICB1X2NoYXIJUGFzc3dvcmRIYXNoSGFzaFtNRDRfU0lHTkFUVVJFX1NJWkVdOwotCi0gICAgLyogSGFzaCAoeDIpIHRoZSBVbmljb2RlIHZlcnNpb24gb2YgdGhlIHNlY3JldCAoPT0gcGFzc3dvcmQpLiAqLwotICAgIGFzY2lpMnVuaWNvZGUoc2VjcmV0LCBzZWNyZXRfbGVuLCB1bmljb2RlUGFzc3dvcmQpOwotICAgIE5UUGFzc3dvcmRIYXNoKHVuaWNvZGVQYXNzd29yZCwgc2VjcmV0X2xlbiAqIDIsIFBhc3N3b3JkSGFzaCk7Ci0gICAgTlRQYXNzd29yZEhhc2goUGFzc3dvcmRIYXNoLCBzaXplb2YoUGFzc3dvcmRIYXNoKSwgUGFzc3dvcmRIYXNoSGFzaCk7Ci0KLSAgICBtcHBlX3NldF9rZXlzKHJjaGFsbGVuZ2UsIFBhc3N3b3JkSGFzaEhhc2gpOwotfQotCi0vKgotICogU2V0IG1wcGVfeHh4eF9rZXkgZnJvbSBNUy1DSEFQdjIgY3JlZGVudGlhbHMuIChzZWUgUkZDIDMwNzkpCi0gKgotICogVGhpcyBoZWxwZXIgZnVuY3Rpb24gdXNlZCBpbiB0aGUgV2luYmluZCBtb2R1bGUsIHdoaWNoIGdldHMgdGhlCi0gKiBOVEhhc2hIYXNoIGZyb20gdGhlIHNlcnZlci4KLSAqLwotdm9pZAotbXBwZV9zZXRfa2V5czIodV9jaGFyIFBhc3N3b3JkSGFzaEhhc2hbTUQ0X1NJR05BVFVSRV9TSVpFXSwKLQkgICAgICAgdV9jaGFyIE5UUmVzcG9uc2VbMjRdLCBpbnQgSXNTZXJ2ZXIpCi17Ci0gICAgU0hBMV9DVFgJc2hhMUNvbnRleHQ7Ci0gICAgdV9jaGFyCU1hc3RlcktleVtTSEExX1NJR05BVFVSRV9TSVpFXTsJLyogPj0gTVBQRV9NQVhfS0VZX0xFTiAqLwotICAgIHVfY2hhcglEaWdlc3RbU0hBMV9TSUdOQVRVUkVfU0laRV07CS8qID49IE1QUEVfTUFYX0tFWV9MRU4gKi8KLQotICAgIHVfY2hhciBTSEFwYWQxWzQwXSA9Ci0JeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07Ci0gICAgdV9jaGFyIFNIQXBhZDJbNDBdID0KLQl7IDB4ZjIsIDB4ZjIsIDB4ZjIsIDB4ZjIsIDB4ZjIsIDB4ZjIsIDB4ZjIsIDB4ZjIsIDB4ZjIsIDB4ZjIsCi0JICAweGYyLCAweGYyLCAweGYyLCAweGYyLCAweGYyLCAweGYyLCAweGYyLCAweGYyLCAweGYyLCAweGYyLAotCSAgMHhmMiwgMHhmMiwgMHhmMiwgMHhmMiwgMHhmMiwgMHhmMiwgMHhmMiwgMHhmMiwgMHhmMiwgMHhmMiwKLQkgIDB4ZjIsIDB4ZjIsIDB4ZjIsIDB4ZjIsIDB4ZjIsIDB4ZjIsIDB4ZjIsIDB4ZjIsIDB4ZjIsIDB4ZjIgfTsKLQotICAgIC8qICJUaGlzIGlzIHRoZSBNUFBFIE1hc3RlciBLZXkiICovCi0gICAgdV9jaGFyIE1hZ2ljMVsyN10gPQotCXsgMHg1NCwgMHg2OCwgMHg2OSwgMHg3MywgMHgyMCwgMHg2OSwgMHg3MywgMHgyMCwgMHg3NCwKLQkgIDB4NjgsIDB4NjUsIDB4MjAsIDB4NGQsIDB4NTAsIDB4NTAsIDB4NDUsIDB4MjAsIDB4NGQsCi0JICAweDYxLCAweDczLCAweDc0LCAweDY1LCAweDcyLCAweDIwLCAweDRiLCAweDY1LCAweDc5IH07Ci0gICAgLyogIk9uIHRoZSBjbGllbnQgc2lkZSwgdGhpcyBpcyB0aGUgc2VuZCBrZXk7ICIKLSAgICAgICAib24gdGhlIHNlcnZlciBzaWRlLCBpdCBpcyB0aGUgcmVjZWl2ZSBrZXkuIiAqLwotICAgIHVfY2hhciBNYWdpYzJbODRdID0KLQl7IDB4NGYsIDB4NmUsIDB4MjAsIDB4NzQsIDB4NjgsIDB4NjUsIDB4MjAsIDB4NjMsIDB4NmMsIDB4NjksCi0JICAweDY1LCAweDZlLCAweDc0LCAweDIwLCAweDczLCAweDY5LCAweDY0LCAweDY1LCAweDJjLCAweDIwLAotCSAgMHg3NCwgMHg2OCwgMHg2OSwgMHg3MywgMHgyMCwgMHg2OSwgMHg3MywgMHgyMCwgMHg3NCwgMHg2OCwKLQkgIDB4NjUsIDB4MjAsIDB4NzMsIDB4NjUsIDB4NmUsIDB4NjQsIDB4MjAsIDB4NmIsIDB4NjUsIDB4NzksCi0JICAweDNiLCAweDIwLCAweDZmLCAweDZlLCAweDIwLCAweDc0LCAweDY4LCAweDY1LCAweDIwLCAweDczLAotCSAgMHg2NSwgMHg3MiwgMHg3NiwgMHg2NSwgMHg3MiwgMHgyMCwgMHg3MywgMHg2OSwgMHg2NCwgMHg2NSwKLQkgIDB4MmMsIDB4MjAsIDB4NjksIDB4NzQsIDB4MjAsIDB4NjksIDB4NzMsIDB4MjAsIDB4NzQsIDB4NjgsCi0JICAweDY1LCAweDIwLCAweDcyLCAweDY1LCAweDYzLCAweDY1LCAweDY5LCAweDc2LCAweDY1LCAweDIwLAotCSAgMHg2YiwgMHg2NSwgMHg3OSwgMHgyZSB9OwotICAgIC8qICJPbiB0aGUgY2xpZW50IHNpZGUsIHRoaXMgaXMgdGhlIHJlY2VpdmUga2V5OyAiCi0gICAgICAgIm9uIHRoZSBzZXJ2ZXIgc2lkZSwgaXQgaXMgdGhlIHNlbmQga2V5LiIgKi8KLSAgICB1X2NoYXIgTWFnaWMzWzg0XSA9Ci0JeyAweDRmLCAweDZlLCAweDIwLCAweDc0LCAweDY4LCAweDY1LCAweDIwLCAweDYzLCAweDZjLCAweDY5LAotCSAgMHg2NSwgMHg2ZSwgMHg3NCwgMHgyMCwgMHg3MywgMHg2OSwgMHg2NCwgMHg2NSwgMHgyYywgMHgyMCwKLQkgIDB4NzQsIDB4NjgsIDB4NjksIDB4NzMsIDB4MjAsIDB4NjksIDB4NzMsIDB4MjAsIDB4NzQsIDB4NjgsCi0JICAweDY1LCAweDIwLCAweDcyLCAweDY1LCAweDYzLCAweDY1LCAweDY5LCAweDc2LCAweDY1LCAweDIwLAotCSAgMHg2YiwgMHg2NSwgMHg3OSwgMHgzYiwgMHgyMCwgMHg2ZiwgMHg2ZSwgMHgyMCwgMHg3NCwgMHg2OCwKLQkgIDB4NjUsIDB4MjAsIDB4NzMsIDB4NjUsIDB4NzIsIDB4NzYsIDB4NjUsIDB4NzIsIDB4MjAsIDB4NzMsCi0JICAweDY5LCAweDY0LCAweDY1LCAweDJjLCAweDIwLCAweDY5LCAweDc0LCAweDIwLCAweDY5LCAweDczLAotCSAgMHgyMCwgMHg3NCwgMHg2OCwgMHg2NSwgMHgyMCwgMHg3MywgMHg2NSwgMHg2ZSwgMHg2NCwgMHgyMCwKLQkgIDB4NmIsIDB4NjUsIDB4NzksIDB4MmUgfTsKLSAgICB1X2NoYXIgKnM7Ci0KLSAgICBTSEExX0luaXQoJnNoYTFDb250ZXh0KTsKLSAgICBTSEExX1VwZGF0ZSgmc2hhMUNvbnRleHQsIFBhc3N3b3JkSGFzaEhhc2gsIE1ENF9TSUdOQVRVUkVfU0laRSk7Ci0gICAgU0hBMV9VcGRhdGUoJnNoYTFDb250ZXh0LCBOVFJlc3BvbnNlLCAyNCk7Ci0gICAgU0hBMV9VcGRhdGUoJnNoYTFDb250ZXh0LCBNYWdpYzEsIHNpemVvZihNYWdpYzEpKTsKLSAgICBTSEExX0ZpbmFsKE1hc3RlcktleSwgJnNoYTFDb250ZXh0KTsKLQotICAgIC8qCi0gICAgICogZ2VuZXJhdGUgc2VuZCBrZXkKLSAgICAgKi8KLSAgICBpZiAoSXNTZXJ2ZXIpCi0JcyA9IE1hZ2ljMzsKLSAgICBlbHNlCi0JcyA9IE1hZ2ljMjsKLSAgICBTSEExX0luaXQoJnNoYTFDb250ZXh0KTsKLSAgICBTSEExX1VwZGF0ZSgmc2hhMUNvbnRleHQsIE1hc3RlcktleSwgMTYpOwotICAgIFNIQTFfVXBkYXRlKCZzaGExQ29udGV4dCwgU0hBcGFkMSwgc2l6ZW9mKFNIQXBhZDEpKTsKLSAgICBTSEExX1VwZGF0ZSgmc2hhMUNvbnRleHQsIHMsIDg0KTsKLSAgICBTSEExX1VwZGF0ZSgmc2hhMUNvbnRleHQsIFNIQXBhZDIsIHNpemVvZihTSEFwYWQyKSk7Ci0gICAgU0hBMV9GaW5hbChEaWdlc3QsICZzaGExQ29udGV4dCk7Ci0KLSAgICBCQ09QWShEaWdlc3QsIG1wcGVfc2VuZF9rZXksIHNpemVvZihtcHBlX3NlbmRfa2V5KSk7Ci0KLSAgICAvKgotICAgICAqIGdlbmVyYXRlIHJlY3Yga2V5Ci0gICAgICovCi0gICAgaWYgKElzU2VydmVyKQotCXMgPSBNYWdpYzI7Ci0gICAgZWxzZQotCXMgPSBNYWdpYzM7Ci0gICAgU0hBMV9Jbml0KCZzaGExQ29udGV4dCk7Ci0gICAgU0hBMV9VcGRhdGUoJnNoYTFDb250ZXh0LCBNYXN0ZXJLZXksIDE2KTsKLSAgICBTSEExX1VwZGF0ZSgmc2hhMUNvbnRleHQsIFNIQXBhZDEsIHNpemVvZihTSEFwYWQxKSk7Ci0gICAgU0hBMV9VcGRhdGUoJnNoYTFDb250ZXh0LCBzLCA4NCk7Ci0gICAgU0hBMV9VcGRhdGUoJnNoYTFDb250ZXh0LCBTSEFwYWQyLCBzaXplb2YoU0hBcGFkMikpOwotICAgIFNIQTFfRmluYWwoRGlnZXN0LCAmc2hhMUNvbnRleHQpOwotCi0gICAgQkNPUFkoRGlnZXN0LCBtcHBlX3JlY3Zfa2V5LCBzaXplb2YobXBwZV9yZWN2X2tleSkpOwotCi0gICAgbXBwZV9rZXlzX3NldCA9IDE7Ci19Ci0KLS8qCi0gKiBTZXQgbXBwZV94eHh4X2tleSBmcm9tIE1TLUNIQVB2MiBjcmVkZW50aWFscy4gKHNlZSBSRkMgMzA3OSkKLSAqLwotc3RhdGljIHZvaWQKLVNldE1hc3RlcktleXMoY2hhciAqc2VjcmV0LCBpbnQgc2VjcmV0X2xlbiwgdV9jaGFyIE5UUmVzcG9uc2VbMjRdLCBpbnQgSXNTZXJ2ZXIpCi17Ci0gICAgdV9jaGFyCXVuaWNvZGVQYXNzd29yZFtNQVhfTlRfUEFTU1dPUkQgKiAyXTsKLSAgICB1X2NoYXIJUGFzc3dvcmRIYXNoW01ENF9TSUdOQVRVUkVfU0laRV07Ci0gICAgdV9jaGFyCVBhc3N3b3JkSGFzaEhhc2hbTUQ0X1NJR05BVFVSRV9TSVpFXTsKLSAgICAvKiBIYXNoICh4MikgdGhlIFVuaWNvZGUgdmVyc2lvbiBvZiB0aGUgc2VjcmV0ICg9PSBwYXNzd29yZCkuICovCi0gICAgYXNjaWkydW5pY29kZShzZWNyZXQsIHNlY3JldF9sZW4sIHVuaWNvZGVQYXNzd29yZCk7Ci0gICAgTlRQYXNzd29yZEhhc2godW5pY29kZVBhc3N3b3JkLCBzZWNyZXRfbGVuICogMiwgUGFzc3dvcmRIYXNoKTsKLSAgICBOVFBhc3N3b3JkSGFzaChQYXNzd29yZEhhc2gsIHNpemVvZihQYXNzd29yZEhhc2gpLCBQYXNzd29yZEhhc2hIYXNoKTsKLSAgICBtcHBlX3NldF9rZXlzMihQYXNzd29yZEhhc2hIYXNoLCBOVFJlc3BvbnNlLCBJc1NlcnZlcik7Ci19Ci0KLSNlbmRpZiAvKiBNUFBFICovCi0KLQotdm9pZAotQ2hhcE1TKHVfY2hhciAqcmNoYWxsZW5nZSwgY2hhciAqc2VjcmV0LCBpbnQgc2VjcmV0X2xlbiwKLSAgICAgICB1bnNpZ25lZCBjaGFyICpyZXNwb25zZSkKLXsKLSAgICBCWkVSTyhyZXNwb25zZSwgTVNfQ0hBUF9SRVNQT05TRV9MRU4pOwotCi0gICAgQ2hhcE1TX05UKHJjaGFsbGVuZ2UsIHNlY3JldCwgc2VjcmV0X2xlbiwgJnJlc3BvbnNlW01TX0NIQVBfTlRSRVNQXSk7Ci0KLSNpZmRlZiBNU0xBTk1BTgotICAgIENoYXBNU19MQU5NYW4ocmNoYWxsZW5nZSwgc2VjcmV0LCBzZWNyZXRfbGVuLAotCQkgICZyZXNwb25zZVtNU19DSEFQX0xBTk1BTlJFU1BdKTsKLQotICAgIC8qIHByZWZlcnJlZCBtZXRob2QgaXMgc2V0IGJ5IG9wdGlvbiAgKi8KLSAgICByZXNwb25zZVtNU19DSEFQX1VTRU5UXSA9ICFtc19sYW5tYW47Ci0jZWxzZQotICAgIHJlc3BvbnNlW01TX0NIQVBfVVNFTlRdID0gMTsKLSNlbmRpZgotCi0jaWZkZWYgTVBQRQotICAgIFNldF9TdGFydF9LZXkocmNoYWxsZW5nZSwgc2VjcmV0LCBzZWNyZXRfbGVuKTsKLSNlbmRpZgotfQotCi0KLS8qCi0gKiBJZiBQZWVyQ2hhbGxlbmdlIGlzIE5VTEwsIG9uZSBpcyBnZW5lcmF0ZWQgYW5kIHRoZSBQZWVyQ2hhbGxlbmdlCi0gKiBmaWVsZCBvZiByZXNwb25zZSBpcyBmaWxsZWQgaW4uICBDYWxsIHRoaXMgd2F5IHdoZW4gZ2VuZXJhdGluZyBhIHJlc3BvbnNlLgotICogSWYgUGVlckNoYWxsZW5nZSBpcyBzdXBwbGllZCwgaXQgaXMgY29waWVkIGludG8gdGhlIFBlZXJDaGFsbGVuZ2UgZmllbGQuCi0gKiBDYWxsIHRoaXMgd2F5IHdoZW4gdmVyaWZ5aW5nIGEgcmVzcG9uc2UgKG9yIGRlYnVnZ2luZykuCi0gKiBEbyBub3QgY2FsbCB3aXRoIFBlZXJDaGFsbGVuZ2UgPSByZXNwb25zZS4KLSAqCi0gKiBUaGUgUGVlckNoYWxsZW5nZSBmaWVsZCBvZiByZXNwb25zZSBpcyB0aGVuIHVzZWQgZm9yIGNhbGN1bGF0aW9uIG9mIHRoZQotICogQXV0aGVudGljYXRvciBSZXNwb25zZS4KLSAqLwotdm9pZAotQ2hhcE1TMih1X2NoYXIgKnJjaGFsbGVuZ2UsIHVfY2hhciAqUGVlckNoYWxsZW5nZSwKLQljaGFyICp1c2VyLCBjaGFyICpzZWNyZXQsIGludCBzZWNyZXRfbGVuLCB1bnNpZ25lZCBjaGFyICpyZXNwb25zZSwKLQl1X2NoYXIgYXV0aFJlc3BvbnNlW10sIGludCBhdXRoZW50aWNhdG9yKQotewotICAgIC8qIEFSR1NVU0VEICovCi0gICAgdV9jaGFyICpwID0gJnJlc3BvbnNlW01TX0NIQVAyX1BFRVJfQ0hBTExFTkdFXTsKLSAgICBpbnQgaTsKLQotICAgIEJaRVJPKHJlc3BvbnNlLCBNU19DSEFQMl9SRVNQT05TRV9MRU4pOwotCi0gICAgLyogR2VuZXJhdGUgdGhlIFBlZXItQ2hhbGxlbmdlIGlmIHJlcXVlc3RlZCwgb3IgY29weSBpdCBpZiBzdXBwbGllZC4gKi8KLSAgICBpZiAoIVBlZXJDaGFsbGVuZ2UpCi0JZm9yIChpID0gMDsgaSA8IE1TX0NIQVAyX1BFRVJfQ0hBTF9MRU47IGkrKykKLQkgICAgKnArKyA9ICh1X2NoYXIpIChkcmFuZDQ4KCkgKiAweGZmKTsKLSAgICBlbHNlCi0JQkNPUFkoUGVlckNoYWxsZW5nZSwgJnJlc3BvbnNlW01TX0NIQVAyX1BFRVJfQ0hBTExFTkdFXSwKLQkgICAgICBNU19DSEFQMl9QRUVSX0NIQUxfTEVOKTsKLQotICAgIC8qIEdlbmVyYXRlIHRoZSBOVC1SZXNwb25zZSAqLwotICAgIENoYXBNUzJfTlQocmNoYWxsZW5nZSwgJnJlc3BvbnNlW01TX0NIQVAyX1BFRVJfQ0hBTExFTkdFXSwgdXNlciwKLQkgICAgICAgc2VjcmV0LCBzZWNyZXRfbGVuLCAmcmVzcG9uc2VbTVNfQ0hBUDJfTlRSRVNQXSk7Ci0KLSAgICAvKiBHZW5lcmF0ZSB0aGUgQXV0aGVudGljYXRvciBSZXNwb25zZS4gKi8KLSAgICBHZW5lcmF0ZUF1dGhlbnRpY2F0b3JSZXNwb25zZVBsYWluKHNlY3JldCwgc2VjcmV0X2xlbiwKLQkJCQkgICAgICAgJnJlc3BvbnNlW01TX0NIQVAyX05UUkVTUF0sCi0JCQkJICAgICAgICZyZXNwb25zZVtNU19DSEFQMl9QRUVSX0NIQUxMRU5HRV0sCi0JCQkJICAgICAgIHJjaGFsbGVuZ2UsIHVzZXIsIGF1dGhSZXNwb25zZSk7Ci0KLSNpZmRlZiBNUFBFCi0gICAgU2V0TWFzdGVyS2V5cyhzZWNyZXQsIHNlY3JldF9sZW4sCi0JCSAgJnJlc3BvbnNlW01TX0NIQVAyX05UUkVTUF0sIGF1dGhlbnRpY2F0b3IpOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBNUFBFCi0vKgotICogU2V0IE1QUEUgb3B0aW9ucyBmcm9tIHBsdWdpbnMuCi0gKi8KLXZvaWQKLXNldF9tcHBlX2VuY190eXBlcyhpbnQgcG9saWN5LCBpbnQgdHlwZXMpCi17Ci0gICAgLyogRWFybHkgZXhpdCBmb3IgdW5rbm93biBwb2xpY2llcy4gKi8KLSAgICBpZiAocG9saWN5ICE9IE1QUEVfRU5DX1BPTF9FTkNfQUxMT1dFRCB8fAotCXBvbGljeSAhPSBNUFBFX0VOQ19QT0xfRU5DX1JFUVVJUkVEKQotCXJldHVybjsKLQotICAgIC8qIERvbid0IG1vZGlmeSBNUFBFIGlmIGl0J3Mgb3B0aW9uYWwgYW5kIHdhc24ndCBhbHJlYWR5IGNvbmZpZ3VyZWQuICovCi0gICAgaWYgKHBvbGljeSA9PSBNUFBFX0VOQ19QT0xfRU5DX0FMTE9XRUQgJiYgIWNjcF93YW50b3B0aW9uc1swXS5tcHBlKQotCXJldHVybjsKLQotICAgIC8qCi0gICAgICogRGlzYWJsZSB1bmRlc2lyYWJsZSBlbmNyeXB0aW9uIHR5cGVzLiAgTm90ZSB0aGF0IHdlIGRvbid0IEVOQUJMRQotICAgICAqIGFueSBlbmNyeXB0aW9uIHR5cGVzLCB0byBhdm9pZCBvdmVycmlkaW5nIG1hbnVhbCBjb25maWd1cmF0aW9uLgotICAgICAqLwotICAgIHN3aXRjaCh0eXBlcykgewotCWNhc2UgTVBQRV9FTkNfVFlQRVNfUkM0XzQwOgotCSAgICBjY3Bfd2FudG9wdGlvbnNbMF0ubXBwZSAmPSB+TVBQRV9PUFRfMTI4OwkvKiBkaXNhYmxlIDEyOC1iaXQgKi8KLQkgICAgYnJlYWs7Ci0JY2FzZSBNUFBFX0VOQ19UWVBFU19SQzRfMTI4OgotCSAgICBjY3Bfd2FudG9wdGlvbnNbMF0ubXBwZSAmPSB+TVBQRV9PUFRfNDA7CS8qIGRpc2FibGUgNDAtYml0ICovCi0JICAgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAgIGJyZWFrOwotICAgIH0KLX0KLSNlbmRpZiAvKiBNUFBFICovCi0KLXN0YXRpYyBzdHJ1Y3QgY2hhcF9kaWdlc3RfdHlwZSBjaGFwbXNfZGlnZXN0ID0gewotCUNIQVBfTUlDUk9TT0ZULAkJLyogY29kZSAqLwotCWNoYXBtc19nZW5lcmF0ZV9jaGFsbGVuZ2UsCi0JY2hhcG1zX3ZlcmlmeV9yZXNwb25zZSwKLQljaGFwbXNfbWFrZV9yZXNwb25zZSwKLQlOVUxMLAkJCS8qIGNoZWNrX3N1Y2Nlc3MgKi8KLQljaGFwbXNfaGFuZGxlX2ZhaWx1cmUsCi19OwotCi1zdGF0aWMgc3RydWN0IGNoYXBfZGlnZXN0X3R5cGUgY2hhcG1zMl9kaWdlc3QgPSB7Ci0JQ0hBUF9NSUNST1NPRlRfVjIsCS8qIGNvZGUgKi8KLQljaGFwbXMyX2dlbmVyYXRlX2NoYWxsZW5nZSwKLQljaGFwbXMyX3ZlcmlmeV9yZXNwb25zZSwKLQljaGFwbXMyX21ha2VfcmVzcG9uc2UsCi0JY2hhcG1zMl9jaGVja19zdWNjZXNzLAotCWNoYXBtc19oYW5kbGVfZmFpbHVyZSwKLX07Ci0KLXZvaWQKLWNoYXBtc19pbml0KHZvaWQpCi17Ci0JY2hhcF9yZWdpc3Rlcl9kaWdlc3QoJmNoYXBtc19kaWdlc3QpOwotCWNoYXBfcmVnaXN0ZXJfZGlnZXN0KCZjaGFwbXMyX2RpZ2VzdCk7Ci0JYWRkX29wdGlvbnMoY2hhcG1zX29wdGlvbl9saXN0KTsKLX0KLQotI2VuZGlmIC8qIENIQVBNUyAqLwpkaWZmIC0tZ2l0IGEvcHBwZC9jaGFwX21zLmggYi9wcHBkL2NoYXBfbXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQwZDgwYS4uMDAwMDAwMAotLS0gYS9wcHBkL2NoYXBfbXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogY2hhcF9tcy5oIC0gQ2hhbGxlbmdlIEhhbmRzaGFrZSBBdXRoZW50aWNhdGlvbiBQcm90b2NvbCBkZWZpbml0aW9ucy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTUgRXJpYyBSb3NlbnF1aXN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgbmFtZShzKSBvZiB0aGUgYXV0aG9ycyBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhFIEFVVEhPUlMgT0YgVEhJUyBTT0ZUV0FSRSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotICogVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi0gKiBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi0gKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi0gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqCi0gKiAkSWQ6IGNoYXBfbXMuaCx2IDEuMTMgMjAwNC8xMS8xNSAyMjoxMzoyNiBwYXVsdXMgRXhwICQKLSAqLwotCi0jaWZuZGVmIF9fQ0hBUE1TX0lOQ0xVREVfXwotCi0jZGVmaW5lIE1ENF9TSUdOQVRVUkVfU0laRQkxNgkvKiAxNiBieXRlcyBpbiBhIE1ENCBtZXNzYWdlIGRpZ2VzdCAqLwotI2RlZmluZSBNQVhfTlRfUEFTU1dPUkQJCTI1NgkvKiBNYXggKFVuaWNvZGUpIGNoYXJzIGluIGFuIE5UIHBhc3MgKi8KLQotI2RlZmluZSBNU19DSEFQX1JFU1BPTlNFX0xFTgk0OQkvKiBSZXNwb25zZSBsZW5ndGggZm9yIE1TLUNIQVAgKi8KLSNkZWZpbmUgTVNfQ0hBUDJfUkVTUE9OU0VfTEVOCTQ5CS8qIFJlc3BvbnNlIGxlbmd0aCBmb3IgTVMtQ0hBUHYyICovCi0jZGVmaW5lIE1TX0FVVEhfUkVTUE9OU0VfTEVOR1RICTQwCS8qIE1TLUNIQVB2MiBhdXRoZW50aWNhdG9yIHJlc3BvbnNlLCAqLwotCQkJCQkvKiBhcyBBU0NJSSAqLwotCi0vKiBFPWVlZWVlZWVlZWUgZXJyb3IgY29kZXMgZm9yIE1TLUNIQVAgZmFpbHVyZSBtZXNzYWdlcy4gKi8KLSNkZWZpbmUgTVNfQ0hBUF9FUlJPUl9SRVNUUklDVEVEX0xPR09OX0hPVVJTCTY0NgotI2RlZmluZSBNU19DSEFQX0VSUk9SX0FDQ1RfRElTQUJMRUQJCTY0NwotI2RlZmluZSBNU19DSEFQX0VSUk9SX1BBU1NXRF9FWFBJUkVECQk2NDgKLSNkZWZpbmUgTVNfQ0hBUF9FUlJPUl9OT19ESUFMSU5fUEVSTUlTU0lPTgk2NDkKLSNkZWZpbmUgTVNfQ0hBUF9FUlJPUl9BVVRIRU5USUNBVElPTl9GQUlMVVJFCTY5MQotI2RlZmluZSBNU19DSEFQX0VSUk9SX0NIQU5HSU5HX1BBU1NXT1JECQk3MDkKLQotLyoKLSAqIE9mZnNldHMgd2l0aGluIHRoZSByZXNwb25zZSBmaWVsZCBmb3IgTVMtQ0hBUAotICovCi0jZGVmaW5lIE1TX0NIQVBfTEFOTUFOUkVTUAkwCi0jZGVmaW5lIE1TX0NIQVBfTEFOTUFOUkVTUF9MRU4JMjQKLSNkZWZpbmUgTVNfQ0hBUF9OVFJFU1AJCTI0Ci0jZGVmaW5lIE1TX0NIQVBfTlRSRVNQX0xFTgkyNAotI2RlZmluZSBNU19DSEFQX1VTRU5UCQk0OAotCi0vKgotICogT2Zmc2V0cyB3aXRoaW4gdGhlIHJlc3BvbnNlIGZpZWxkIGZvciBNUy1DSEFQMgotICovCi0jZGVmaW5lIE1TX0NIQVAyX1BFRVJfQ0hBTExFTkdFCTAKLSNkZWZpbmUgTVNfQ0hBUDJfUEVFUl9DSEFMX0xFTgkxNgotI2RlZmluZSBNU19DSEFQMl9SRVNFUlZFRF9MRU4JOAotI2RlZmluZSBNU19DSEFQMl9OVFJFU1AJCTI0Ci0jZGVmaW5lIE1TX0NIQVAyX05UUkVTUF9MRU4JMjQKLSNkZWZpbmUgTVNfQ0hBUDJfRkxBR1MJCTQ4Ci0KLSNpZmRlZiBNUFBFCi0jaW5jbHVkZSAibXBwZS5oIgkvKiBNUFBFX01BWF9LRVlfTEVOICovCi1leHRlcm4gdV9jaGFyIG1wcGVfc2VuZF9rZXlbTVBQRV9NQVhfS0VZX0xFTl07Ci1leHRlcm4gdV9jaGFyIG1wcGVfcmVjdl9rZXlbTVBQRV9NQVhfS0VZX0xFTl07Ci1leHRlcm4gaW50IG1wcGVfa2V5c19zZXQ7Ci0KLS8qIFRoZXNlIHZhbHVlcyBhcmUgdGhlIFJBRElVUyBhdHRyaWJ1dGUgdmFsdWVzLS1zZWUgUkZDIDI1NDguICovCi0jZGVmaW5lIE1QUEVfRU5DX1BPTF9FTkNfQUxMT1dFRCAxCi0jZGVmaW5lIE1QUEVfRU5DX1BPTF9FTkNfUkVRVUlSRUQgMgotI2RlZmluZSBNUFBFX0VOQ19UWVBFU19SQzRfNDAgMgotI2RlZmluZSBNUFBFX0VOQ19UWVBFU19SQzRfMTI4IDQKLQotLyogdXNlZCBieSBwbHVnaW5zICh1c2luZyBhYm92ZSB2YWx1ZXMpICovCi1leHRlcm4gdm9pZCBzZXRfbXBwZV9lbmNfdHlwZXMoaW50LCBpbnQpOwotI2VuZGlmCi0KLS8qIEFyZSB3ZSB0aGUgYXV0aGVudGljYXRvciBvciBhdXRoZW50aWNhdGVlPyAgRm9yIE1TLUNIQVB2MiBrZXkgZGVyaXZhdGlvbi4gKi8KLSNkZWZpbmUgTVNfQ0hBUDJfQVVUSEVOVElDQVRFRSAwCi0jZGVmaW5lIE1TX0NIQVAyX0FVVEhFTlRJQ0FUT1IgMQotCi12b2lkIENoYXBNUyBfX1AoKHVfY2hhciAqLCBjaGFyICosIGludCwgdV9jaGFyICopKTsKLXZvaWQgQ2hhcE1TMiBfX1AoKHVfY2hhciAqLCB1X2NoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCwKLQkJICB1X2NoYXIgKiwgdV9jaGFyW01TX0FVVEhfUkVTUE9OU0VfTEVOR1RIKzFdLCBpbnQpKTsKLSNpZmRlZiBNUFBFCi12b2lkIG1wcGVfc2V0X2tleXMgX19QKCh1X2NoYXIgKiwgdV9jaGFyW01ENF9TSUdOQVRVUkVfU0laRV0pKTsKLXZvaWQgbXBwZV9zZXRfa2V5czIodV9jaGFyIFBhc3N3b3JkSGFzaEhhc2hbTUQ0X1NJR05BVFVSRV9TSVpFXSwKLQkJICAgIHVfY2hhciBOVFJlc3BvbnNlWzI0XSwgaW50IElzU2VydmVyKTsKLSNlbmRpZgotCi12b2lkCUNoYWxsZW5nZUhhc2ggX19QKCh1X2NoYXJbMTZdLCB1X2NoYXIgKiwgY2hhciAqLCB1X2NoYXJbOF0pKTsKLQotdm9pZCBHZW5lcmF0ZUF1dGhlbnRpY2F0b3JSZXNwb25zZSh1X2NoYXIgUGFzc3dvcmRIYXNoSGFzaFtNRDRfU0lHTkFUVVJFX1NJWkVdLAotCQkJdV9jaGFyIE5UUmVzcG9uc2VbMjRdLCB1X2NoYXIgUGVlckNoYWxsZW5nZVsxNl0sCi0JCQl1X2NoYXIgKnJjaGFsbGVuZ2UsIGNoYXIgKnVzZXJuYW1lLAotCQkJdV9jaGFyIGF1dGhSZXNwb25zZVtNU19BVVRIX1JFU1BPTlNFX0xFTkdUSCsxXSk7Ci0KLXZvaWQgY2hhcG1zX2luaXQodm9pZCk7Ci0KLSNkZWZpbmUgX19DSEFQTVNfSU5DTFVERV9fCi0jZW5kaWYgLyogX19DSEFQTVNfSU5DTFVERV9fICovCmRpZmYgLS1naXQgYS9wcHBkL2RlbWFuZC5jIGIvcHBwZC9kZW1hbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU1NzY1OC4uMDAwMDAwMAotLS0gYS9wcHBkL2RlbWFuZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLS8qCi0gKiBkZW1hbmQuYyAtIFN1cHBvcnQgcm91dGluZXMgZm9yIGRlbWFuZC1kaWFsbGluZy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMiBQYXVsIE1hY2tlcnJhcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFRoZSBuYW1lKHMpIG9mIHRoZSBhdXRob3JzIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiAzLiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFBhdWwgTWFja2VycmFzCi0gKiAgICAgPHBhdWx1c0BzYW1iYS5vcmc+Ii4KLSAqCi0gKiBUSEUgQVVUSE9SUyBPRiBUSElTIFNPRlRXQVJFIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi0gKiBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLSAqIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLSAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLSAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNkZWZpbmUgUkNTSUQJIiRJZDogZGVtYW5kLmMsdiAxLjIwIDIwMDUvMDgvMjUgMTI6MTQ6MTggcGF1bHVzIEV4cCAkIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaWZkZWYgUFBQX0ZJTFRFUgotI2luY2x1ZGUgPHBjYXAtYnBmLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgInBwcGQuaCIKLSNpbmNsdWRlICJmc20uaCIKLSNpbmNsdWRlICJpcGNwLmgiCi0jaW5jbHVkZSAibGNwLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gPSBSQ1NJRDsKLQotY2hhciAqZnJhbWU7Ci1pbnQgZnJhbWVsZW47Ci1pbnQgZnJhbWVtYXg7Ci1pbnQgZXNjYXBlX2ZsYWc7Ci1pbnQgZmx1c2hfZmxhZzsKLWludCBmY3M7Ci0KLXN0cnVjdCBwYWNrZXQgewotICAgIGludCBsZW5ndGg7Ci0gICAgc3RydWN0IHBhY2tldCAqbmV4dDsKLSAgICB1bnNpZ25lZCBjaGFyIGRhdGFbMV07Ci19OwotCi1zdHJ1Y3QgcGFja2V0ICpwZW5kX3E7Ci1zdHJ1Y3QgcGFja2V0ICpwZW5kX3F0YWlsOwotCi1zdGF0aWMgaW50IGFjdGl2ZV9wYWNrZXQgX19QKCh1bnNpZ25lZCBjaGFyICosIGludCkpOwotCi0vKgotICogZGVtYW5kX2NvbmYgLSBjb25maWd1cmUgdGhlIGludGVyZmFjZSBmb3IgZG9pbmcgZGlhbC1vbi1kZW1hbmQuCi0gKi8KLXZvaWQKLWRlbWFuZF9jb25mKCkKLXsKLSAgICBpbnQgaTsKLSAgICBzdHJ1Y3QgcHJvdGVudCAqcHJvdHA7Ci0KLS8qICAgIGZyYW1lbWF4ID0gbGNwX2FsbG93b3B0aW9uc1swXS5tcnU7Ci0gICAgaWYgKGZyYW1lbWF4IDwgUFBQX01SVSkgKi8KLQlmcmFtZW1heCA9IFBQUF9NUlU7Ci0gICAgZnJhbWVtYXggKz0gUFBQX0hEUkxFTiArIFBQUF9GQ1NMRU47Ci0gICAgZnJhbWUgPSBtYWxsb2MoZnJhbWVtYXgpOwotICAgIGlmIChmcmFtZSA9PSBOVUxMKQotCW5vdm0oImRlbWFuZCBmcmFtZSIpOwotICAgIGZyYW1lbGVuID0gMDsKLSAgICBwZW5kX3EgPSBOVUxMOwotICAgIGVzY2FwZV9mbGFnID0gMDsKLSAgICBmbHVzaF9mbGFnID0gMDsKLSAgICBmY3MgPSBQUFBfSU5JVEZDUzsKLQotICAgIG5ldGlmX3NldF9tdHUoMCwgTUlOKGxjcF9hbGxvd29wdGlvbnNbMF0ubXJ1LCBQUFBfTVJVKSk7Ci0gICAgaWYgKHBwcF9zZW5kX2NvbmZpZygwLCBQUFBfTVJVLCAodV9pbnQzMl90KSAwLCAwLCAwKSA8IDAKLQl8fCBwcHBfcmVjdl9jb25maWcoMCwgUFBQX01SVSwgKHVfaW50MzJfdCkgMCwgMCwgMCkgPCAwKQotCSAgICBmYXRhbCgiQ291bGRuJ3Qgc2V0IHVwIGRlbWFuZC1kaWFsbGVkIFBQUCBpbnRlcmZhY2U6ICVtIik7Ci0KLSNpZmRlZiBQUFBfRklMVEVSCi0gICAgc2V0X2ZpbHRlcnMoJnBhc3NfZmlsdGVyLCAmYWN0aXZlX2ZpbHRlcik7Ci0jZW5kaWYKLQotICAgIC8qCi0gICAgICogQ2FsbCB0aGUgZGVtYW5kX2NvbmYgcHJvY2VkdXJlIGZvciBlYWNoIHByb3RvY29sIHRoYXQncyBnb3Qgb25lLgotICAgICAqLwotICAgIGZvciAoaSA9IDA7IChwcm90cCA9IHByb3RvY29sc1tpXSkgIT0gTlVMTDsgKytpKQotCWlmIChwcm90cC0+ZW5hYmxlZF9mbGFnICYmIHByb3RwLT5kZW1hbmRfY29uZiAhPSBOVUxMKQotCSAgICBpZiAoISgoKnByb3RwLT5kZW1hbmRfY29uZikoMCkpKQotCQlkaWUoMSk7Ci19Ci0KLQotLyoKLSAqIGRlbWFuZF9ibG9jayAtIHNldCBlYWNoIG5ldHdvcmsgcHJvdG9jb2wgdG8gYmxvY2sgZnVydGhlciBwYWNrZXRzLgotICovCi12b2lkCi1kZW1hbmRfYmxvY2soKQotewotICAgIGludCBpOwotICAgIHN0cnVjdCBwcm90ZW50ICpwcm90cDsKLQotICAgIGZvciAoaSA9IDA7IChwcm90cCA9IHByb3RvY29sc1tpXSkgIT0gTlVMTDsgKytpKQotCWlmIChwcm90cC0+ZW5hYmxlZF9mbGFnICYmIHByb3RwLT5kZW1hbmRfY29uZiAhPSBOVUxMKQotCSAgICBzaWZucG1vZGUoMCwgcHJvdHAtPnByb3RvY29sICYgfjB4ODAwMCwgTlBNT0RFX1FVRVVFKTsKLSAgICBnZXRfbG9vcF9vdXRwdXQoKTsKLX0KLQotLyoKLSAqIGRlbWFuZF9kaXNjYXJkIC0gc2V0IGVhY2ggbmV0d29yayBwcm90b2NvbCB0byBkaXNjYXJkIHBhY2tldHMKLSAqIHdpdGggYW4gZXJyb3IuCi0gKi8KLXZvaWQKLWRlbWFuZF9kaXNjYXJkKCkKLXsKLSAgICBzdHJ1Y3QgcGFja2V0ICpwa3QsICpuZXh0cGt0OwotICAgIGludCBpOwotICAgIHN0cnVjdCBwcm90ZW50ICpwcm90cDsKLQotICAgIGZvciAoaSA9IDA7IChwcm90cCA9IHByb3RvY29sc1tpXSkgIT0gTlVMTDsgKytpKQotCWlmIChwcm90cC0+ZW5hYmxlZF9mbGFnICYmIHByb3RwLT5kZW1hbmRfY29uZiAhPSBOVUxMKQotCSAgICBzaWZucG1vZGUoMCwgcHJvdHAtPnByb3RvY29sICYgfjB4ODAwMCwgTlBNT0RFX0VSUk9SKTsKLSAgICBnZXRfbG9vcF9vdXRwdXQoKTsKLQotICAgIC8qIGRpc2NhcmQgYWxsIHNhdmVkIHBhY2tldHMgKi8KLSAgICBmb3IgKHBrdCA9IHBlbmRfcTsgcGt0ICE9IE5VTEw7IHBrdCA9IG5leHRwa3QpIHsKLQluZXh0cGt0ID0gcGt0LT5uZXh0OwotCWZyZWUocGt0KTsKLSAgICB9Ci0gICAgcGVuZF9xID0gTlVMTDsKLSAgICBmcmFtZWxlbiA9IDA7Ci0gICAgZmx1c2hfZmxhZyA9IDA7Ci0gICAgZXNjYXBlX2ZsYWcgPSAwOwotICAgIGZjcyA9IFBQUF9JTklURkNTOwotfQotCi0vKgotICogZGVtYW5kX3VuYmxvY2sgLSBzZXQgZWFjaCBlbmFibGVkIG5ldHdvcmsgcHJvdG9jb2wgdG8gcGFzcyBwYWNrZXRzLgotICovCi12b2lkCi1kZW1hbmRfdW5ibG9jaygpCi17Ci0gICAgaW50IGk7Ci0gICAgc3RydWN0IHByb3RlbnQgKnByb3RwOwotCi0gICAgZm9yIChpID0gMDsgKHByb3RwID0gcHJvdG9jb2xzW2ldKSAhPSBOVUxMOyArK2kpCi0JaWYgKHByb3RwLT5lbmFibGVkX2ZsYWcgJiYgcHJvdHAtPmRlbWFuZF9jb25mICE9IE5VTEwpCi0JICAgIHNpZm5wbW9kZSgwLCBwcm90cC0+cHJvdG9jb2wgJiB+MHg4MDAwLCBOUE1PREVfUEFTUyk7Ci19Ci0KLS8qCi0gKiBGQ1MgbG9va3VwIHRhYmxlIGFzIGNhbGN1bGF0ZWQgYnkgZ2VuZmNzdGFiLgotICovCi1zdGF0aWMgdV9zaG9ydCBmY3N0YWJbMjU2XSA9IHsKLQkweDAwMDAsCTB4MTE4OSwJMHgyMzEyLAkweDMyOWIsCTB4NDYyNCwJMHg1N2FkLAkweDY1MzYsCTB4NzRiZiwKLQkweDhjNDgsCTB4OWRjMSwJMHhhZjVhLAkweGJlZDMsCTB4Y2E2YywJMHhkYmU1LAkweGU5N2UsCTB4ZjhmNywKLQkweDEwODEsCTB4MDEwOCwJMHgzMzkzLAkweDIyMWEsCTB4NTZhNSwJMHg0NzJjLAkweDc1YjcsCTB4NjQzZSwKLQkweDljYzksCTB4OGQ0MCwJMHhiZmRiLAkweGFlNTIsCTB4ZGFlZCwJMHhjYjY0LAkweGY5ZmYsCTB4ZTg3NiwKLQkweDIxMDIsCTB4MzA4YiwJMHgwMjEwLAkweDEzOTksCTB4NjcyNiwJMHg3NmFmLAkweDQ0MzQsCTB4NTViZCwKLQkweGFkNGEsCTB4YmNjMywJMHg4ZTU4LAkweDlmZDEsCTB4ZWI2ZSwJMHhmYWU3LAkweGM4N2MsCTB4ZDlmNSwKLQkweDMxODMsCTB4MjAwYSwJMHgxMjkxLAkweDAzMTgsCTB4NzdhNywJMHg2NjJlLAkweDU0YjUsCTB4NDUzYywKLQkweGJkY2IsCTB4YWM0MiwJMHg5ZWQ5LAkweDhmNTAsCTB4ZmJlZiwJMHhlYTY2LAkweGQ4ZmQsCTB4Yzk3NCwKLQkweDQyMDQsCTB4NTM4ZCwJMHg2MTE2LAkweDcwOWYsCTB4MDQyMCwJMHgxNWE5LAkweDI3MzIsCTB4MzZiYiwKLQkweGNlNGMsCTB4ZGZjNSwJMHhlZDVlLAkweGZjZDcsCTB4ODg2OCwJMHg5OWUxLAkweGFiN2EsCTB4YmFmMywKLQkweDUyODUsCTB4NDMwYywJMHg3MTk3LAkweDYwMWUsCTB4MTRhMSwJMHgwNTI4LAkweDM3YjMsCTB4MjYzYSwKLQkweGRlY2QsCTB4Y2Y0NCwJMHhmZGRmLAkweGVjNTYsCTB4OThlOSwJMHg4OTYwLAkweGJiZmIsCTB4YWE3MiwKLQkweDYzMDYsCTB4NzI4ZiwJMHg0MDE0LAkweDUxOWQsCTB4MjUyMiwJMHgzNGFiLAkweDA2MzAsCTB4MTdiOSwKLQkweGVmNGUsCTB4ZmVjNywJMHhjYzVjLAkweGRkZDUsCTB4YTk2YSwJMHhiOGUzLAkweDhhNzgsCTB4OWJmMSwKLQkweDczODcsCTB4NjIwZSwJMHg1MDk1LAkweDQxMWMsCTB4MzVhMywJMHgyNDJhLAkweDE2YjEsCTB4MDczOCwKLQkweGZmY2YsCTB4ZWU0NiwJMHhkY2RkLAkweGNkNTQsCTB4YjllYiwJMHhhODYyLAkweDlhZjksCTB4OGI3MCwKLQkweDg0MDgsCTB4OTU4MSwJMHhhNzFhLAkweGI2OTMsCTB4YzIyYywJMHhkM2E1LAkweGUxM2UsCTB4ZjBiNywKLQkweDA4NDAsCTB4MTljOSwJMHgyYjUyLAkweDNhZGIsCTB4NGU2NCwJMHg1ZmVkLAkweDZkNzYsCTB4N2NmZiwKLQkweDk0ODksCTB4ODUwMCwJMHhiNzliLAkweGE2MTIsCTB4ZDJhZCwJMHhjMzI0LAkweGYxYmYsCTB4ZTAzNiwKLQkweDE4YzEsCTB4MDk0OCwJMHgzYmQzLAkweDJhNWEsCTB4NWVlNSwJMHg0ZjZjLAkweDdkZjcsCTB4NmM3ZSwKLQkweGE1MGEsCTB4YjQ4MywJMHg4NjE4LAkweDk3OTEsCTB4ZTMyZSwJMHhmMmE3LAkweGMwM2MsCTB4ZDFiNSwKLQkweDI5NDIsCTB4MzhjYiwJMHgwYTUwLAkweDFiZDksCTB4NmY2NiwJMHg3ZWVmLAkweDRjNzQsCTB4NWRmZCwKLQkweGI1OGIsCTB4YTQwMiwJMHg5Njk5LAkweDg3MTAsCTB4ZjNhZiwJMHhlMjI2LAkweGQwYmQsCTB4YzEzNCwKLQkweDM5YzMsCTB4Mjg0YSwJMHgxYWQxLAkweDBiNTgsCTB4N2ZlNywJMHg2ZTZlLAkweDVjZjUsCTB4NGQ3YywKLQkweGM2MGMsCTB4ZDc4NSwJMHhlNTFlLAkweGY0OTcsCTB4ODAyOCwJMHg5MWExLAkweGEzM2EsCTB4YjJiMywKLQkweDRhNDQsCTB4NWJjZCwJMHg2OTU2LAkweDc4ZGYsCTB4MGM2MCwJMHgxZGU5LAkweDJmNzIsCTB4M2VmYiwKLQkweGQ2OGQsCTB4YzcwNCwJMHhmNTlmLAkweGU0MTYsCTB4OTBhOSwJMHg4MTIwLAkweGIzYmIsCTB4YTIzMiwKLQkweDVhYzUsCTB4NGI0YywJMHg3OWQ3LAkweDY4NWUsCTB4MWNlMSwJMHgwZDY4LAkweDNmZjMsCTB4MmU3YSwKLQkweGU3MGUsCTB4ZjY4NywJMHhjNDFjLAkweGQ1OTUsCTB4YTEyYSwJMHhiMGEzLAkweDgyMzgsCTB4OTNiMSwKLQkweDZiNDYsCTB4N2FjZiwJMHg0ODU0LAkweDU5ZGQsCTB4MmQ2MiwJMHgzY2ViLAkweDBlNzAsCTB4MWZmOSwKLQkweGY3OGYsCTB4ZTYwNiwJMHhkNDlkLAkweGM1MTQsCTB4YjFhYiwJMHhhMDIyLAkweDkyYjksCTB4ODMzMCwKLQkweDdiYzcsCTB4NmE0ZSwJMHg1OGQ1LAkweDQ5NWMsCTB4M2RlMywJMHgyYzZhLAkweDFlZjEsCTB4MGY3OAotfTsKLQotLyoKLSAqIGxvb3BfY2hhcnMgLSBwcm9jZXNzIGNoYXJhY3RlcnMgcmVjZWl2ZWQgZnJvbSB0aGUgbG9vcGJhY2suCi0gKiBDYWxscyBsb29wX2ZyYW1lIHdoZW4gYSBjb21wbGV0ZSBmcmFtZSBoYXMgYmVlbiBhY2N1bXVsYXRlZC4KLSAqIFJldHVybiB2YWx1ZSBpcyAxIGlmIHdlIG5lZWQgdG8gYnJpbmcgdXAgdGhlIGxpbmssIDAgb3RoZXJ3aXNlLgotICovCi1pbnQKLWxvb3BfY2hhcnMocCwgbikKLSAgICB1bnNpZ25lZCBjaGFyICpwOwotICAgIGludCBuOwotewotICAgIGludCBjLCBydjsKLQotICAgIHJ2ID0gMDsKLSAgICBmb3IgKDsgbiA+IDA7IC0tbikgewotCWMgPSAqcCsrOwotCWlmIChjID09IFBQUF9GTEFHKSB7Ci0JICAgIGlmICghZXNjYXBlX2ZsYWcgJiYgIWZsdXNoX2ZsYWcKLQkJJiYgZnJhbWVsZW4gPiAyICYmIGZjcyA9PSBQUFBfR09PREZDUykgewotCQlmcmFtZWxlbiAtPSAyOwotCQlpZiAobG9vcF9mcmFtZSgodW5zaWduZWQgY2hhciAqKWZyYW1lLCBmcmFtZWxlbikpCi0JCSAgICBydiA9IDE7Ci0JICAgIH0KLQkgICAgZnJhbWVsZW4gPSAwOwotCSAgICBmbHVzaF9mbGFnID0gMDsKLQkgICAgZXNjYXBlX2ZsYWcgPSAwOwotCSAgICBmY3MgPSBQUFBfSU5JVEZDUzsKLQkgICAgY29udGludWU7Ci0JfQotCWlmIChmbHVzaF9mbGFnKQotCSAgICBjb250aW51ZTsKLQlpZiAoZXNjYXBlX2ZsYWcpIHsKLQkgICAgYyBePSBQUFBfVFJBTlM7Ci0JICAgIGVzY2FwZV9mbGFnID0gMDsKLQl9IGVsc2UgaWYgKGMgPT0gUFBQX0VTQ0FQRSkgewotCSAgICBlc2NhcGVfZmxhZyA9IDE7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQlpZiAoZnJhbWVsZW4gPj0gZnJhbWVtYXgpIHsKLQkgICAgZmx1c2hfZmxhZyA9IDE7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQlmcmFtZVtmcmFtZWxlbisrXSA9IGM7Ci0JZmNzID0gUFBQX0ZDUyhmY3MsIGMpOwotICAgIH0KLSAgICByZXR1cm4gcnY7Ci19Ci0KLS8qCi0gKiBsb29wX2ZyYW1lIC0gZ2l2ZW4gYSBmcmFtZSBvYnRhaW5lZCBmcm9tIHRoZSBsb29wYmFjaywKLSAqIGRlY2lkZSB3aGV0aGVyIHRvIGJyaW5nIHVwIHRoZSBsaW5rIG9yIG5vdCwgYW5kLCBpZiB3ZSB3YW50Ci0gKiB0byB0cmFuc21pdCB0aGlzIGZyYW1lIGxhdGVyLCBwdXQgaXQgb24gdGhlIHBlbmRpbmcgcXVldWUuCi0gKiBSZXR1cm4gdmFsdWUgaXMgMSBpZiB3ZSBuZWVkIHRvIGJyaW5nIHVwIHRoZSBsaW5rLCAwIG90aGVyd2lzZS4KLSAqIFdlIGFzc3VtZSB0aGF0IHRoZSBrZXJuZWwgZHJpdmVyIGhhcyBhbHJlYWR5IGFwcGxpZWQgdGhlCi0gKiBwYXNzX2ZpbHRlciwgc28gd2Ugd29uJ3QgZ2V0IHBhY2tldHMgaXQgcmVqZWN0ZWQuCi0gKiBXZSBhcHBseSB0aGUgYWN0aXZlX2ZpbHRlciB0byBzZWUgaWYgd2Ugd2FudCB0aGlzIHBhY2tldCB0bwotICogYnJpbmcgdXAgdGhlIGxpbmsuCi0gKi8KLWludAotbG9vcF9mcmFtZShmcmFtZSwgbGVuKQotICAgIHVuc2lnbmVkIGNoYXIgKmZyYW1lOwotICAgIGludCBsZW47Ci17Ci0gICAgc3RydWN0IHBhY2tldCAqcGt0OwotCi0gICAgLyogZGJnbG9nKCJmcm9tIGxvb3A6ICVQIiwgZnJhbWUsIGxlbik7ICovCi0gICAgaWYgKGxlbiA8IFBQUF9IRFJMRU4pCi0JcmV0dXJuIDA7Ci0gICAgaWYgKChQUFBfUFJPVE9DT0woZnJhbWUpICYgMHg4MDAwKSAhPSAwKQotCXJldHVybiAwOwkJLyogc2hvdWxkbid0IGdldCBhbnkgb2YgdGhlc2UgYW55d2F5ICovCi0gICAgaWYgKCFhY3RpdmVfcGFja2V0KGZyYW1lLCBsZW4pKQotCXJldHVybiAwOwotCi0gICAgcGt0ID0gKHN0cnVjdCBwYWNrZXQgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGFja2V0KSArIGxlbik7Ci0gICAgaWYgKHBrdCAhPSBOVUxMKSB7Ci0JcGt0LT5sZW5ndGggPSBsZW47Ci0JcGt0LT5uZXh0ID0gTlVMTDsKLQltZW1jcHkocGt0LT5kYXRhLCBmcmFtZSwgbGVuKTsKLQlpZiAocGVuZF9xID09IE5VTEwpCi0JICAgIHBlbmRfcSA9IHBrdDsKLQllbHNlCi0JICAgIHBlbmRfcXRhaWwtPm5leHQgPSBwa3Q7Ci0JcGVuZF9xdGFpbCA9IHBrdDsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBkZW1hbmRfcmV4bWl0IC0gUmVzZW5kIGFsbCB0aG9zZSBmcmFtZXMgd2hpY2ggd2UgZ290IHZpYSB0aGUKLSAqIGxvb3BiYWNrLCBub3cgdGhhdCB0aGUgcmVhbCBzZXJpYWwgbGluayBpcyB1cC4KLSAqLwotdm9pZAotZGVtYW5kX3JleG1pdChwcm90bykKLSAgICBpbnQgcHJvdG87Ci17Ci0gICAgc3RydWN0IHBhY2tldCAqcGt0LCAqcHJldiwgKm5leHRwa3Q7Ci0KLSAgICBwcmV2ID0gTlVMTDsKLSAgICBwa3QgPSBwZW5kX3E7Ci0gICAgcGVuZF9xID0gTlVMTDsKLSAgICBmb3IgKDsgcGt0ICE9IE5VTEw7IHBrdCA9IG5leHRwa3QpIHsKLQluZXh0cGt0ID0gcGt0LT5uZXh0OwotCWlmIChQUFBfUFJPVE9DT0wocGt0LT5kYXRhKSA9PSBwcm90bykgewotCSAgICBvdXRwdXQoMCwgcGt0LT5kYXRhLCBwa3QtPmxlbmd0aCk7Ci0JICAgIGZyZWUocGt0KTsKLQl9IGVsc2UgewotCSAgICBpZiAocHJldiA9PSBOVUxMKQotCQlwZW5kX3EgPSBwa3Q7Ci0JICAgIGVsc2UKLQkJcHJldi0+bmV4dCA9IHBrdDsKLQkgICAgcHJldiA9IHBrdDsKLQl9Ci0gICAgfQotICAgIHBlbmRfcXRhaWwgPSBwcmV2OwotICAgIGlmIChwcmV2ICE9IE5VTEwpCi0JcHJldi0+bmV4dCA9IE5VTEw7Ci19Ci0KLS8qCi0gKiBTY2FuIGEgcGFja2V0IHRvIGRlY2lkZSB3aGV0aGVyIGl0IGlzIGFuICJhY3RpdmUiIHBhY2tldCwKLSAqIHRoYXQgaXMsIHdoZXRoZXIgaXQgaXMgd29ydGggYnJpbmdpbmcgdXAgdGhlIGxpbmsgZm9yLgotICovCi1zdGF0aWMgaW50Ci1hY3RpdmVfcGFja2V0KHAsIGxlbikKLSAgICB1bnNpZ25lZCBjaGFyICpwOwotICAgIGludCBsZW47Ci17Ci0gICAgaW50IHByb3RvLCBpOwotICAgIHN0cnVjdCBwcm90ZW50ICpwcm90cDsKLQotICAgIGlmIChsZW4gPCBQUFBfSERSTEVOKQotCXJldHVybiAwOwotICAgIHByb3RvID0gUFBQX1BST1RPQ09MKHApOwotI2lmZGVmIFBQUF9GSUxURVIKLSAgICBwWzBdID0gMTsJCS8qIG91dGJvdW5kIHBhY2tldCBpbmRpY2F0b3IgKi8KLSAgICBpZiAoKHBhc3NfZmlsdGVyLmJmX2xlbiAhPSAwCi0JICYmIGJwZl9maWx0ZXIocGFzc19maWx0ZXIuYmZfaW5zbnMsIHAsIGxlbiwgbGVuKSA9PSAwKQotCXx8IChhY3RpdmVfZmlsdGVyLmJmX2xlbiAhPSAwCi0JICAgICYmIGJwZl9maWx0ZXIoYWN0aXZlX2ZpbHRlci5iZl9pbnNucywgcCwgbGVuLCBsZW4pID09IDApKSB7Ci0JcFswXSA9IDB4ZmY7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIHBbMF0gPSAweGZmOwotI2VuZGlmCi0gICAgZm9yIChpID0gMDsgKHByb3RwID0gcHJvdG9jb2xzW2ldKSAhPSBOVUxMOyArK2kpIHsKLQlpZiAocHJvdHAtPnByb3RvY29sIDwgMHhDMDAwICYmIChwcm90cC0+cHJvdG9jb2wgJiB+MHg4MDAwKSA9PSBwcm90bykgewotCSAgICBpZiAoIXByb3RwLT5lbmFibGVkX2ZsYWcpCi0JCXJldHVybiAwOwotCSAgICBpZiAocHJvdHAtPmFjdGl2ZV9wa3QgPT0gTlVMTCkKLQkJcmV0dXJuIDE7Ci0JICAgIHJldHVybiAoKnByb3RwLT5hY3RpdmVfcGt0KShwLCBsZW4pOwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIDA7CQkJLyogbm90IGEgc3VwcG9ydGVkIHByb3RvY29sICEhPz8gKi8KLX0KZGlmZiAtLWdpdCBhL3BwcGQvZWFwLmMgYi9wcHBkL2VhcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQwZWJmLi4wMDAwMDAwCi0tLSBhL3BwcGQvZWFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDI4ICswLDAgQEAKLS8qCi0gKiBlYXAuYyAtIEV4dGVuc2libGUgQXV0aGVudGljYXRpb24gUHJvdG9jb2wgZm9yIFBQUCAoUkZDIDIyODQpCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogTm9uLWV4Y2x1c2l2ZSByaWdodHMgdG8gcmVkaXN0cmlidXRlLCBtb2RpZnksIHRyYW5zbGF0ZSwgYW5kIHVzZQotICogdGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcywgaW4gd2hvbGUgb3IgaW4gcGFydCwgaXMKLSAqIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGlzCi0gKiBkdXBsaWNhdGVkIGluIGFueSBzb3VyY2UgZm9ybSwgYW5kIHRoYXQgbmVpdGhlciB0aGUgbmFtZSBvZiB0aGUKLSAqIGNvcHlyaWdodCBob2xkZXIgbm9yIHRoZSBhdXRob3IgaXMgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAqIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIE9yaWdpbmFsIHZlcnNpb24gYnkgSmFtZXMgQ2FybHNvbgotICoKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgRUFQIHN1cHBvcnRzIE1ENS1DaGFsbGVuZ2UgYW5kIFNSUC1TSEExCi0gKiBhdXRoZW50aWNhdGlvbiBzdHlsZXMuICBOb3RlIHRoYXQgc3VwcG9ydCBvZiBNRDUtQ2hhbGxlbmdlIGlzIGEKLSAqIHJlcXVpcmVtZW50IG9mIFJGQyAyMjg0LCBhbmQgdGhhdCBpdCdzIGVzc2VudGlhbGx5IGp1c3QgYQotICogcmVpbXBsZW1lbnRhdGlvbiBvZiByZWd1bGFyIFJGQyAxOTk0IENIQVAgdXNpbmcgRUFQIG1lc3NhZ2VzLgotICoKLSAqIEFzIGFuIGF1dGhlbnRpY2F0b3IgKCJzZXJ2ZXIiKSwgdGhlcmUgYXJlIG11bHRpcGxlIHBoYXNlcyBmb3IgZWFjaAotICogc3R5bGUuICBJbiB0aGUgZmlyc3QgcGhhc2Ugb2YgZWFjaCBzdHlsZSwgdGhlIHVuYXV0aGVudGljYXRlZCBwZWVyCi0gKiBuYW1lIGlzIHF1ZXJpZWQgdXNpbmcgdGhlIEVBUCBJZGVudGl0eSByZXF1ZXN0IHR5cGUuICBJZiB0aGUKLSAqICJyZW1vdGVuYW1lIiBvcHRpb24gaXMgdXNlZCwgdGhlbiB0aGlzIHBoYXNlIGlzIHNraXBwZWQsIGJlY2F1c2UKLSAqIHRoZSBwZWVyJ3MgbmFtZSBpcyBwcmVzdW1lZCB0byBiZSBrbm93bi4KLSAqCi0gKiBGb3IgTUQ1LUNoYWxsZW5nZSwgdGhlcmUgYXJlIHR3byBwaGFzZXMsIGFuZCB0aGUgc2Vjb25kIHBoYXNlCi0gKiBjb25zaXN0cyBvZiBzZW5kaW5nIHRoZSBjaGFsbGVuZ2UgaXRzZWxmIGFuZCBoYW5kbGluZyB0aGUKLSAqIGFzc29jaWF0ZWQgcmVzcG9uc2UuCi0gKgotICogRm9yIFNSUC1TSEExLCB0aGVyZSBhcmUgZm91ciBwaGFzZXMuICBUaGUgc2Vjb25kIHNlbmRzICdzJywgJ04nLAotICogYW5kICdnJy4gIFRoZSByZXBseSBjb250YWlucyAnQScuICBUaGUgdGhpcmQgc2VuZHMgJ0InLCBhbmQgdGhlCi0gKiByZXBseSBjb250YWlucyAnTTEnLiAgVGhlIGZvcnRoIHNlbmRzIHRoZSAnTTInIHZhbHVlLgotICoKLSAqIEFzIGFuIGF1dGhlbnRpY2F0ZWUgKCJjbGllbnQiKSwgdGhlcmUncyBqdXN0IGEgc2luZ2xlIHBoYXNlIC0tCi0gKiByZXNwb25kaW5nIHRvIHRoZSBxdWVyaWVzIGdlbmVyYXRlZCBieSB0aGUgcGVlci4gIEVBUCBpcyBhbgotICogYXV0aGVudGljYXRvci1kcml2ZW4gcHJvdG9jb2wuCi0gKgotICogQmFzZWQgb24gZHJhZnQtaWV0Zi1wcHBleHQtZWFwLXNycC0wMy50eHQuCi0gKi8KLQotI2RlZmluZSBSQ1NJRAkiJElkOiBlYXAuYyx2IDEuNCAyMDA0LzExLzA5IDIyOjM5OjI1IHBhdWx1cyBFeHAgJCIKLQotLyoKLSAqIFRPRE86Ci0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8cHdkLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpbmNsdWRlICJwcHBkLmgiCi0jaW5jbHVkZSAicGF0aG5hbWVzLmgiCi0jaW5jbHVkZSAibWQ1LmgiCi0jaW5jbHVkZSAiZWFwLmgiCi0KLSNpZmRlZiBVU0VfU1JQCi0jaW5jbHVkZSA8dF9wd2QuaD4KLSNpbmNsdWRlIDx0X3NlcnZlci5oPgotI2luY2x1ZGUgPHRfY2xpZW50Lmg+Ci0jaW5jbHVkZSAicHBwY3J5cHQuaCIKLSNlbmRpZiAvKiBVU0VfU1JQICovCi0KLSNpZm5kZWYgU0hBX0RJR0VTVFNJWkUKLSNkZWZpbmUJU0hBX0RJR0VTVFNJWkUgMjAKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdID0gUkNTSUQ7Ci0KLWVhcF9zdGF0ZSBlYXBfc3RhdGVzW05VTV9QUFBdOwkJLyogRUFQIHN0YXRlOyBvbmUgZm9yIGVhY2ggdW5pdCAqLwotI2lmZGVmIFVTRV9TUlAKLXN0YXRpYyBjaGFyICpwbl9zZWNyZXQgPSBOVUxMOwkJLyogUHNldWRvbnltIGdlbmVyYXRpbmcgc2VjcmV0ICovCi0jZW5kaWYKLQotLyoKLSAqIENvbW1hbmQtbGluZSBvcHRpb25zLgotICovCi1zdGF0aWMgb3B0aW9uX3QgZWFwX29wdGlvbl9saXN0W10gPSB7Ci0gICAgeyAiZWFwLXJlc3RhcnQiLCBvX2ludCwgJmVhcF9zdGF0ZXNbMF0uZXNfc2VydmVyLmVhX3RpbWVvdXQsCi0gICAgICAiU2V0IHJldHJhbnNtaXQgdGltZW91dCBmb3IgRUFQIFJlcXVlc3RzIChzZXJ2ZXIpIiB9LAotICAgIHsgImVhcC1tYXgtc3JlcSIsIG9faW50LCAmZWFwX3N0YXRlc1swXS5lc19zZXJ2ZXIuZWFfbWF4cmVxdWVzdHMsCi0gICAgICAiU2V0IG1heCBudW1iZXIgb2YgRUFQIFJlcXVlc3RzIHNlbnQgKHNlcnZlcikiIH0sCi0gICAgeyAiZWFwLXRpbWVvdXQiLCBvX2ludCwgJmVhcF9zdGF0ZXNbMF0uZXNfY2xpZW50LmVhX3RpbWVvdXQsCi0gICAgICAiU2V0IHRpbWUgbGltaXQgZm9yIHBlZXIgRUFQIGF1dGhlbnRpY2F0aW9uIiB9LAotICAgIHsgImVhcC1tYXgtcnJlcSIsIG9faW50LCAmZWFwX3N0YXRlc1swXS5lc19jbGllbnQuZWFfbWF4cmVxdWVzdHMsCi0gICAgICAiU2V0IG1heCBudW1iZXIgb2YgRUFQIFJlcXVlc3RzIGFsbG93cyAoY2xpZW50KSIgfSwKLSAgICB7ICJlYXAtaW50ZXJ2YWwiLCBvX2ludCwgJmVhcF9zdGF0ZXNbMF0uZXNfcmVjaGFsbGVuZ2UsCi0gICAgICAiU2V0IGludGVydmFsIGZvciBFQVAgcmVjaGFsbGVuZ2UiIH0sCi0jaWZkZWYgVVNFX1NSUAotICAgIHsgInNycC1pbnRlcnZhbCIsIG9faW50LCAmZWFwX3N0YXRlc1swXS5lc19sd3JlY2hhbGxlbmdlLAotICAgICAgIlNldCBpbnRlcnZhbCBmb3IgU1JQIGxpZ2h0d2VpZ2h0IHJlY2hhbGxlbmdlIiB9LAotICAgIHsgInNycC1wbi1zZWNyZXQiLCBvX3N0cmluZywgJnBuX3NlY3JldCwKLSAgICAgICJMb25nIHRlcm0gcHNldWRvbnltIGdlbmVyYXRpb24gc2VjcmV0IiB9LAotICAgIHsgInNycC11c2UtcHNldWRvbnltIiwgb19ib29sLCAmZWFwX3N0YXRlc1swXS5lc191c2Vwc2V1ZG8sCi0gICAgICAiVXNlIHBzZXVkb255bSBpZiBvZmZlcmVkIG9uZSBieSBzZXJ2ZXIiLCAxIH0sCi0jZW5kaWYKLSAgICB7IE5VTEwgfQotfTsKLQotLyoKLSAqIFByb3RvY29sIGVudHJ5IHBvaW50cy4KLSAqLwotc3RhdGljIHZvaWQgZWFwX2luaXQgX19QKChpbnQgdW5pdCkpOwotc3RhdGljIHZvaWQgZWFwX2lucHV0IF9fUCgoaW50IHVuaXQsIHVfY2hhciAqaW5wLCBpbnQgaW5sZW4pKTsKLXN0YXRpYyB2b2lkIGVhcF9wcm90cmVqIF9fUCgoaW50IHVuaXQpKTsKLXN0YXRpYyB2b2lkIGVhcF9sb3dlcnVwIF9fUCgoaW50IHVuaXQpKTsKLXN0YXRpYyB2b2lkIGVhcF9sb3dlcmRvd24gX19QKChpbnQgdW5pdCkpOwotc3RhdGljIGludCAgZWFwX3ByaW50cGt0IF9fUCgodV9jaGFyICppbnAsIGludCBpbmxlbiwKLSAgICB2b2lkICgqKSh2b2lkICphcmcsIGNoYXIgKmZtdCwgLi4uKSwgdm9pZCAqYXJnKSk7Ci0KLXN0cnVjdCBwcm90ZW50IGVhcF9wcm90ZW50ID0gewotCVBQUF9FQVAsCQkvKiBwcm90b2NvbCBudW1iZXIgKi8KLQllYXBfaW5pdCwJCS8qIGluaXRpYWxpemF0aW9uIHByb2NlZHVyZSAqLwotCWVhcF9pbnB1dCwJCS8qIHByb2Nlc3MgYSByZWNlaXZlZCBwYWNrZXQgKi8KLQllYXBfcHJvdHJlaiwJCS8qIHByb2Nlc3MgYSByZWNlaXZlZCBwcm90b2NvbC1yZWplY3QgKi8KLQllYXBfbG93ZXJ1cCwJCS8qIGxvd2VyIGxheWVyIGhhcyBnb25lIHVwICovCi0JZWFwX2xvd2VyZG93biwJCS8qIGxvd2VyIGxheWVyIGhhcyBnb25lIGRvd24gKi8KLQlOVUxMLAkJCS8qIG9wZW4gdGhlIHByb3RvY29sICovCi0JTlVMTCwJCQkvKiBjbG9zZSB0aGUgcHJvdG9jb2wgKi8KLQllYXBfcHJpbnRwa3QsCQkvKiBwcmludCBhIHBhY2tldCBpbiByZWFkYWJsZSBmb3JtICovCi0JTlVMTCwJCQkvKiBwcm9jZXNzIGEgcmVjZWl2ZWQgZGF0YSBwYWNrZXQgKi8KLQkxLAkJCS8qIHByb3RvY29sIGVuYWJsZWQgKi8KLQkiRUFQIiwJCQkvKiB0ZXh0IG5hbWUgb2YgcHJvdG9jb2wgKi8KLQlOVUxMLAkJCS8qIHRleHQgbmFtZSBvZiBjb3JyZXNwb25kaW5nIGRhdGEgcHJvdG9jb2wgKi8KLQllYXBfb3B0aW9uX2xpc3QsCS8qIGxpc3Qgb2YgY29tbWFuZC1saW5lIG9wdGlvbnMgKi8KLQlOVUxMLAkJCS8qIGNoZWNrIHJlcXVlc3RlZCBvcHRpb25zOyBhc3NpZ24gZGVmYXVsdHMgKi8KLQlOVUxMLAkJCS8qIGNvbmZpZ3VyZSBpbnRlcmZhY2UgZm9yIGRlbWFuZC1kaWFsICovCi0JTlVMTAkJCS8qIHNheSB3aGV0aGVyIHRvIGJyaW5nIHVwIGxpbmsgZm9yIHRoaXMgcGt0ICovCi19OwotCi0vKgotICogQSB3ZWxsLWtub3duIDIwNDggYml0IG1vZHVsdXMuCi0gKi8KLXN0YXRpYyBjb25zdCB1X2NoYXIgd2ttb2R1bHVzW10gPSB7Ci0JMHhBQywgMHg2QiwgMHhEQiwgMHg0MSwgMHgzMiwgMHg0QSwgMHg5QSwgMHg5QiwKLQkweEYxLCAweDY2LCAweERFLCAweDVFLCAweDEzLCAweDg5LCAweDU4LCAweDJGLAotCTB4QUYsIDB4NzIsIDB4QjYsIDB4NjUsIDB4MTksIDB4ODcsIDB4RUUsIDB4MDcsCi0JMHhGQywgMHgzMSwgMHg5MiwgMHg5NCwgMHgzRCwgMHhCNSwgMHg2MCwgMHg1MCwKLQkweEEzLCAweDczLCAweDI5LCAweENCLCAweEI0LCAweEEwLCAweDk5LCAweEVELAotCTB4ODEsIDB4OTMsIDB4RTAsIDB4NzUsIDB4NzcsIDB4NjcsIDB4QTEsIDB4M0QsCi0JMHhENSwgMHgyMywgMHgxMiwgMHhBQiwgMHg0QiwgMHgwMywgMHgzMSwgMHgwRCwKLQkweENELCAweDdGLCAweDQ4LCAweEE5LCAweERBLCAweDA0LCAweEZELCAweDUwLAotCTB4RTgsIDB4MDgsIDB4MzksIDB4NjksIDB4RUQsIDB4QjcsIDB4NjcsIDB4QjAsCi0JMHhDRiwgMHg2MCwgMHg5NSwgMHgxNywgMHg5QSwgMHgxNiwgMHgzQSwgMHhCMywKLQkweDY2LCAweDFBLCAweDA1LCAweEZCLCAweEQ1LCAweEZBLCAweEFBLCAweEU4LAotCTB4MjksIDB4MTgsIDB4QTksIDB4OTYsIDB4MkYsIDB4MEIsIDB4OTMsIDB4QjgsCi0JMHg1NSwgMHhGOSwgMHg3OSwgMHg5MywgMHhFQywgMHg5NywgMHg1RSwgMHhFQSwKLQkweEE4LCAweDBELCAweDc0LCAweDBBLCAweERCLCAweEY0LCAweEZGLCAweDc0LAotCTB4NzMsIDB4NTksIDB4RDAsIDB4NDEsIDB4RDUsIDB4QzMsIDB4M0UsIDB4QTcsCi0JMHgxRCwgMHgyOCwgMHgxRSwgMHg0NCwgMHg2QiwgMHgxNCwgMHg3NywgMHgzQiwKLQkweENBLCAweDk3LCAweEI0LCAweDNBLCAweDIzLCAweEZCLCAweDgwLCAweDE2LAotCTB4NzYsIDB4QkQsIDB4MjAsIDB4N0EsIDB4NDMsIDB4NkMsIDB4NjQsIDB4ODEsCi0JMHhGMSwgMHhEMiwgMHhCOSwgMHgwNywgMHg4NywgMHgxNywgMHg0NiwgMHgxQSwKLQkweDVCLCAweDlELCAweDMyLCAweEU2LCAweDg4LCAweEY4LCAweDc3LCAweDQ4LAotCTB4NTQsIDB4NDUsIDB4MjMsIDB4QjUsIDB4MjQsIDB4QjAsIDB4RDUsIDB4N0QsCi0JMHg1RSwgMHhBNywgMHg3QSwgMHgyNywgMHg3NSwgMHhEMiwgMHhFQywgMHhGQSwKLQkweDAzLCAweDJDLCAweEZCLCAweERCLCAweEY1LCAweDJGLCAweEIzLCAweDc4LAotCTB4NjEsIDB4NjAsIDB4MjcsIDB4OTAsIDB4MDQsIDB4RTUsIDB4N0EsIDB4RTYsCi0JMHhBRiwgMHg4NywgMHg0RSwgMHg3MywgMHgwMywgMHhDRSwgMHg1MywgMHgyOSwKLQkweDlDLCAweENDLCAweDA0LCAweDFDLCAweDdCLCAweEMzLCAweDA4LCAweEQ4LAotCTB4MkEsIDB4NTYsIDB4OTgsIDB4RjMsIDB4QTgsIDB4RDAsIDB4QzMsIDB4ODIsCi0JMHg3MSwgMHhBRSwgMHgzNSwgMHhGOCwgMHhFOSwgMHhEQiwgMHhGQiwgMHhCNiwKLQkweDk0LCAweEI1LCAweEM4LCAweDAzLCAweEQ4LCAweDlGLCAweDdBLCAweEU0LAotCTB4MzUsIDB4REUsIDB4MjMsIDB4NkQsIDB4NTIsIDB4NUYsIDB4NTQsIDB4NzUsCi0JMHg5QiwgMHg2NSwgMHhFMywgMHg3MiwgMHhGQywgMHhENiwgMHg4RSwgMHhGMiwKLQkweDBGLCAweEE3LCAweDExLCAweDFGLCAweDlFLCAweDRBLCAweEZGLCAweDczCi19OwotCi0vKiBMb2NhbCBmb3J3YXJkIGRlY2xhcmF0aW9ucy4gKi8KLXN0YXRpYyB2b2lkIGVhcF9zZXJ2ZXJfdGltZW91dCBfX1AoKHZvaWQgKmFyZykpOwotCi0vKgotICogQ29udmVydCBFQVAgc3RhdGUgY29kZSB0byBwcmludGFibGUgc3RyaW5nIGZvciBkZWJ1Zy4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKgotZWFwX3N0YXRlX25hbWUoZXNjKQotZW51bSBlYXBfc3RhdGVfY29kZSBlc2M7Ci17Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKnN0YXRlX25hbWVzW10gPSB7IEVBUF9TVEFURVMgfTsKLQotCXJldHVybiAoc3RhdGVfbmFtZXNbKGludCllc2NdKTsKLX0KLQotLyoKLSAqIGVhcF9pbml0IC0gSW5pdGlhbGl6ZSBzdGF0ZSBmb3IgYW4gRUFQIHVzZXIuICBUaGlzIGlzIGN1cnJlbnRseQotICogY2FsbGVkIG9uY2UgYnkgbWFpbigpIGR1cmluZyBzdGFydC11cC4KLSAqLwotc3RhdGljIHZvaWQKLWVhcF9pbml0KHVuaXQpCi1pbnQgdW5pdDsKLXsKLQllYXBfc3RhdGUgKmVzcCA9ICZlYXBfc3RhdGVzW3VuaXRdOwotCi0JQlpFUk8oZXNwLCBzaXplb2YgKCplc3ApKTsKLQllc3AtPmVzX3VuaXQgPSB1bml0OwotCWVzcC0+ZXNfc2VydmVyLmVhX3RpbWVvdXQgPSBFQVBfREVGVElNRU9VVDsKLQllc3AtPmVzX3NlcnZlci5lYV9tYXhyZXF1ZXN0cyA9IEVBUF9ERUZUUkFOU01JVFM7Ci0JZXNwLT5lc19zZXJ2ZXIuZWFfaWQgPSAodV9jaGFyKShkcmFuZDQ4KCkgKiAweDEwMCk7Ci0JZXNwLT5lc19jbGllbnQuZWFfdGltZW91dCA9IEVBUF9ERUZSRVFUSU1FOwotCWVzcC0+ZXNfY2xpZW50LmVhX21heHJlcXVlc3RzID0gRUFQX0RFRkFMTE9XUkVROwotfQotCi0vKgotICogZWFwX2NsaWVudF90aW1lb3V0IC0gR2l2ZSB1cCB3YWl0aW5nIGZvciB0aGUgcGVlciB0byBzZW5kIGFueQotICogUmVxdWVzdCBtZXNzYWdlcy4KLSAqLwotc3RhdGljIHZvaWQKLWVhcF9jbGllbnRfdGltZW91dChhcmcpCi12b2lkICphcmc7Ci17Ci0JZWFwX3N0YXRlICplc3AgPSAoZWFwX3N0YXRlICopIGFyZzsKLQotCWlmICghZWFwX2NsaWVudF9hY3RpdmUoZXNwKSkKLQkJcmV0dXJuOwotCi0JZXJyb3IoIkVBUDogdGltZW91dCB3YWl0aW5nIGZvciBSZXF1ZXN0IGZyb20gcGVlciIpOwotCWF1dGhfd2l0aHBlZXJfZmFpbChlc3AtPmVzX3VuaXQsIFBQUF9FQVApOwotCWVzcC0+ZXNfY2xpZW50LmVhX3N0YXRlID0gZWFwQmFkQXV0aDsKLX0KLQotLyoKLSAqIGVhcF9hdXRod2l0aHBlZXIgLSBBdXRoZW50aWNhdGUgdG8gb3VyIHBlZXIgKGJlaGF2ZSBhcyBjbGllbnQpLgotICoKLSAqIFN0YXJ0IGNsaWVudCBzdGF0ZSBhbmQgd2FpdCBmb3IgcmVxdWVzdHMuICBUaGlzIGlzIGNhbGxlZCBvbmx5Ci0gKiBhZnRlciBlYXBfbG93ZXJ1cC4KLSAqLwotdm9pZAotZWFwX2F1dGh3aXRocGVlcih1bml0LCBsb2NhbG5hbWUpCi1pbnQgdW5pdDsKLWNoYXIgKmxvY2FsbmFtZTsKLXsKLQllYXBfc3RhdGUgKmVzcCA9ICZlYXBfc3RhdGVzW3VuaXRdOwotCi0JLyogU2F2ZSB0aGUgcGVlciBuYW1lIHdlJ3JlIGdpdmVuICovCi0JZXNwLT5lc19jbGllbnQuZWFfbmFtZSA9IGxvY2FsbmFtZTsKLQllc3AtPmVzX2NsaWVudC5lYV9uYW1lbGVuID0gc3RybGVuKGxvY2FsbmFtZSk7Ci0KLQllc3AtPmVzX2NsaWVudC5lYV9zdGF0ZSA9IGVhcExpc3RlbjsKLQotCS8qCi0JICogU3RhcnQgYSB0aW1lciBzbyB0aGF0IGlmIHRoZSBvdGhlciBlbmQganVzdCBnb2VzCi0JICogc2lsZW50LCB3ZSBkb24ndCBzaXQgaGVyZSB3YWl0aW5nIGZvcmV2ZXIuCi0JICovCi0JaWYgKGVzcC0+ZXNfY2xpZW50LmVhX3RpbWVvdXQgPiAwKQotCQlUSU1FT1VUKGVhcF9jbGllbnRfdGltZW91dCwgKHZvaWQgKillc3AsCi0JCSAgICBlc3AtPmVzX2NsaWVudC5lYV90aW1lb3V0KTsKLX0KLQotLyoKLSAqIEZvcm1hdCBhIHN0YW5kYXJkIEVBUCBGYWlsdXJlIG1lc3NhZ2UgYW5kIHNlbmQgaXQgdG8gdGhlIHBlZXIuCi0gKiAoU2VydmVyIG9wZXJhdGlvbikKLSAqLwotc3RhdGljIHZvaWQKLWVhcF9zZW5kX2ZhaWx1cmUoZXNwKQotZWFwX3N0YXRlICplc3A7Ci17Ci0JdV9jaGFyICpvdXRwOwotCi0Jb3V0cCA9IG91dHBhY2tldF9idWY7Ci0gICAgCi0JTUFLRUhFQURFUihvdXRwLCBQUFBfRUFQKTsKLQotCVBVVENIQVIoRUFQX0ZBSUxVUkUsIG91dHApOwotCWVzcC0+ZXNfc2VydmVyLmVhX2lkKys7Ci0JUFVUQ0hBUihlc3AtPmVzX3NlcnZlci5lYV9pZCwgb3V0cCk7Ci0JUFVUU0hPUlQoRUFQX0hFQURFUkxFTiwgb3V0cCk7Ci0KLQlvdXRwdXQoZXNwLT5lc191bml0LCBvdXRwYWNrZXRfYnVmLCBFQVBfSEVBREVSTEVOICsgUFBQX0hEUkxFTik7Ci0KLQllc3AtPmVzX3NlcnZlci5lYV9zdGF0ZSA9IGVhcEJhZEF1dGg7Ci0JYXV0aF9wZWVyX2ZhaWwoZXNwLT5lc191bml0LCBQUFBfRUFQKTsKLX0KLQotLyoKLSAqIEZvcm1hdCBhIHN0YW5kYXJkIEVBUCBTdWNjZXNzIG1lc3NhZ2UgYW5kIHNlbmQgaXQgdG8gdGhlIHBlZXIuCi0gKiAoU2VydmVyIG9wZXJhdGlvbikKLSAqLwotc3RhdGljIHZvaWQKLWVhcF9zZW5kX3N1Y2Nlc3MoZXNwKQotZWFwX3N0YXRlICplc3A7Ci17Ci0JdV9jaGFyICpvdXRwOwotCi0Jb3V0cCA9IG91dHBhY2tldF9idWY7Ci0gICAgCi0JTUFLRUhFQURFUihvdXRwLCBQUFBfRUFQKTsKLQotCVBVVENIQVIoRUFQX1NVQ0NFU1MsIG91dHApOwotCWVzcC0+ZXNfc2VydmVyLmVhX2lkKys7Ci0JUFVUQ0hBUihlc3AtPmVzX3NlcnZlci5lYV9pZCwgb3V0cCk7Ci0JUFVUU0hPUlQoRUFQX0hFQURFUkxFTiwgb3V0cCk7Ci0KLQlvdXRwdXQoZXNwLT5lc191bml0LCBvdXRwYWNrZXRfYnVmLCBQUFBfSERSTEVOICsgRUFQX0hFQURFUkxFTik7Ci0KLQlhdXRoX3BlZXJfc3VjY2Vzcyhlc3AtPmVzX3VuaXQsIFBQUF9FQVAsIDAsCi0JICAgIGVzcC0+ZXNfc2VydmVyLmVhX3BlZXIsIGVzcC0+ZXNfc2VydmVyLmVhX3BlZXJsZW4pOwotfQotCi0jaWZkZWYgVVNFX1NSUAotLyoKLSAqIFNldCBERVMga2V5IGFjY29yZGluZyB0byBwc2V1ZG9ueW0tZ2VuZXJhdGluZyBzZWNyZXQgYW5kIGN1cnJlbnQKLSAqIGRhdGUuCi0gKi8KLXN0YXRpYyBib29sCi1wbmNyeXB0X3NldGtleShpbnQgdGltZW9mZnMpCi17Ci0Jc3RydWN0IHRtICp0cDsKLQljaGFyIHRidWZbOV07Ci0JU0hBMV9DVFggY3R4dDsKLQl1X2NoYXIgZGlnW1NIQV9ESUdFU1RTSVpFXTsKLQl0aW1lX3QgcmVmdGltZTsKLQotCWlmIChwbl9zZWNyZXQgPT0gTlVMTCkKLQkJcmV0dXJuICgwKTsKLQlyZWZ0aW1lID0gdGltZShOVUxMKSArIHRpbWVvZmZzOwotCXRwID0gbG9jYWx0aW1lKCZyZWZ0aW1lKTsKLQlTSEExSW5pdCgmY3R4dCk7Ci0JU0hBMVVwZGF0ZSgmY3R4dCwgcG5fc2VjcmV0LCBzdHJsZW4ocG5fc2VjcmV0KSk7Ci0Jc3RyZnRpbWUodGJ1Ziwgc2l6ZW9mICh0YnVmKSwgIiVZJW0lZCIsIHRwKTsKLQlTSEExVXBkYXRlKCZjdHh0LCB0YnVmLCBzdHJsZW4odGJ1ZikpOwotCVNIQTFGaW5hbChkaWcsICZjdHh0KTsKLQlyZXR1cm4gKERlc1NldGtleShkaWcpKTsKLX0KLQotc3RhdGljIGNoYXIgYmFzZTY0W10gPQotIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwotCi1zdHJ1Y3QgYjY0c3RhdGUgewotCXVfaW50MzJfdCBic19iaXRzOwotCWludCBic19vZmZzOwotfTsKLQotc3RhdGljIGludAotYjY0ZW5jKGJzLCBpbnAsIGlubGVuLCBvdXRwKQotc3RydWN0IGI2NHN0YXRlICpiczsKLXVfY2hhciAqaW5wOwotaW50IGlubGVuOwotdV9jaGFyICpvdXRwOwotewotCWludCBvdXRsZW4gPSAwOwotCi0Jd2hpbGUgKGlubGVuID4gMCkgewotCQlicy0+YnNfYml0cyA9IChicy0+YnNfYml0cyA8PCA4KSB8ICppbnArKzsKLQkJaW5sZW4tLTsKLQkJYnMtPmJzX29mZnMgKz0gODsKLQkJaWYgKGJzLT5ic19vZmZzID49IDI0KSB7Ci0JCQkqb3V0cCsrID0gYmFzZTY0Wyhicy0+YnNfYml0cyA+PiAxOCkgJiAweDNGXTsKLQkJCSpvdXRwKysgPSBiYXNlNjRbKGJzLT5ic19iaXRzID4+IDEyKSAmIDB4M0ZdOwotCQkJKm91dHArKyA9IGJhc2U2NFsoYnMtPmJzX2JpdHMgPj4gNikgJiAweDNGXTsKLQkJCSpvdXRwKysgPSBiYXNlNjRbYnMtPmJzX2JpdHMgJiAweDNGXTsKLQkJCW91dGxlbiArPSA0OwotCQkJYnMtPmJzX29mZnMgPSAwOwotCQkJYnMtPmJzX2JpdHMgPSAwOwotCQl9Ci0JfQotCXJldHVybiAob3V0bGVuKTsKLX0KLQotc3RhdGljIGludAotYjY0Zmx1c2goYnMsIG91dHApCi1zdHJ1Y3QgYjY0c3RhdGUgKmJzOwotdV9jaGFyICpvdXRwOwotewotCWludCBvdXRsZW4gPSAwOwotCi0JaWYgKGJzLT5ic19vZmZzID09IDgpIHsKLQkJKm91dHArKyA9IGJhc2U2NFsoYnMtPmJzX2JpdHMgPj4gMikgJiAweDNGXTsKLQkJKm91dHArKyA9IGJhc2U2NFsoYnMtPmJzX2JpdHMgPDwgNCkgJiAweDNGXTsKLQkJb3V0bGVuID0gMjsKLQl9IGVsc2UgaWYgKGJzLT5ic19vZmZzID09IDE2KSB7Ci0JCSpvdXRwKysgPSBiYXNlNjRbKGJzLT5ic19iaXRzID4+IDEwKSAmIDB4M0ZdOwotCQkqb3V0cCsrID0gYmFzZTY0Wyhicy0+YnNfYml0cyA+PiA0KSAmIDB4M0ZdOwotCQkqb3V0cCsrID0gYmFzZTY0Wyhicy0+YnNfYml0cyA8PCAyKSAmIDB4M0ZdOwotCQlvdXRsZW4gPSAzOwotCX0KLQlicy0+YnNfb2ZmcyA9IDA7Ci0JYnMtPmJzX2JpdHMgPSAwOwotCXJldHVybiAob3V0bGVuKTsKLX0KLQotc3RhdGljIGludAotYjY0ZGVjKGJzLCBpbnAsIGlubGVuLCBvdXRwKQotc3RydWN0IGI2NHN0YXRlICpiczsKLXVfY2hhciAqaW5wOwotaW50IGlubGVuOwotdV9jaGFyICpvdXRwOwotewotCWludCBvdXRsZW4gPSAwOwotCWNoYXIgKmNwOwotCi0Jd2hpbGUgKGlubGVuID4gMCkgewotCQlpZiAoKGNwID0gc3RyY2hyKGJhc2U2NCwgKmlucCsrKSkgPT0gTlVMTCkKLQkJCWJyZWFrOwotCQlicy0+YnNfYml0cyA9IChicy0+YnNfYml0cyA8PCA2KSB8IChjcCAtIGJhc2U2NCk7Ci0JCWlubGVuLS07Ci0JCWJzLT5ic19vZmZzICs9IDY7Ci0JCWlmIChicy0+YnNfb2ZmcyA+PSA4KSB7Ci0JCQkqb3V0cCsrID0gYnMtPmJzX2JpdHMgPj4gKGJzLT5ic19vZmZzIC0gOCk7Ci0JCQlvdXRsZW4rKzsKLQkJCWJzLT5ic19vZmZzIC09IDg7Ci0JCX0KLQl9Ci0JcmV0dXJuIChvdXRsZW4pOwotfQotI2VuZGlmIC8qIFVTRV9TUlAgKi8KLQotLyoKLSAqIEFzc3VtZSB0aGF0IGN1cnJlbnQgd2FpdGluZyBzZXJ2ZXIgc3RhdGUgaXMgY29tcGxldGUgYW5kIGZpZ3VyZQotICogbmV4dCBzdGF0ZSB0byB1c2UgYmFzZWQgb24gYXZhaWxhYmxlIGF1dGhlbnRpY2F0aW9uIGRhdGEuICAnc3RhdHVzJwotICogaW5kaWNhdGVzIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBpbiBoYW5kbGluZyB0aGUgbGFzdCBxdWVyeS4gIEl0IGlzCi0gKiAwIGZvciBzdWNjZXNzIGFuZCBub24temVybyBmb3IgZmFpbHVyZS4KLSAqLwotc3RhdGljIHZvaWQKLWVhcF9maWd1cmVfbmV4dF9zdGF0ZShlc3AsIHN0YXR1cykKLWVhcF9zdGF0ZSAqZXNwOwotaW50IHN0YXR1czsKLXsKLSNpZmRlZiBVU0VfU1JQCi0JdW5zaWduZWQgY2hhciBzZWNidWZbTUFYV09SRExFTl0sIGNsZWFyWzhdLCAqc3AsICpkcDsKLQlzdHJ1Y3QgdF9wdyB0cHc7Ci0Jc3RydWN0IHRfY29uZmVudCAqdGNlLCBteXRjZTsKLQljaGFyICpjcCwgKmNwMjsKLQlzdHJ1Y3QgdF9zZXJ2ZXIgKnRzOwotCWludCBpZCwgaSwgcGxlbiwgdG9mZnM7Ci0JdV9jaGFyIHZhbHNbMl07Ci0Jc3RydWN0IGI2NHN0YXRlIGJzOwotI2VuZGlmIC8qIFVTRV9TUlAgKi8KLQotCWVzcC0+ZXNfc2VydmVyLmVhX3RpbWVvdXQgPSBlc3AtPmVzX3NhdmVkdGltZTsKLQlzd2l0Y2ggKGVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlKSB7Ci0JY2FzZSBlYXBCYWRBdXRoOgotCQlyZXR1cm47Ci0KLQljYXNlIGVhcElkZW50aWZ5OgotI2lmZGVmIFVTRV9TUlAKLQkJLyogRGlzY2FyZCBhbnkgcHJldmlvdXMgc2Vzc2lvbi4gKi8KLQkJdHMgPSAoc3RydWN0IHRfc2VydmVyICopZXNwLT5lc19zZXJ2ZXIuZWFfc2Vzc2lvbjsKLQkJaWYgKHRzICE9IE5VTEwpIHsKLQkJCXRfc2VydmVyY2xvc2UodHMpOwotCQkJZXNwLT5lc19zZXJ2ZXIuZWFfc2Vzc2lvbiA9IE5VTEw7Ci0JCQllc3AtPmVzX3NlcnZlci5lYV9za2V5ID0gTlVMTDsKLQkJfQotI2VuZGlmIC8qIFVTRV9TUlAgKi8KLQkJaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCQllc3AtPmVzX3NlcnZlci5lYV9zdGF0ZSA9IGVhcEJhZEF1dGg7Ci0JCQlicmVhazsKLQkJfQotI2lmZGVmIFVTRV9TUlAKLQkJLyogSWYgd2UndmUgZ290IGEgcHNldWRvbnltLCB0cnkgdG8gZGVjb2RlIHRvIHJlYWwgbmFtZS4gKi8KLQkJaWYgKGVzcC0+ZXNfc2VydmVyLmVhX3BlZXJsZW4gPiBTUlBfUFNFVURPX0xFTiAmJgotCQkgICAgc3RybmNtcChlc3AtPmVzX3NlcnZlci5lYV9wZWVyLCBTUlBfUFNFVURPX0lELAotCQkJU1JQX1BTRVVET19MRU4pID09IDAgJiYKLQkJICAgIChlc3AtPmVzX3NlcnZlci5lYV9wZWVybGVuIC0gU1JQX1BTRVVET19MRU4pICogMyAvIDQgPAotCQkgICAgc2l6ZW9mIChzZWNidWYpKSB7Ci0JCQlCWkVSTygmYnMsIHNpemVvZiAoYnMpKTsKLQkJCXBsZW4gPSBiNjRkZWMoJmJzLAotCQkJICAgIGVzcC0+ZXNfc2VydmVyLmVhX3BlZXIgKyBTUlBfUFNFVURPX0xFTiwKLQkJCSAgICBlc3AtPmVzX3NlcnZlci5lYV9wZWVybGVuIC0gU1JQX1BTRVVET19MRU4sCi0JCQkgICAgc2VjYnVmKTsKLQkJCXRvZmZzID0gMDsKLQkJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJCQlwbmNyeXB0X3NldGtleSh0b2Zmcyk7Ci0JCQkJdG9mZnMgLT0gODY0MDA7Ci0JCQkJaWYgKCFEZXNEZWNyeXB0KHNlY2J1ZiwgY2xlYXIpKSB7Ci0JCQkJCWRiZ2xvZygibm8gREVTIGhlcmU7IGNhbm5vdCBkZWNvZGUgIgotCQkJCQkgICAgInBzZXVkb255bSIpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlkID0gKih1bnNpZ25lZCBjaGFyICopY2xlYXI7Ci0JCQkJaWYgKGlkICsgMSA8PSBwbGVuICYmIGlkICsgOSA+IHBsZW4pCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHBsZW4gJSA4ID09IDAgJiYgaSA8IDUpIHsKLQkJCQkvKgotCQkJCSAqIE5vdGUgdGhhdCB0aGlzIGlzIGFsd2F5cyBzaG9ydGVyIHRoYW4gdGhlCi0JCQkJICogb3JpZ2luYWwgc3RvcmVkIHN0cmluZywgc28gdGhlcmUncyBubyBuZWVkCi0JCQkJICogdG8gcmVhbGxvYy4KLQkJCQkgKi8KLQkJCQlpZiAoKGkgPSBwbGVuID0gKih1bnNpZ25lZCBjaGFyICopY2xlYXIpID4gNykKLQkJCQkJaSA9IDc7Ci0JCQkJZXNwLT5lc19zZXJ2ZXIuZWFfcGVlcmxlbiA9IHBsZW47Ci0JCQkJZHAgPSAodW5zaWduZWQgY2hhciAqKWVzcC0+ZXNfc2VydmVyLmVhX3BlZXI7Ci0JCQkJQkNPUFkoY2xlYXIgKyAxLCBkcCwgaSk7Ci0JCQkJcGxlbiAtPSBpOwotCQkJCWRwICs9IGk7Ci0JCQkJc3AgPSBzZWNidWYgKyA4OwotCQkJCXdoaWxlIChwbGVuID4gMCkgewotCQkJCQkodm9pZCkgRGVzRGVjcnlwdChzcCwgZHApOwotCQkJCQlzcCArPSA4OwotCQkJCQlkcCArPSA4OwotCQkJCQlwbGVuIC09IDg7Ci0JCQkJfQotCQkJCWVzcC0+ZXNfc2VydmVyLmVhX3BlZXJbCi0JCQkJCWVzcC0+ZXNfc2VydmVyLmVhX3BlZXJsZW5dID0gJ1wwJzsKLQkJCQlkYmdsb2coImRlY29kZWQgcHNldWRvbnltIHRvIFwiJS4qcVwiIiwKLQkJCQkgICAgZXNwLT5lc19zZXJ2ZXIuZWFfcGVlcmxlbiwKLQkJCQkgICAgZXNwLT5lc19zZXJ2ZXIuZWFfcGVlcik7Ci0JCQl9IGVsc2UgewotCQkJCWRiZ2xvZygiZmFpbGVkIHRvIGRlY29kZSByZWFsIG5hbWUiKTsKLQkJCQkvKiBTdGF5IGluIGVhcElkZW50Znkgc3RhdGU7IHJlcXVlcnkgKi8KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkvKiBMb29rIHVwIHVzZXIgaW4gc2VjcmV0cyBkYXRhYmFzZS4gKi8KLQkJaWYgKGdldF9zcnBfc2VjcmV0KGVzcC0+ZXNfdW5pdCwgZXNwLT5lc19zZXJ2ZXIuZWFfcGVlciwKLQkJICAgIGVzcC0+ZXNfc2VydmVyLmVhX25hbWUsIChjaGFyICopc2VjYnVmLCAxKSAhPSAwKSB7Ci0JCQkvKiBTZXQgdXAgZGVmYXVsdCBpbiBjYXNlIFNSUCBlbnRyeSBpcyBiYWQgKi8KLQkJCWVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlID0gZWFwTUQ1Q2hhbGw7Ci0JCQkvKiBHZXQgdF9jb25mZW50IGJhc2VkIG9uIGluZGV4IGluIHNycC1zZWNyZXRzICovCi0JCQlpZCA9IHN0cnRvbCgoY2hhciAqKXNlY2J1ZiwgJmNwLCAxMCk7Ci0JCQlpZiAoKmNwKysgIT0gJzonIHx8IGlkIDwgMCkKLQkJCQlicmVhazsKLQkJCWlmIChpZCA9PSAwKSB7Ci0JCQkJbXl0Y2UuaW5kZXggPSAwOwotCQkJCW15dGNlLm1vZHVsdXMuZGF0YSA9ICh1X2NoYXIgKil3a21vZHVsdXM7Ci0JCQkJbXl0Y2UubW9kdWx1cy5sZW4gPSBzaXplb2YgKHdrbW9kdWx1cyk7Ci0JCQkJbXl0Y2UuZ2VuZXJhdG9yLmRhdGEgPSAodV9jaGFyICopIlwwMDIiOwotCQkJCW15dGNlLmdlbmVyYXRvci5sZW4gPSAxOwotCQkJCXRjZSA9ICZteXRjZTsKLQkJCX0gZWxzZSBpZiAoKHRjZSA9IGdldHRjaWQoaWQpKSAhPSBOVUxMKSB7Ci0JCQkJLyoKLQkJCQkgKiBDbGllbnQgd2lsbCBoYXZlIHRvIHZlcmlmeSB0aGlzIG1vZHVsdXMvCi0JCQkJICogZ2VuZXJhdG9yIGNvbWJpbmF0aW9uLCBhbmQgdGhhdCB3aWxsIHRha2UKLQkJCQkgKiBhIHdoaWxlLiAgTGVuZ3RoZW4gdGhlIHRpbWVvdXQgaGVyZS4KLQkJCQkgKi8KLQkJCQlpZiAoZXNwLT5lc19zZXJ2ZXIuZWFfdGltZW91dCA+IDAgJiYKLQkJCQkgICAgZXNwLT5lc19zZXJ2ZXIuZWFfdGltZW91dCA8IDMwKQotCQkJCQllc3AtPmVzX3NlcnZlci5lYV90aW1lb3V0ID0gMzA7Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKChjcDIgPSBzdHJjaHIoY3AsICc6JykpID09IE5VTEwpCi0JCQkJYnJlYWs7Ci0JCQkqY3AyKysgPSAnXDAnOwotCQkJdHB3LnBlYnVmLm5hbWUgPSBlc3AtPmVzX3NlcnZlci5lYV9wZWVyOwotCQkJdHB3LnBlYnVmLnBhc3N3b3JkLmxlbiA9IHRfZnJvbWI2NCgoY2hhciAqKXRwdy5wd2J1ZiwKLQkJCSAgICBjcCk7Ci0JCQl0cHcucGVidWYucGFzc3dvcmQuZGF0YSA9IHRwdy5wd2J1ZjsKLQkJCXRwdy5wZWJ1Zi5zYWx0LmxlbiA9IHRfZnJvbWI2NCgoY2hhciAqKXRwdy5zYWx0YnVmLAotCQkJICAgIGNwMik7Ci0JCQl0cHcucGVidWYuc2FsdC5kYXRhID0gdHB3LnNhbHRidWY7Ci0JCQlpZiAoKHRzID0gdF9zZXJ2ZXJvcGVucmF3KCZ0cHcucGVidWYsIHRjZSkpID09IE5VTEwpCi0JCQkJYnJlYWs7Ci0JCQllc3AtPmVzX3NlcnZlci5lYV9zZXNzaW9uID0gKHZvaWQgKil0czsKLQkJCWVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlID0gZWFwU1JQMTsKLQkJCXZhbHNbMF0gPSBlc3AtPmVzX3NlcnZlci5lYV9pZCArIDE7Ci0JCQl2YWxzWzFdID0gRUFQVF9TUlA7Ci0JCQl0X3NlcnZlcmFkZGV4ZGF0YSh0cywgdmFscywgMik7Ci0JCQkvKiBHZW5lcmF0ZSBCOyBtdXN0IGNhbGwgYmVmb3JlIHRfc2VydmVyZ2V0a2V5KCkgKi8KLQkJCXRfc2VydmVyZ2VuZXhwKHRzKTsKLQkJCWJyZWFrOwotCQl9Ci0jZW5kaWYgLyogVVNFX1NSUCAqLwotCQllc3AtPmVzX3NlcnZlci5lYV9zdGF0ZSA9IGVhcE1ENUNoYWxsOwotCQlicmVhazsKLQotCWNhc2UgZWFwU1JQMToKLSNpZmRlZiBVU0VfU1JQCi0JCXRzID0gKHN0cnVjdCB0X3NlcnZlciAqKWVzcC0+ZXNfc2VydmVyLmVhX3Nlc3Npb247Ci0JCWlmICh0cyAhPSBOVUxMICYmIHN0YXR1cyAhPSAwKSB7Ci0JCQl0X3NlcnZlcmNsb3NlKHRzKTsKLQkJCWVzcC0+ZXNfc2VydmVyLmVhX3Nlc3Npb24gPSBOVUxMOwotCQkJZXNwLT5lc19zZXJ2ZXIuZWFfc2tleSA9IE5VTEw7Ci0JCX0KLSNlbmRpZiAvKiBVU0VfU1JQICovCi0JCWlmIChzdGF0dXMgPT0gMSkgewotCQkJZXNwLT5lc19zZXJ2ZXIuZWFfc3RhdGUgPSBlYXBNRDVDaGFsbDsKLQkJfSBlbHNlIGlmIChzdGF0dXMgIT0gMCB8fCBlc3AtPmVzX3NlcnZlci5lYV9zZXNzaW9uID09IE5VTEwpIHsKLQkJCWVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlID0gZWFwQmFkQXV0aDsKLQkJfSBlbHNlIHsKLQkJCWVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlID0gZWFwU1JQMjsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgZWFwU1JQMjoKLSNpZmRlZiBVU0VfU1JQCi0JCXRzID0gKHN0cnVjdCB0X3NlcnZlciAqKWVzcC0+ZXNfc2VydmVyLmVhX3Nlc3Npb247Ci0JCWlmICh0cyAhPSBOVUxMICYmIHN0YXR1cyAhPSAwKSB7Ci0JCQl0X3NlcnZlcmNsb3NlKHRzKTsKLQkJCWVzcC0+ZXNfc2VydmVyLmVhX3Nlc3Npb24gPSBOVUxMOwotCQkJZXNwLT5lc19zZXJ2ZXIuZWFfc2tleSA9IE5VTEw7Ci0JCX0KLSNlbmRpZiAvKiBVU0VfU1JQICovCi0JCWlmIChzdGF0dXMgIT0gMCB8fCBlc3AtPmVzX3NlcnZlci5lYV9zZXNzaW9uID09IE5VTEwpIHsKLQkJCWVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlID0gZWFwQmFkQXV0aDsKLQkJfSBlbHNlIHsKLQkJCWVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlID0gZWFwU1JQMzsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgZWFwU1JQMzoKLQljYXNlIGVhcFNSUDQ6Ci0jaWZkZWYgVVNFX1NSUAotCQl0cyA9IChzdHJ1Y3QgdF9zZXJ2ZXIgKillc3AtPmVzX3NlcnZlci5lYV9zZXNzaW9uOwotCQlpZiAodHMgIT0gTlVMTCAmJiBzdGF0dXMgIT0gMCkgewotCQkJdF9zZXJ2ZXJjbG9zZSh0cyk7Ci0JCQllc3AtPmVzX3NlcnZlci5lYV9zZXNzaW9uID0gTlVMTDsKLQkJCWVzcC0+ZXNfc2VydmVyLmVhX3NrZXkgPSBOVUxMOwotCQl9Ci0jZW5kaWYgLyogVVNFX1NSUCAqLwotCQlpZiAoc3RhdHVzICE9IDAgfHwgZXNwLT5lc19zZXJ2ZXIuZWFfc2Vzc2lvbiA9PSBOVUxMKSB7Ci0JCQllc3AtPmVzX3NlcnZlci5lYV9zdGF0ZSA9IGVhcEJhZEF1dGg7Ci0JCX0gZWxzZSB7Ci0JCQllc3AtPmVzX3NlcnZlci5lYV9zdGF0ZSA9IGVhcE9wZW47Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIGVhcE1ENUNoYWxsOgotCQlpZiAoc3RhdHVzICE9IDApIHsKLQkJCWVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlID0gZWFwQmFkQXV0aDsKLQkJfSBlbHNlIHsKLQkJCWVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlID0gZWFwT3BlbjsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlID0gZWFwQmFkQXV0aDsKLQkJYnJlYWs7Ci0JfQotCWlmIChlc3AtPmVzX3NlcnZlci5lYV9zdGF0ZSA9PSBlYXBCYWRBdXRoKQotCQllYXBfc2VuZF9mYWlsdXJlKGVzcCk7Ci19Ci0KLS8qCi0gKiBGb3JtYXQgYW4gRUFQIFJlcXVlc3QgbWVzc2FnZSBhbmQgc2VuZCBpdCB0byB0aGUgcGVlci4gIE1lc3NhZ2UKLSAqIHR5cGUgZGVwZW5kcyBvbiBjdXJyZW50IHN0YXRlLiAgKFNlcnZlciBvcGVyYXRpb24pCi0gKi8KLXN0YXRpYyB2b2lkCi1lYXBfc2VuZF9yZXF1ZXN0KGVzcCkKLWVhcF9zdGF0ZSAqZXNwOwotewotCXVfY2hhciAqb3V0cDsKLQl1X2NoYXIgKmxlbmxvYzsKLQl1X2NoYXIgKnB0cjsKLQlpbnQgb3V0bGVuOwotCWludCBjaGFsbGVuOwotCWNoYXIgKnN0cjsKLSNpZmRlZiBVU0VfU1JQCi0Jc3RydWN0IHRfc2VydmVyICp0czsKLQl1X2NoYXIgY2xlYXJbOF0sIGNpcGhlcls4XSwgZGlnW1NIQV9ESUdFU1RTSVpFXSwgKm9wdHIsICpjcDsKLQlpbnQgaSwgajsKLQlzdHJ1Y3QgYjY0c3RhdGUgYjY0OwotCVNIQTFfQ1RYIGN0eHQ7Ci0jZW5kaWYgLyogVVNFX1NSUCAqLwotCi0JLyogSGFuZGxlIGJvdGggaW5pdGlhbCBhdXRoIGFuZCByZXN0YXJ0ICovCi0JaWYgKGVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlIDwgZWFwSWRlbnRpZnkgJiYKLQkgICAgZXNwLT5lc19zZXJ2ZXIuZWFfc3RhdGUgIT0gZWFwSW5pdGlhbCkgewotCQllc3AtPmVzX3NlcnZlci5lYV9zdGF0ZSA9IGVhcElkZW50aWZ5OwotCQlpZiAoZXhwbGljaXRfcmVtb3RlKSB7Ci0JCQkvKgotCQkJICogSWYgd2UgYWxyZWFkeSBrbm93IHRoZSBwZWVyJ3MKLQkJCSAqIHVuYXV0aGVudGljYXRlZCBuYW1lLCB0aGVuIHRoZXJlJ3Mgbm8KLQkJCSAqIHJlYXNvbiB0byBhc2suICBHbyB0byBuZXh0IHN0YXRlIGluc3RlYWQuCi0JCQkgKi8KLQkJCWVzcC0+ZXNfc2VydmVyLmVhX3BlZXIgPSByZW1vdGVfbmFtZTsKLQkJCWVzcC0+ZXNfc2VydmVyLmVhX3BlZXJsZW4gPSBzdHJsZW4ocmVtb3RlX25hbWUpOwotCQkJZWFwX2ZpZ3VyZV9uZXh0X3N0YXRlKGVzcCwgMCk7Ci0JCX0KLQl9Ci0KLQlpZiAoZXNwLT5lc19zZXJ2ZXIuZWFfbWF4cmVxdWVzdHMgPiAwICYmCi0JICAgIGVzcC0+ZXNfc2VydmVyLmVhX3JlcXVlc3RzID49IGVzcC0+ZXNfc2VydmVyLmVhX21heHJlcXVlc3RzKSB7Ci0JCWlmIChlc3AtPmVzX3NlcnZlci5lYV9yZXNwb25zZXMgPiAwKQotCQkJZXJyb3IoIkVBUDogdG9vIG1hbnkgUmVxdWVzdHMgc2VudCIpOwotCQllbHNlCi0JCQllcnJvcigiRUFQOiBubyByZXNwb25zZSB0byBSZXF1ZXN0cyIpOwotCQllYXBfc2VuZF9mYWlsdXJlKGVzcCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlvdXRwID0gb3V0cGFja2V0X2J1ZjsKLSAgICAKLQlNQUtFSEVBREVSKG91dHAsIFBQUF9FQVApOwotCi0JUFVUQ0hBUihFQVBfUkVRVUVTVCwgb3V0cCk7Ci0JUFVUQ0hBUihlc3AtPmVzX3NlcnZlci5lYV9pZCwgb3V0cCk7Ci0JbGVubG9jID0gb3V0cDsKLQlJTkNQVFIoMiwgb3V0cCk7Ci0KLQlzd2l0Y2ggKGVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlKSB7Ci0JY2FzZSBlYXBJZGVudGlmeToKLQkJUFVUQ0hBUihFQVBUX0lERU5USVRZLCBvdXRwKTsKLQkJc3RyID0gIk5hbWUiOwotCQljaGFsbGVuID0gc3RybGVuKHN0cik7Ci0JCUJDT1BZKHN0ciwgb3V0cCwgY2hhbGxlbik7Ci0JCUlOQ1BUUihjaGFsbGVuLCBvdXRwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIGVhcE1ENUNoYWxsOgotCQlQVVRDSEFSKEVBUFRfTUQ1Q0hBUCwgb3V0cCk7Ci0JCS8qCi0JCSAqIHBpY2sgYSByYW5kb20gY2hhbGxlbmdlIGxlbmd0aCBiZXR3ZWVuCi0JCSAqIE1JTl9DSEFMTEVOR0VfTEVOR1RIIGFuZCBNQVhfQ0hBTExFTkdFX0xFTkdUSAotCQkgKi8KLQkJY2hhbGxlbiA9IChkcmFuZDQ4KCkgKgotCQkgICAgKE1BWF9DSEFMTEVOR0VfTEVOR1RIIC0gTUlOX0NIQUxMRU5HRV9MRU5HVEgpKSArCi0JCQkgICAgTUlOX0NIQUxMRU5HRV9MRU5HVEg7Ci0JCVBVVENIQVIoY2hhbGxlbiwgb3V0cCk7Ci0JCWVzcC0+ZXNfY2hhbGxlbiA9IGNoYWxsZW47Ci0JCXB0ciA9IGVzcC0+ZXNfY2hhbGxlbmdlOwotCQl3aGlsZSAoLS1jaGFsbGVuID49IDApCi0JCQkqcHRyKysgPSAodV9jaGFyKSAoZHJhbmQ0OCgpICogMHgxMDApOwotCQlCQ09QWShlc3AtPmVzX2NoYWxsZW5nZSwgb3V0cCwgZXNwLT5lc19jaGFsbGVuKTsKLQkJSU5DUFRSKGVzcC0+ZXNfY2hhbGxlbiwgb3V0cCk7Ci0JCUJDT1BZKGVzcC0+ZXNfc2VydmVyLmVhX25hbWUsIG91dHAsIGVzcC0+ZXNfc2VydmVyLmVhX25hbWVsZW4pOwotCQlJTkNQVFIoZXNwLT5lc19zZXJ2ZXIuZWFfbmFtZWxlbiwgb3V0cCk7Ci0JCWJyZWFrOwotCi0jaWZkZWYgVVNFX1NSUAotCWNhc2UgZWFwU1JQMToKLQkJUFVUQ0hBUihFQVBUX1NSUCwgb3V0cCk7Ci0JCVBVVENIQVIoRUFQU1JQX0NIQUxMRU5HRSwgb3V0cCk7Ci0KLQkJUFVUQ0hBUihlc3AtPmVzX3NlcnZlci5lYV9uYW1lbGVuLCBvdXRwKTsKLQkJQkNPUFkoZXNwLT5lc19zZXJ2ZXIuZWFfbmFtZSwgb3V0cCwgZXNwLT5lc19zZXJ2ZXIuZWFfbmFtZWxlbik7Ci0JCUlOQ1BUUihlc3AtPmVzX3NlcnZlci5lYV9uYW1lbGVuLCBvdXRwKTsKLQotCQl0cyA9IChzdHJ1Y3QgdF9zZXJ2ZXIgKillc3AtPmVzX3NlcnZlci5lYV9zZXNzaW9uOwotCQlhc3NlcnQodHMgIT0gTlVMTCk7Ci0JCVBVVENIQVIodHMtPnMubGVuLCBvdXRwKTsKLQkJQkNPUFkodHMtPnMuZGF0YSwgb3V0cCwgdHMtPnMubGVuKTsKLQkJSU5DUFRSKHRzLT5zLmxlbiwgb3V0cCk7Ci0KLQkJaWYgKHRzLT5nLmxlbiA9PSAxICYmIHRzLT5nLmRhdGFbMF0gPT0gMikgewotCQkJUFVUQ0hBUigwLCBvdXRwKTsKLQkJfSBlbHNlIHsKLQkJCVBVVENIQVIodHMtPmcubGVuLCBvdXRwKTsKLQkJCUJDT1BZKHRzLT5nLmRhdGEsIG91dHAsIHRzLT5nLmxlbik7Ci0JCQlJTkNQVFIodHMtPmcubGVuLCBvdXRwKTsKLQkJfQotCi0JCWlmICh0cy0+bi5sZW4gIT0gc2l6ZW9mICh3a21vZHVsdXMpIHx8Ci0JCSAgICBCQ01QKHRzLT5uLmRhdGEsIHdrbW9kdWx1cywgc2l6ZW9mICh3a21vZHVsdXMpKSAhPSAwKSB7Ci0JCQlCQ09QWSh0cy0+bi5kYXRhLCBvdXRwLCB0cy0+bi5sZW4pOwotCQkJSU5DUFRSKHRzLT5uLmxlbiwgb3V0cCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIGVhcFNSUDI6Ci0JCVBVVENIQVIoRUFQVF9TUlAsIG91dHApOwotCQlQVVRDSEFSKEVBUFNSUF9TS0VZLCBvdXRwKTsKLQotCQl0cyA9IChzdHJ1Y3QgdF9zZXJ2ZXIgKillc3AtPmVzX3NlcnZlci5lYV9zZXNzaW9uOwotCQlhc3NlcnQodHMgIT0gTlVMTCk7Ci0JCUJDT1BZKHRzLT5CLmRhdGEsIG91dHAsIHRzLT5CLmxlbik7Ci0JCUlOQ1BUUih0cy0+Qi5sZW4sIG91dHApOwotCQlicmVhazsKLQotCWNhc2UgZWFwU1JQMzoKLQkJUFVUQ0hBUihFQVBUX1NSUCwgb3V0cCk7Ci0JCVBVVENIQVIoRUFQU1JQX1NWQUxJREFUT1IsIG91dHApOwotCQlQVVRMT05HKFNSUFZBTF9FQklULCBvdXRwKTsKLQkJdHMgPSAoc3RydWN0IHRfc2VydmVyICopZXNwLT5lc19zZXJ2ZXIuZWFfc2Vzc2lvbjsKLQkJYXNzZXJ0KHRzICE9IE5VTEwpOwotCQlCQ09QWSh0X3NlcnZlcnJlc3BvbnNlKHRzKSwgb3V0cCwgU0hBX0RJR0VTVFNJWkUpOwotCQlJTkNQVFIoU0hBX0RJR0VTVFNJWkUsIG91dHApOwotCi0JCWlmIChwbmNyeXB0X3NldGtleSgwKSkgewotCQkJLyogR2VuZXJhdGUgcHNldWRvbnltICovCi0JCQlvcHRyID0gb3V0cDsKLQkJCWNwID0gKHVuc2lnbmVkIGNoYXIgKillc3AtPmVzX3NlcnZlci5lYV9wZWVyOwotCQkJaWYgKChqID0gaSA9IGVzcC0+ZXNfc2VydmVyLmVhX3BlZXJsZW4pID4gNykKLQkJCQlqID0gNzsKLQkJCWNsZWFyWzBdID0gaTsKLQkJCUJDT1BZKGNwLCBjbGVhciArIDEsIGopOwotCQkJaSAtPSBqOwotCQkJY3AgKz0gajsKLQkJCWlmICghRGVzRW5jcnlwdChjbGVhciwgY2lwaGVyKSkgewotCQkJCWRiZ2xvZygibm8gREVTIGhlcmU7IG5vdCBnZW5lcmF0aW5nIHBzZXVkb255bSIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJQlpFUk8oJmI2NCwgc2l6ZW9mIChiNjQpKTsKLQkJCW91dHArKzsJCS8qIHNwYWNlIGZvciBwc2V1ZG9ueW0gbGVuZ3RoICovCi0JCQlvdXRwICs9IGI2NGVuYygmYjY0LCBjaXBoZXIsIDgsIG91dHApOwotCQkJd2hpbGUgKGkgPj0gOCkgewotCQkJCSh2b2lkKSBEZXNFbmNyeXB0KGNwLCBjaXBoZXIpOwotCQkJCW91dHAgKz0gYjY0ZW5jKCZiNjQsIGNpcGhlciwgOCwgb3V0cCk7Ci0JCQkJY3AgKz0gODsKLQkJCQlpIC09IDg7Ci0JCQl9Ci0JCQlpZiAoaSA+IDApIHsKLQkJCQlCQ09QWShjcCwgY2xlYXIsIGkpOwotCQkJCWNwICs9IGk7Ci0JCQkJd2hpbGUgKGkgPCA4KSB7Ci0JCQkJCSpjcCsrID0gZHJhbmQ0OCgpICogMHgxMDA7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQkJKHZvaWQpIERlc0VuY3J5cHQoY2xlYXIsIGNpcGhlcik7Ci0JCQkJb3V0cCArPSBiNjRlbmMoJmI2NCwgY2lwaGVyLCA4LCBvdXRwKTsKLQkJCX0KLQkJCW91dHAgKz0gYjY0Zmx1c2goJmI2NCwgb3V0cCk7Ci0KLQkJCS8qIFNldCBsZW5ndGggYW5kIHBhZCBvdXQgdG8gbmV4dCAyMCBvY3RldCBib3VuZGFyeSAqLwotCQkJaSA9IG91dHAgLSBvcHRyIC0gMTsKLQkJCSpvcHRyID0gaTsKLQkJCWkgJT0gU0hBX0RJR0VTVFNJWkU7Ci0JCQlpZiAoaSAhPSAwKSB7Ci0JCQkJd2hpbGUgKGkgPCBTSEFfRElHRVNUU0laRSkgewotCQkJCQkqb3V0cCsrID0gZHJhbmQ0OCgpICogMHgxMDA7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qIE9ic2N1cmUgdGhlIHBzZXVkb255bSB3aXRoIFNIQTEgaGFzaCAqLwotCQkJU0hBMUluaXQoJmN0eHQpOwotCQkJU0hBMVVwZGF0ZSgmY3R4dCwgJmVzcC0+ZXNfc2VydmVyLmVhX2lkLCAxKTsKLQkJCVNIQTFVcGRhdGUoJmN0eHQsIGVzcC0+ZXNfc2VydmVyLmVhX3NrZXksCi0JCQkgICAgU0VTU0lPTl9LRVlfTEVOKTsKLQkJCVNIQTFVcGRhdGUoJmN0eHQsIGVzcC0+ZXNfc2VydmVyLmVhX3BlZXIsCi0JCQkgICAgZXNwLT5lc19zZXJ2ZXIuZWFfcGVlcmxlbik7Ci0JCQl3aGlsZSAob3B0ciA8IG91dHApIHsKLQkJCQlTSEExRmluYWwoZGlnLCAmY3R4dCk7Ci0JCQkJY3AgPSBkaWc7Ci0JCQkJd2hpbGUgKGNwIDwgZGlnICsgU0hBX0RJR0VTVFNJWkUpCi0JCQkJCSpvcHRyKysgXj0gKmNwKys7Ci0JCQkJU0hBMUluaXQoJmN0eHQpOwotCQkJCVNIQTFVcGRhdGUoJmN0eHQsICZlc3AtPmVzX3NlcnZlci5lYV9pZCwgMSk7Ci0JCQkJU0hBMVVwZGF0ZSgmY3R4dCwgZXNwLT5lc19zZXJ2ZXIuZWFfc2tleSwKLQkJCQkgICAgU0VTU0lPTl9LRVlfTEVOKTsKLQkJCQlTSEExVXBkYXRlKCZjdHh0LCBvcHRyIC0gU0hBX0RJR0VTVFNJWkUsCi0JCQkJICAgIFNIQV9ESUdFU1RTSVpFKTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQotCWNhc2UgZWFwU1JQNDoKLQkJUFVUQ0hBUihFQVBUX1NSUCwgb3V0cCk7Ci0JCVBVVENIQVIoRUFQU1JQX0xXUkVDSEFMTEVOR0UsIG91dHApOwotCQljaGFsbGVuID0gTUlOX0NIQUxMRU5HRV9MRU5HVEggKwotCQkgICAgKChNQVhfQ0hBTExFTkdFX0xFTkdUSCAtIE1JTl9DSEFMTEVOR0VfTEVOR1RIKSAqIGRyYW5kNDgoKSk7Ci0JCWVzcC0+ZXNfY2hhbGxlbiA9IGNoYWxsZW47Ci0JCXB0ciA9IGVzcC0+ZXNfY2hhbGxlbmdlOwotCQl3aGlsZSAoLS1jaGFsbGVuID49IDApCi0JCQkqcHRyKysgPSBkcmFuZDQ4KCkgKiAweDEwMDsKLQkJQkNPUFkoZXNwLT5lc19jaGFsbGVuZ2UsIG91dHAsIGVzcC0+ZXNfY2hhbGxlbik7Ci0JCUlOQ1BUUihlc3AtPmVzX2NoYWxsZW4sIG91dHApOwotCQlicmVhazsKLSNlbmRpZiAvKiBVU0VfU1JQICovCi0KLQlkZWZhdWx0OgotCQlyZXR1cm47Ci0JfQotCi0Jb3V0bGVuID0gKG91dHAgLSBvdXRwYWNrZXRfYnVmKSAtIFBQUF9IRFJMRU47Ci0JUFVUU0hPUlQob3V0bGVuLCBsZW5sb2MpOwotCi0Jb3V0cHV0KGVzcC0+ZXNfdW5pdCwgb3V0cGFja2V0X2J1Ziwgb3V0bGVuICsgUFBQX0hEUkxFTik7Ci0KLQllc3AtPmVzX3NlcnZlci5lYV9yZXF1ZXN0cysrOwotCi0JaWYgKGVzcC0+ZXNfc2VydmVyLmVhX3RpbWVvdXQgPiAwKQotCQlUSU1FT1VUKGVhcF9zZXJ2ZXJfdGltZW91dCwgZXNwLCBlc3AtPmVzX3NlcnZlci5lYV90aW1lb3V0KTsKLX0KLQotLyoKLSAqIGVhcF9hdXRocGVlciAtIEF1dGhlbnRpY2F0ZSBvdXIgcGVlciAoYmVoYXZlIGFzIHNlcnZlcikuCi0gKgotICogU3RhcnQgc2VydmVyIHN0YXRlIGFuZCBzZW5kIGZpcnN0IHJlcXVlc3QuICBUaGlzIGlzIGNhbGxlZCBvbmx5Ci0gKiBhZnRlciBlYXBfbG93ZXJ1cC4KLSAqLwotdm9pZAotZWFwX2F1dGhwZWVyKHVuaXQsIGxvY2FsbmFtZSkKLWludCB1bml0OwotY2hhciAqbG9jYWxuYW1lOwotewotCWVhcF9zdGF0ZSAqZXNwID0gJmVhcF9zdGF0ZXNbdW5pdF07Ci0KLQkvKiBTYXZlIHRoZSBuYW1lIHdlJ3JlIGdpdmVuLiAqLwotCWVzcC0+ZXNfc2VydmVyLmVhX25hbWUgPSBsb2NhbG5hbWU7Ci0JZXNwLT5lc19zZXJ2ZXIuZWFfbmFtZWxlbiA9IHN0cmxlbihsb2NhbG5hbWUpOwotCi0JZXNwLT5lc19zYXZlZHRpbWUgPSBlc3AtPmVzX3NlcnZlci5lYV90aW1lb3V0OwotCi0JLyogTG93ZXIgbGF5ZXIgdXAgeWV0PyAqLwotCWlmIChlc3AtPmVzX3NlcnZlci5lYV9zdGF0ZSA9PSBlYXBJbml0aWFsIHx8Ci0JICAgIGVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlID09IGVhcFBlbmRpbmcpIHsKLQkJZXNwLT5lc19zZXJ2ZXIuZWFfc3RhdGUgPSBlYXBQZW5kaW5nOwotCQlyZXR1cm47Ci0JfQotCi0JZXNwLT5lc19zZXJ2ZXIuZWFfc3RhdGUgPSBlYXBQZW5kaW5nOwotCi0JLyogSUQgbnVtYmVyIG5vdCB1cGRhdGVkIGhlcmUgaW50ZW50aW9uYWxseTsgaGFzaGVkIGludG8gTTEgKi8KLQllYXBfc2VuZF9yZXF1ZXN0KGVzcCk7Ci19Ci0KLS8qCi0gKiBlYXBfc2VydmVyX3RpbWVvdXQgLSBSZXRyYW5zbWlzc2lvbiB0aW1lciBmb3Igc2VuZGluZyBSZXF1ZXN0cwotICogZXhwaXJlZC4KLSAqLwotc3RhdGljIHZvaWQKLWVhcF9zZXJ2ZXJfdGltZW91dChhcmcpCi12b2lkICphcmc7Ci17Ci0JZWFwX3N0YXRlICplc3AgPSAoZWFwX3N0YXRlICopIGFyZzsKLQotCWlmICghZWFwX3NlcnZlcl9hY3RpdmUoZXNwKSkKLQkJcmV0dXJuOwotCi0JLyogRUFQIElEIG51bWJlciBtdXN0IG5vdCBjaGFuZ2Ugb24gdGltZW91dC4gKi8KLQllYXBfc2VuZF9yZXF1ZXN0KGVzcCk7Ci19Ci0KLS8qCi0gKiBXaGVuIGl0J3MgdGltZSB0byBzZW5kIHJlY2hhbGxlbmdlIHRoZSBwZWVyLCB0aGlzIHRpbWVvdXQgaXMKLSAqIGNhbGxlZC4gIE9uY2UgdGhlIHJlY2hhbGxlbmdlIGlzIHN1Y2Nlc3NmdWwsIHRoZSByZXNwb25zZSBoYW5kbGVyCi0gKiB3aWxsIHJlc3RhcnQgdGhlIHRpbWVyLiAgSWYgaXQgZmFpbHMsIHRoZW4gdGhlIGxpbmsgaXMgZHJvcHBlZC4KLSAqLwotc3RhdGljIHZvaWQKLWVhcF9yZWNoYWxsZW5nZShhcmcpCi12b2lkICphcmc7Ci17Ci0JZWFwX3N0YXRlICplc3AgPSAoZWFwX3N0YXRlICopYXJnOwotCi0JaWYgKGVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlICE9IGVhcE9wZW4gJiYKLQkgICAgZXNwLT5lc19zZXJ2ZXIuZWFfc3RhdGUgIT0gZWFwU1JQNCkKLQkJcmV0dXJuOwotCi0JZXNwLT5lc19zZXJ2ZXIuZWFfcmVxdWVzdHMgPSAwOwotCWVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlID0gZWFwSWRlbnRpZnk7Ci0JZWFwX2ZpZ3VyZV9uZXh0X3N0YXRlKGVzcCwgMCk7Ci0JZXNwLT5lc19zZXJ2ZXIuZWFfaWQrKzsKLQllYXBfc2VuZF9yZXF1ZXN0KGVzcCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zcnBfbHdyZWNoYWxsZW5nZShhcmcpCi12b2lkICphcmc7Ci17Ci0JZWFwX3N0YXRlICplc3AgPSAoZWFwX3N0YXRlICopYXJnOwotCi0JaWYgKGVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlICE9IGVhcE9wZW4gfHwKLQkgICAgZXNwLT5lc19zZXJ2ZXIuZWFfdHlwZSAhPSBFQVBUX1NSUCkKLQkJcmV0dXJuOwotCi0JZXNwLT5lc19zZXJ2ZXIuZWFfcmVxdWVzdHMgPSAwOwotCWVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlID0gZWFwU1JQNDsKLQllc3AtPmVzX3NlcnZlci5lYV9pZCsrOwotCWVhcF9zZW5kX3JlcXVlc3QoZXNwKTsKLX0KLQotLyoKLSAqIGVhcF9sb3dlcnVwIC0gVGhlIGxvd2VyIGxheWVyIGlzIG5vdyB1cC4KLSAqCi0gKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgZWl0aGVyIGVhcF9hdXRocGVlciBvciBlYXBfYXV0aHdpdGhwZWVyLiAgU2VlCi0gKiBsaW5rX2VzdGFibGlzaGVkKCkgaW4gYXV0aC5jLiAgQWxsIHRoYXQncyBuZWNlc3NhcnkgaGVyZSBpcyB0bwotICogcmV0dXJuIHRvIGNsb3NlZCBzdGF0ZSBzbyB0aGF0IHRob3NlIHR3byByb3V0aW5lcyB3aWxsIGRvIHRoZSByaWdodAotICogdGhpbmcuCi0gKi8KLXN0YXRpYyB2b2lkCi1lYXBfbG93ZXJ1cCh1bml0KQotaW50IHVuaXQ7Ci17Ci0JZWFwX3N0YXRlICplc3AgPSAmZWFwX3N0YXRlc1t1bml0XTsKLQotCS8qIERpc2NhcmQgYW55IChwb3NzaWJseSBhdXRoZW50aWNhdGVkKSBwZWVyIG5hbWUuICovCi0JaWYgKGVzcC0+ZXNfc2VydmVyLmVhX3BlZXIgIT0gTlVMTCAmJgotCSAgICBlc3AtPmVzX3NlcnZlci5lYV9wZWVyICE9IHJlbW90ZV9uYW1lKQotCQlmcmVlKGVzcC0+ZXNfc2VydmVyLmVhX3BlZXIpOwotCWVzcC0+ZXNfc2VydmVyLmVhX3BlZXIgPSBOVUxMOwotCWlmIChlc3AtPmVzX2NsaWVudC5lYV9wZWVyICE9IE5VTEwpCi0JCWZyZWUoZXNwLT5lc19jbGllbnQuZWFfcGVlcik7Ci0JZXNwLT5lc19jbGllbnQuZWFfcGVlciA9IE5VTEw7Ci0KLQllc3AtPmVzX2NsaWVudC5lYV9zdGF0ZSA9IGVhcENsb3NlZDsKLQllc3AtPmVzX3NlcnZlci5lYV9zdGF0ZSA9IGVhcENsb3NlZDsKLX0KLQotLyoKLSAqIGVhcF9sb3dlcmRvd24gLSBUaGUgbG93ZXIgbGF5ZXIgaXMgbm93IGRvd24uCi0gKgotICogQ2FuY2VsIGFsbCB0aW1lb3V0cyBhbmQgcmV0dXJuIHRvIGluaXRpYWwgc3RhdGUuCi0gKi8KLXN0YXRpYyB2b2lkCi1lYXBfbG93ZXJkb3duKHVuaXQpCi1pbnQgdW5pdDsKLXsKLQllYXBfc3RhdGUgKmVzcCA9ICZlYXBfc3RhdGVzW3VuaXRdOwotCi0JaWYgKGVhcF9jbGllbnRfYWN0aXZlKGVzcCkgJiYgZXNwLT5lc19jbGllbnQuZWFfdGltZW91dCA+IDApIHsKLQkJVU5USU1FT1VUKGVhcF9jbGllbnRfdGltZW91dCwgKHZvaWQgKillc3ApOwotCX0KLQlpZiAoZWFwX3NlcnZlcl9hY3RpdmUoZXNwKSkgewotCQlpZiAoZXNwLT5lc19zZXJ2ZXIuZWFfdGltZW91dCA+IDApIHsKLQkJCVVOVElNRU9VVChlYXBfc2VydmVyX3RpbWVvdXQsICh2b2lkICopZXNwKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmICgoZXNwLT5lc19zZXJ2ZXIuZWFfc3RhdGUgPT0gZWFwT3BlbiB8fAotCQkgICAgZXNwLT5lc19zZXJ2ZXIuZWFfc3RhdGUgPT0gZWFwU1JQNCkgJiYKLQkJICAgIGVzcC0+ZXNfcmVjaGFsbGVuZ2UgPiAwKSB7Ci0JCQlVTlRJTUVPVVQoZWFwX3JlY2hhbGxlbmdlLCAodm9pZCAqKWVzcCk7Ci0JCX0KLQkJaWYgKGVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlID09IGVhcE9wZW4gJiYKLQkJICAgIGVzcC0+ZXNfbHdyZWNoYWxsZW5nZSA+IDApIHsKLQkJCVVOVElNRU9VVChzcnBfbHdyZWNoYWxsZW5nZSwgKHZvaWQgKillc3ApOwotCQl9Ci0JfQotCi0JZXNwLT5lc19jbGllbnQuZWFfc3RhdGUgPSBlc3AtPmVzX3NlcnZlci5lYV9zdGF0ZSA9IGVhcEluaXRpYWw7Ci0JZXNwLT5lc19jbGllbnQuZWFfcmVxdWVzdHMgPSBlc3AtPmVzX3NlcnZlci5lYV9yZXF1ZXN0cyA9IDA7Ci19Ci0KLS8qCi0gKiBlYXBfcHJvdHJlaiAtIFBlZXIgZG9lc24ndCBzcGVhayB0aGlzIHByb3RvY29sLgotICoKLSAqIFRoaXMgc2hvdWxkbid0IGhhcHBlbi4gIElmIGl0IGRvZXMsIGl0IHJlcHJlc2VudHMgYXV0aGVudGljYXRpb24KLSAqIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyB2b2lkCi1lYXBfcHJvdHJlaih1bml0KQotaW50IHVuaXQ7Ci17Ci0JZWFwX3N0YXRlICplc3AgPSAmZWFwX3N0YXRlc1t1bml0XTsKLQotCWlmIChlYXBfY2xpZW50X2FjdGl2ZShlc3ApKSB7Ci0JCWVycm9yKCJFQVAgYXV0aGVudGljYXRpb24gZmFpbGVkIGR1ZSB0byBQcm90b2NvbC1SZWplY3QiKTsKLQkJYXV0aF93aXRocGVlcl9mYWlsKHVuaXQsIFBQUF9FQVApOwotCX0KLQlpZiAoZWFwX3NlcnZlcl9hY3RpdmUoZXNwKSkgewotCQllcnJvcigiRUFQIGF1dGhlbnRpY2F0aW9uIG9mIHBlZXIgZmFpbGVkIG9uIFByb3RvY29sLVJlamVjdCIpOwotCQlhdXRoX3BlZXJfZmFpbCh1bml0LCBQUFBfRUFQKTsKLQl9Ci0JZWFwX2xvd2VyZG93bih1bml0KTsKLX0KLQotLyoKLSAqIEZvcm1hdCBhbmQgc2VuZCBhIHJlZ3VsYXIgRUFQIFJlc3BvbnNlIG1lc3NhZ2UuCi0gKi8KLXN0YXRpYyB2b2lkCi1lYXBfc2VuZF9yZXNwb25zZShlc3AsIGlkLCB0eXBlbnVtLCBzdHIsIGxlbnN0cikKLWVhcF9zdGF0ZSAqZXNwOwotdV9jaGFyIGlkOwotdV9jaGFyIHR5cGVudW07Ci11X2NoYXIgKnN0cjsKLWludCBsZW5zdHI7Ci17Ci0JdV9jaGFyICpvdXRwOwotCWludCBtc2dsZW47Ci0KLQlvdXRwID0gb3V0cGFja2V0X2J1ZjsKLQotCU1BS0VIRUFERVIob3V0cCwgUFBQX0VBUCk7Ci0KLQlQVVRDSEFSKEVBUF9SRVNQT05TRSwgb3V0cCk7Ci0JUFVUQ0hBUihpZCwgb3V0cCk7Ci0JZXNwLT5lc19jbGllbnQuZWFfaWQgPSBpZDsKLQltc2dsZW4gPSBFQVBfSEVBREVSTEVOICsgc2l6ZW9mICh1X2NoYXIpICsgbGVuc3RyOwotCVBVVFNIT1JUKG1zZ2xlbiwgb3V0cCk7Ci0JUFVUQ0hBUih0eXBlbnVtLCBvdXRwKTsKLQlpZiAobGVuc3RyID4gMCkgewotCQlCQ09QWShzdHIsIG91dHAsIGxlbnN0cik7Ci0JfQotCi0Jb3V0cHV0KGVzcC0+ZXNfdW5pdCwgb3V0cGFja2V0X2J1ZiwgUFBQX0hEUkxFTiArIG1zZ2xlbik7Ci19Ci0KLS8qCi0gKiBGb3JtYXQgYW5kIHNlbmQgYW4gTUQ1LUNoYWxsZW5nZSBFQVAgUmVzcG9uc2UgbWVzc2FnZS4KLSAqLwotc3RhdGljIHZvaWQKLWVhcF9jaGFwX3Jlc3BvbnNlKGVzcCwgaWQsIGhhc2gsIG5hbWUsIG5hbWVsZW4pCi1lYXBfc3RhdGUgKmVzcDsKLXVfY2hhciBpZDsKLXVfY2hhciAqaGFzaDsKLWNoYXIgKm5hbWU7Ci1pbnQgbmFtZWxlbjsKLXsKLQl1X2NoYXIgKm91dHA7Ci0JaW50IG1zZ2xlbjsKLQotCW91dHAgPSBvdXRwYWNrZXRfYnVmOwotICAgIAotCU1BS0VIRUFERVIob3V0cCwgUFBQX0VBUCk7Ci0KLQlQVVRDSEFSKEVBUF9SRVNQT05TRSwgb3V0cCk7Ci0JUFVUQ0hBUihpZCwgb3V0cCk7Ci0JZXNwLT5lc19jbGllbnQuZWFfaWQgPSBpZDsKLQltc2dsZW4gPSBFQVBfSEVBREVSTEVOICsgMiAqIHNpemVvZiAodV9jaGFyKSArIE1ENV9TSUdOQVRVUkVfU0laRSArCi0JICAgIG5hbWVsZW47Ci0JUFVUU0hPUlQobXNnbGVuLCBvdXRwKTsKLQlQVVRDSEFSKEVBUFRfTUQ1Q0hBUCwgb3V0cCk7Ci0JUFVUQ0hBUihNRDVfU0lHTkFUVVJFX1NJWkUsIG91dHApOwotCUJDT1BZKGhhc2gsIG91dHAsIE1ENV9TSUdOQVRVUkVfU0laRSk7Ci0JSU5DUFRSKE1ENV9TSUdOQVRVUkVfU0laRSwgb3V0cCk7Ci0JaWYgKG5hbWVsZW4gPiAwKSB7Ci0JCUJDT1BZKG5hbWUsIG91dHAsIG5hbWVsZW4pOwotCX0KLQotCW91dHB1dChlc3AtPmVzX3VuaXQsIG91dHBhY2tldF9idWYsIFBQUF9IRFJMRU4gKyBtc2dsZW4pOwotfQotCi0jaWZkZWYgVVNFX1NSUAotLyoKLSAqIEZvcm1hdCBhbmQgc2VuZCBhIFNSUCBFQVAgUmVzcG9uc2UgbWVzc2FnZS4KLSAqLwotc3RhdGljIHZvaWQKLWVhcF9zcnBfcmVzcG9uc2UoZXNwLCBpZCwgc3VidHlwZW51bSwgc3RyLCBsZW5zdHIpCi1lYXBfc3RhdGUgKmVzcDsKLXVfY2hhciBpZDsKLXVfY2hhciBzdWJ0eXBlbnVtOwotdV9jaGFyICpzdHI7Ci1pbnQgbGVuc3RyOwotewotCXVfY2hhciAqb3V0cDsKLQlpbnQgbXNnbGVuOwotCi0Jb3V0cCA9IG91dHBhY2tldF9idWY7Ci0gICAgCi0JTUFLRUhFQURFUihvdXRwLCBQUFBfRUFQKTsKLQotCVBVVENIQVIoRUFQX1JFU1BPTlNFLCBvdXRwKTsKLQlQVVRDSEFSKGlkLCBvdXRwKTsKLQllc3AtPmVzX2NsaWVudC5lYV9pZCA9IGlkOwotCW1zZ2xlbiA9IEVBUF9IRUFERVJMRU4gKyAyICogc2l6ZW9mICh1X2NoYXIpICsgbGVuc3RyOwotCVBVVFNIT1JUKG1zZ2xlbiwgb3V0cCk7Ci0JUFVUQ0hBUihFQVBUX1NSUCwgb3V0cCk7Ci0JUFVUQ0hBUihzdWJ0eXBlbnVtLCBvdXRwKTsKLQlpZiAobGVuc3RyID4gMCkgewotCQlCQ09QWShzdHIsIG91dHAsIGxlbnN0cik7Ci0JfQotCi0Jb3V0cHV0KGVzcC0+ZXNfdW5pdCwgb3V0cGFja2V0X2J1ZiwgUFBQX0hEUkxFTiArIG1zZ2xlbik7Ci19Ci0KLS8qCi0gKiBGb3JtYXQgYW5kIHNlbmQgYSBTUlAgRUFQIENsaWVudCBWYWxpZGF0b3IgUmVzcG9uc2UgbWVzc2FnZS4KLSAqLwotc3RhdGljIHZvaWQKLWVhcF9zcnB2YWxfcmVzcG9uc2UoZXNwLCBpZCwgZmxhZ3MsIHN0cikKLWVhcF9zdGF0ZSAqZXNwOwotdV9jaGFyIGlkOwotdV9pbnQzMl90IGZsYWdzOwotdV9jaGFyICpzdHI7Ci17Ci0JdV9jaGFyICpvdXRwOwotCWludCBtc2dsZW47Ci0KLQlvdXRwID0gb3V0cGFja2V0X2J1ZjsKLSAgICAKLQlNQUtFSEVBREVSKG91dHAsIFBQUF9FQVApOwotCi0JUFVUQ0hBUihFQVBfUkVTUE9OU0UsIG91dHApOwotCVBVVENIQVIoaWQsIG91dHApOwotCWVzcC0+ZXNfY2xpZW50LmVhX2lkID0gaWQ7Ci0JbXNnbGVuID0gRUFQX0hFQURFUkxFTiArIDIgKiBzaXplb2YgKHVfY2hhcikgKyBzaXplb2YgKHVfaW50MzJfdCkgKwotCSAgICBTSEFfRElHRVNUU0laRTsKLQlQVVRTSE9SVChtc2dsZW4sIG91dHApOwotCVBVVENIQVIoRUFQVF9TUlAsIG91dHApOwotCVBVVENIQVIoRUFQU1JQX0NWQUxJREFUT1IsIG91dHApOwotCVBVVExPTkcoZmxhZ3MsIG91dHApOwotCUJDT1BZKHN0ciwgb3V0cCwgU0hBX0RJR0VTVFNJWkUpOwotCi0Jb3V0cHV0KGVzcC0+ZXNfdW5pdCwgb3V0cGFja2V0X2J1ZiwgUFBQX0hEUkxFTiArIG1zZ2xlbik7Ci19Ci0jZW5kaWYgLyogVVNFX1NSUCAqLwotCi1zdGF0aWMgdm9pZAotZWFwX3NlbmRfbmFrKGVzcCwgaWQsIHR5cGUpCi1lYXBfc3RhdGUgKmVzcDsKLXVfY2hhciBpZDsKLXVfY2hhciB0eXBlOwotewotCXVfY2hhciAqb3V0cDsKLQlpbnQgbXNnbGVuOwotCi0Jb3V0cCA9IG91dHBhY2tldF9idWY7Ci0KLQlNQUtFSEVBREVSKG91dHAsIFBQUF9FQVApOwotCi0JUFVUQ0hBUihFQVBfUkVTUE9OU0UsIG91dHApOwotCVBVVENIQVIoaWQsIG91dHApOwotCWVzcC0+ZXNfY2xpZW50LmVhX2lkID0gaWQ7Ci0JbXNnbGVuID0gRUFQX0hFQURFUkxFTiArIDIgKiBzaXplb2YgKHVfY2hhcik7Ci0JUFVUU0hPUlQobXNnbGVuLCBvdXRwKTsKLQlQVVRDSEFSKEVBUFRfTkFLLCBvdXRwKTsKLQlQVVRDSEFSKHR5cGUsIG91dHApOwotCi0Jb3V0cHV0KGVzcC0+ZXNfdW5pdCwgb3V0cGFja2V0X2J1ZiwgUFBQX0hEUkxFTiArIG1zZ2xlbik7Ci19Ci0KLSNpZmRlZiBVU0VfU1JQCi1zdGF0aWMgY2hhciAqCi1uYW1lX29mX3BuX2ZpbGUoKQotewotCWNoYXIgKnVzZXIsICpwYXRoLCAqZmlsZTsKLQlzdHJ1Y3QgcGFzc3dkICpwdzsKLQlzaXplX3QgcGw7Ci0Jc3RhdGljIGJvb2wgcG5sb2dnZWQgPSAwOwotCi0JcHcgPSBnZXRwd3VpZChnZXR1aWQoKSk7Ci0JaWYgKHB3ID09IE5VTEwgfHwgKHVzZXIgPSBwdy0+cHdfZGlyKSA9PSBOVUxMIHx8IHVzZXJbMF0gPT0gMCkgewotCQllcnJubyA9IEVJTlZBTDsKLQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0JZmlsZSA9IF9QQVRIX1BTRVVET05ZTTsKLQlwbCA9IHN0cmxlbih1c2VyKSArIHN0cmxlbihmaWxlKSArIDI7Ci0JcGF0aCA9IG1hbGxvYyhwbCk7Ci0JaWYgKHBhdGggPT0gTlVMTCkKLQkJcmV0dXJuIChOVUxMKTsKLQkodm9pZCkgc2xwcmludGYocGF0aCwgcGwsICIlcy8lcyIsIHVzZXIsIGZpbGUpOwotCWlmICghcG5sb2dnZWQpIHsKLQkJZGJnbG9nKCJwc2V1ZG9ueW0gZmlsZTogJXMiLCBwYXRoKTsKLQkJcG5sb2dnZWQgPSAxOwotCX0KLQlyZXR1cm4gKHBhdGgpOwotfQotCi1zdGF0aWMgaW50Ci1vcGVuX3BuX2ZpbGUobW9kZWJpdHMpCi1tb2RlX3QgbW9kZWJpdHM7Ci17Ci0JY2hhciAqcGF0aDsKLQlpbnQgZmQsIGVycjsKLQotCWlmICgocGF0aCA9IG5hbWVfb2ZfcG5fZmlsZSgpKSA9PSBOVUxMKQotCQlyZXR1cm4gKC0xKTsKLQlmZCA9IG9wZW4ocGF0aCwgbW9kZWJpdHMsIFNfSVJVU1IgfCBTX0lXVVNSKTsKLQllcnIgPSBlcnJubzsKLQlmcmVlKHBhdGgpOwotCWVycm5vID0gZXJyOwotCXJldHVybiAoZmQpOwotfQotCi1zdGF0aWMgdm9pZAotcmVtb3ZlX3BuX2ZpbGUoKQotewotCWNoYXIgKnBhdGg7Ci0KLQlpZiAoKHBhdGggPSBuYW1lX29mX3BuX2ZpbGUoKSkgIT0gTlVMTCkgewotCQkodm9pZCkgdW5saW5rKHBhdGgpOwotCQkodm9pZCkgZnJlZShwYXRoKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi13cml0ZV9wc2V1ZG9ueW0oZXNwLCBpbnAsIGxlbiwgaWQpCi1lYXBfc3RhdGUgKmVzcDsKLXVfY2hhciAqaW5wOwotaW50IGxlbiwgaWQ7Ci17Ci0JdV9jaGFyIHZhbDsKLQl1X2NoYXIgKmRhdHAsICpkaWdwOwotCVNIQTFfQ1RYIGN0eHQ7Ci0JdV9jaGFyIGRpZ1tTSEFfRElHRVNUU0laRV07Ci0JaW50IGRzaXplLCBmZCwgb2xlbiA9IGxlbjsKLQotCS8qCi0JICogRG8gdGhlIGRlY29kaW5nIGJ5IHdvcmtpbmcgYmFja3dhcmRzLiAgVGhpcyBlbGltaW5hdGVzIHRoZSBuZWVkCi0JICogdG8gc2F2ZSB0aGUgZGVjb2RlZCBvdXRwdXQgaW4gYSBzZXBhcmF0ZSBidWZmZXIuCi0JICovCi0JdmFsID0gaWQ7Ci0Jd2hpbGUgKGxlbiA+IDApIHsKLQkJaWYgKChkc2l6ZSA9IGxlbiAlIFNIQV9ESUdFU1RTSVpFKSA9PSAwKQotCQkJZHNpemUgPSBTSEFfRElHRVNUU0laRTsKLQkJbGVuIC09IGRzaXplOwotCQlkYXRwID0gaW5wICsgbGVuOwotCQlTSEExSW5pdCgmY3R4dCk7Ci0JCVNIQTFVcGRhdGUoJmN0eHQsICZ2YWwsIDEpOwotCQlTSEExVXBkYXRlKCZjdHh0LCBlc3AtPmVzX2NsaWVudC5lYV9za2V5LCBTRVNTSU9OX0tFWV9MRU4pOwotCQlpZiAobGVuID4gMCkgewotCQkJU0hBMVVwZGF0ZSgmY3R4dCwgZGF0cCwgU0hBX0RJR0VTVFNJWkUpOwotCQl9IGVsc2UgewotCQkJU0hBMVVwZGF0ZSgmY3R4dCwgZXNwLT5lc19jbGllbnQuZWFfbmFtZSwKLQkJCSAgICBlc3AtPmVzX2NsaWVudC5lYV9uYW1lbGVuKTsKLQkJfQotCQlTSEExRmluYWwoZGlnLCAmY3R4dCk7Ci0JCWZvciAoZGlncCA9IGRpZzsgZGlncCA8IGRpZyArIFNIQV9ESUdFU1RTSVpFOyBkaWdwKyspCi0JCQkqZGF0cCsrIF49ICpkaWdwOwotCX0KLQotCS8qIE5vdyBjaGVjayB0aGF0IHRoZSByZXN1bHQgaXMgc2FuZSAqLwotCWlmIChvbGVuIDw9IDAgfHwgKmlucCArIDEgPiBvbGVuKSB7Ci0JCWRiZ2xvZygiRUFQOiBkZWNvZGVkIHBzZXVkb255bSBpcyB1bnVzYWJsZSA8JS4qQj4iLCBvbGVuLCBpbnApOwotCQlyZXR1cm47Ci0JfQotCi0JLyogU2F2ZSBpdCBhd2F5ICovCi0JZmQgPSBvcGVuX3BuX2ZpbGUoT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyk7Ci0JaWYgKGZkIDwgMCkgewotCQlkYmdsb2coIkVBUDogZXJyb3Igc2F2aW5nIHBzZXVkb255bTogJW0iKTsKLQkJcmV0dXJuOwotCX0KLQlsZW4gPSB3cml0ZShmZCwgaW5wICsgMSwgKmlucCk7Ci0JaWYgKGNsb3NlKGZkKSAhPSAtMSAmJiBsZW4gPT0gKmlucCkgewotCQlkYmdsb2coIkVBUDogc2F2ZWQgcHNldWRvbnltIik7Ci0JCWVzcC0+ZXNfdXNlZHBzZXVkbyA9IDA7Ci0JfSBlbHNlIHsKLQkJZGJnbG9nKCJFQVA6IGZhaWxlZCB0byBzYXZlIHBzZXVkb255bSIpOwotCQlyZW1vdmVfcG5fZmlsZSgpOwotCX0KLX0KLSNlbmRpZiAvKiBVU0VfU1JQICovCi0KLS8qCi0gKiBlYXBfcmVxdWVzdCAtIFJlY2VpdmUgRUFQIFJlcXVlc3QgbWVzc2FnZSAoY2xpZW50IG1vZGUpLgotICovCi1zdGF0aWMgdm9pZAotZWFwX3JlcXVlc3QoZXNwLCBpbnAsIGlkLCBsZW4pCi1lYXBfc3RhdGUgKmVzcDsKLXVfY2hhciAqaW5wOwotaW50IGlkOwotaW50IGxlbjsKLXsKLQl1X2NoYXIgdHlwZW51bTsKLQl1X2NoYXIgdmFsbGVuOwotCWludCBzZWNyZXRfbGVuOwotCWNoYXIgc2VjcmV0W01BWFdPUkRMRU5dOwotCWNoYXIgcmhvc3RuYW1lWzI1Nl07Ci0JTUQ1X0NUWCBtZENvbnRleHQ7Ci0JdV9jaGFyIGhhc2hbTUQ1X1NJR05BVFVSRV9TSVpFXTsKLSNpZmRlZiBVU0VfU1JQCi0Jc3RydWN0IHRfY2xpZW50ICp0YzsKLQlzdHJ1Y3QgdF9udW0gc3ZhbCwgZ3ZhbCwgTnZhbCwgKkFwLCBCdmFsOwotCXVfY2hhciB2YWxzWzJdOwotCVNIQTFfQ1RYIGN0eHQ7Ci0JdV9jaGFyIGRpZ1tTSEFfRElHRVNUU0laRV07Ci0JaW50IGZkOwotI2VuZGlmIC8qIFVTRV9TUlAgKi8KLQotCS8qCi0JICogTm90ZTogd2UgdXBkYXRlIGVzX2NsaWVudC5lYV9pZCAqb25seSBpZiogYSBSZXNwb25zZQotCSAqIG1lc3NhZ2UgaXMgYmVpbmcgZ2VuZXJhdGVkLiAgT3RoZXJ3aXNlLCB3ZSBsZWF2ZSBpdCB0aGUKLQkgKiBzYW1lIGZvciBkdXBsaWNhdGUgZGV0ZWN0aW9uIHB1cnBvc2VzLgotCSAqLwotCi0JZXNwLT5lc19jbGllbnQuZWFfcmVxdWVzdHMrKzsKLQlpZiAoZXNwLT5lc19jbGllbnQuZWFfbWF4cmVxdWVzdHMgIT0gMCAmJgotCSAgICBlc3AtPmVzX2NsaWVudC5lYV9yZXF1ZXN0cyA+IGVzcC0+ZXNfY2xpZW50LmVhX21heHJlcXVlc3RzKSB7Ci0JCWluZm8oIkVBUDogcmVjZWl2ZWQgdG9vIG1hbnkgUmVxdWVzdCBtZXNzYWdlcyIpOwotCQlpZiAoZXNwLT5lc19jbGllbnQuZWFfdGltZW91dCA+IDApIHsKLQkJCVVOVElNRU9VVChlYXBfY2xpZW50X3RpbWVvdXQsICh2b2lkICopZXNwKTsKLQkJfQotCQlhdXRoX3dpdGhwZWVyX2ZhaWwoZXNwLT5lc191bml0LCBQUFBfRUFQKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChsZW4gPD0gMCkgewotCQllcnJvcigiRUFQOiBlbXB0eSBSZXF1ZXN0IG1lc3NhZ2UgZGlzY2FyZGVkIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlHRVRDSEFSKHR5cGVudW0sIGlucCk7Ci0JbGVuLS07Ci0KLQlzd2l0Y2ggKHR5cGVudW0pIHsKLQljYXNlIEVBUFRfSURFTlRJVFk6Ci0JCWlmIChsZW4gPiAwKQotCQkJaW5mbygiRUFQOiBJZGVudGl0eSBwcm9tcHQgXCIlLipxXCIiLCBsZW4sIGlucCk7Ci0jaWZkZWYgVVNFX1NSUAotCQlpZiAoZXNwLT5lc191c2Vwc2V1ZG8gJiYKLQkJICAgIChlc3AtPmVzX3VzZWRwc2V1ZG8gPT0gMCB8fAotCQkJKGVzcC0+ZXNfdXNlZHBzZXVkbyA9PSAxICYmCi0JCQkgICAgaWQgPT0gZXNwLT5lc19jbGllbnQuZWFfaWQpKSkgewotCQkJZXNwLT5lc191c2VkcHNldWRvID0gMTsKLQkJCS8qIFRyeSB0byBnZXQgYSBwc2V1ZG9ueW0gKi8KLQkJCWlmICgoZmQgPSBvcGVuX3BuX2ZpbGUoT19SRE9OTFkpKSA+PSAwKSB7Ci0JCQkJc3RyY3B5KHJob3N0bmFtZSwgU1JQX1BTRVVET19JRCk7Ci0JCQkJbGVuID0gcmVhZChmZCwgcmhvc3RuYW1lICsgU1JQX1BTRVVET19MRU4sCi0JCQkJICAgIHNpemVvZiAocmhvc3RuYW1lKSAtIFNSUF9QU0VVRE9fTEVOKTsKLQkJCQkvKiBYWFggTkFJIHVuc3VwcG9ydGVkICovCi0JCQkJaWYgKGxlbiA+IDApIHsKLQkJCQkJZWFwX3NlbmRfcmVzcG9uc2UoZXNwLCBpZCwgdHlwZW51bSwKLQkJCQkJICAgIHJob3N0bmFtZSwgbGVuICsgU1JQX1BTRVVET19MRU4pOwotCQkJCX0KLQkJCQkodm9pZCkgY2xvc2UoZmQpOwotCQkJCWlmIChsZW4gPiAwKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkvKiBTdG9wIHVzaW5nIHBzZXVkb255bSBub3cuICovCi0JCWlmIChlc3AtPmVzX3VzZXBzZXVkbyAmJiBlc3AtPmVzX3VzZWRwc2V1ZG8gIT0gMikgewotCQkJcmVtb3ZlX3BuX2ZpbGUoKTsKLQkJCWVzcC0+ZXNfdXNlZHBzZXVkbyA9IDI7Ci0JCX0KLSNlbmRpZiAvKiBVU0VfU1JQICovCi0JCWVhcF9zZW5kX3Jlc3BvbnNlKGVzcCwgaWQsIHR5cGVudW0sIGVzcC0+ZXNfY2xpZW50LmVhX25hbWUsCi0JCSAgICBlc3AtPmVzX2NsaWVudC5lYV9uYW1lbGVuKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEVBUFRfTk9USUZJQ0FUSU9OOgotCQlpZiAobGVuID4gMCkKLQkJCWluZm8oIkVBUDogTm90aWZpY2F0aW9uIFwiJS4qcVwiIiwgbGVuLCBpbnApOwotCQllYXBfc2VuZF9yZXNwb25zZShlc3AsIGlkLCB0eXBlbnVtLCBOVUxMLCAwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEVBUFRfTkFLOgotCQkvKgotCQkgKiBBdm9pZCB0aGUgdGVtcHRhdGlvbiB0byBzZW5kIFJlc3BvbnNlIE5hayBpbiByZXBseQotCQkgKiB0byBSZXF1ZXN0IE5hayBoZXJlLiAgSXQgY2FuIG9ubHkgbGVhZCB0byB0cm91YmxlLgotCQkgKi8KLQkJd2FybigiRUFQOiB1bmV4cGVjdGVkIE5hayBpbiBSZXF1ZXN0OyBpZ25vcmVkIik7Ci0JCS8qIFJldHVybiBiZWNhdXNlIHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyByZWFsLiAqLwotCQlyZXR1cm47Ci0KLQljYXNlIEVBUFRfTUQ1Q0hBUDoKLQkJaWYgKGxlbiA8IDEpIHsKLQkJCWVycm9yKCJFQVA6IHJlY2VpdmVkIE1ENS1DaGFsbGVuZ2Ugd2l0aCBubyBkYXRhIik7Ci0JCQkvKiBCb2d1cyByZXF1ZXN0OyB3YWl0IGZvciBzb21ldGhpbmcgcmVhbC4gKi8KLQkJCXJldHVybjsKLQkJfQotCQlHRVRDSEFSKHZhbGxlbiwgaW5wKTsKLQkJbGVuLS07Ci0JCWlmICh2YWxsZW4gPCA4IHx8IHZhbGxlbiA+IGxlbikgewotCQkJZXJyb3IoIkVBUDogTUQ1LUNoYWxsZW5nZSB3aXRoIGJhZCBsZW5ndGggJWQgKDguLiVkKSIsCi0JCQkgICAgdmFsbGVuLCBsZW4pOwotCQkJLyogVHJ5IHNvbWV0aGluZyBiZXR0ZXIuICovCi0JCQllYXBfc2VuZF9uYWsoZXNwLCBpZCwgRUFQVF9TUlApOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBOb3Qgc28gbGlrZWx5IHRvIGhhcHBlbi4gKi8KLQkJaWYgKGxlbiAtIHZhbGxlbiA+PSBzaXplb2YgKHJob3N0bmFtZSkpIHsKLQkJCWRiZ2xvZygiRUFQOiB0cmltbWluZyByZWFsbHkgbG9uZyBwZWVyIG5hbWUgZG93biIpOwotCQkJQkNPUFkoaW5wICsgdmFsbGVuLCByaG9zdG5hbWUsIHNpemVvZiAocmhvc3RuYW1lKSAtIDEpOwotCQkJcmhvc3RuYW1lW3NpemVvZiAocmhvc3RuYW1lKSAtIDFdID0gJ1wwJzsKLQkJfSBlbHNlIHsKLQkJCUJDT1BZKGlucCArIHZhbGxlbiwgcmhvc3RuYW1lLCBsZW4gLSB2YWxsZW4pOwotCQkJcmhvc3RuYW1lW2xlbiAtIHZhbGxlbl0gPSAnXDAnOwotCQl9Ci0KLQkJLyogSW4gY2FzZSB0aGUgcmVtb3RlIGRvZXNuJ3QgZ2l2ZSB1cyBoaXMgbmFtZS4gKi8KLQkJaWYgKGV4cGxpY2l0X3JlbW90ZSB8fAotCQkgICAgKHJlbW90ZV9uYW1lWzBdICE9ICdcMCcgJiYgdmFsbGVuID09IGxlbikpCi0JCQlzdHJsY3B5KHJob3N0bmFtZSwgcmVtb3RlX25hbWUsIHNpemVvZiAocmhvc3RuYW1lKSk7Ci0KLQkJLyoKLQkJICogR2V0IHRoZSBzZWNyZXQgZm9yIGF1dGhlbnRpY2F0aW5nIG91cnNlbHZlcyB3aXRoCi0JCSAqIHRoZSBzcGVjaWZpZWQgaG9zdC4KLQkJICovCi0JCWlmICghZ2V0X3NlY3JldChlc3AtPmVzX3VuaXQsIGVzcC0+ZXNfY2xpZW50LmVhX25hbWUsCi0JCSAgICByaG9zdG5hbWUsIHNlY3JldCwgJnNlY3JldF9sZW4sIDApKSB7Ci0JCQlkYmdsb2coIkVBUDogbm8gTUQ1IHNlY3JldCBmb3IgYXV0aCB0byAlcSIsIHJob3N0bmFtZSk7Ci0JCQllYXBfc2VuZF9uYWsoZXNwLCBpZCwgRUFQVF9TUlApOwotCQkJYnJlYWs7Ci0JCX0KLQkJTUQ1X0luaXQoJm1kQ29udGV4dCk7Ci0JCXR5cGVudW0gPSBpZDsKLQkJTUQ1X1VwZGF0ZSgmbWRDb250ZXh0LCAmdHlwZW51bSwgMSk7Ci0JCU1ENV9VcGRhdGUoJm1kQ29udGV4dCwgKHVfY2hhciAqKXNlY3JldCwgc2VjcmV0X2xlbik7Ci0JCUJaRVJPKHNlY3JldCwgc2l6ZW9mIChzZWNyZXQpKTsKLQkJTUQ1X1VwZGF0ZSgmbWRDb250ZXh0LCBpbnAsIHZhbGxlbik7Ci0JCU1ENV9GaW5hbChoYXNoLCAmbWRDb250ZXh0KTsKLQkJZWFwX2NoYXBfcmVzcG9uc2UoZXNwLCBpZCwgaGFzaCwgZXNwLT5lc19jbGllbnQuZWFfbmFtZSwKLQkJICAgIGVzcC0+ZXNfY2xpZW50LmVhX25hbWVsZW4pOwotCQlicmVhazsKLQotI2lmZGVmIFVTRV9TUlAKLQljYXNlIEVBUFRfU1JQOgotCQlpZiAobGVuIDwgMSkgewotCQkJZXJyb3IoIkVBUDogcmVjZWl2ZWQgZW1wdHkgU1JQIFJlcXVlc3QiKTsKLQkJCS8qIEJvZ3VzIHJlcXVlc3Q7IHdhaXQgZm9yIHNvbWV0aGluZyByZWFsLiAqLwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLyogR2V0IHN1YnR5cGUgKi8KLQkJR0VUQ0hBUih2YWxsZW4sIGlucCk7Ci0JCWxlbi0tOwotCQlzd2l0Y2ggKHZhbGxlbikgewotCQljYXNlIEVBUFNSUF9DSEFMTEVOR0U6Ci0JCQl0YyA9IE5VTEw7Ci0JCQlpZiAoZXNwLT5lc19jbGllbnQuZWFfc2Vzc2lvbiAhPSBOVUxMKSB7Ci0JCQkJdGMgPSAoc3RydWN0IHRfY2xpZW50ICopZXNwLT5lc19jbGllbnQuCi0JCQkJICAgIGVhX3Nlc3Npb247Ci0JCQkJLyoKLQkJCQkgKiBJZiB0aGlzIGlzIGEgbmV3IGNoYWxsZW5nZSwgdGhlbiBzdGFydAotCQkJCSAqIG92ZXIgd2l0aCBhIG5ldyBjbGllbnQgc2Vzc2lvbiBjb250ZXh0LgotCQkJCSAqIE90aGVyd2lzZSwganVzdCByZXNlbmQgbGFzdCByZXNwb25zZS4KLQkJCQkgKi8KLQkJCQlpZiAoaWQgIT0gZXNwLT5lc19jbGllbnQuZWFfaWQpIHsKLQkJCQkJdF9jbGllbnRjbG9zZSh0Yyk7Ci0JCQkJCWVzcC0+ZXNfY2xpZW50LmVhX3Nlc3Npb24gPSBOVUxMOwotCQkJCQl0YyA9IE5VTEw7Ci0JCQkJfQotCQkJfQotCQkJLyogTm8gc2Vzc2lvbiBrZXkganVzdCB5ZXQgKi8KLQkJCWVzcC0+ZXNfY2xpZW50LmVhX3NrZXkgPSBOVUxMOwotCQkJaWYgKHRjID09IE5VTEwpIHsKLQkJCQlHRVRDSEFSKHZhbGxlbiwgaW5wKTsKLQkJCQlsZW4tLTsKLQkJCQlpZiAodmFsbGVuID49IGxlbikgewotCQkJCQllcnJvcigiRUFQOiBiYWRseS1mb3JtZWQgU1JQIENoYWxsZW5nZSIKLQkJCQkJICAgICIgKG5hbWUpIik7Ci0JCQkJCS8qIElnbm9yZSBiYWRseS1mb3JtZWQgbWVzc2FnZXMgKi8KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlCQ09QWShpbnAsIHJob3N0bmFtZSwgdmFsbGVuKTsKLQkJCQlyaG9zdG5hbWVbdmFsbGVuXSA9ICdcMCc7Ci0JCQkJSU5DUFRSKHZhbGxlbiwgaW5wKTsKLQkJCQlsZW4gLT0gdmFsbGVuOwotCi0JCQkJLyoKLQkJCQkgKiBJbiBjYXNlIHRoZSByZW1vdGUgZG9lc24ndCBnaXZlIHVzIGhpcyBuYW1lLAotCQkJCSAqIHVzZSBjb25maWd1cmVkIG5hbWUuCi0JCQkJICovCi0JCQkJaWYgKGV4cGxpY2l0X3JlbW90ZSB8fAotCQkJCSAgICAocmVtb3RlX25hbWVbMF0gIT0gJ1wwJyAmJiB2YWxsZW4gPT0gMCkpIHsKLQkJCQkJc3RybGNweShyaG9zdG5hbWUsIHJlbW90ZV9uYW1lLAotCQkJCQkgICAgc2l6ZW9mIChyaG9zdG5hbWUpKTsKLQkJCQl9Ci0KLQkJCQlpZiAoZXNwLT5lc19jbGllbnQuZWFfcGVlciAhPSBOVUxMKQotCQkJCQlmcmVlKGVzcC0+ZXNfY2xpZW50LmVhX3BlZXIpOwotCQkJCWVzcC0+ZXNfY2xpZW50LmVhX3BlZXIgPSBzdHJkdXAocmhvc3RuYW1lKTsKLQkJCQllc3AtPmVzX2NsaWVudC5lYV9wZWVybGVuID0gc3RybGVuKHJob3N0bmFtZSk7Ci0KLQkJCQlHRVRDSEFSKHZhbGxlbiwgaW5wKTsKLQkJCQlsZW4tLTsKLQkJCQlpZiAodmFsbGVuID49IGxlbikgewotCQkJCQllcnJvcigiRUFQOiBiYWRseS1mb3JtZWQgU1JQIENoYWxsZW5nZSIKLQkJCQkJICAgICIgKHMpIik7Ci0JCQkJCS8qIElnbm9yZSBiYWRseS1mb3JtZWQgbWVzc2FnZXMgKi8KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlzdmFsLmRhdGEgPSBpbnA7Ci0JCQkJc3ZhbC5sZW4gPSB2YWxsZW47Ci0JCQkJSU5DUFRSKHZhbGxlbiwgaW5wKTsKLQkJCQlsZW4gLT0gdmFsbGVuOwotCi0JCQkJR0VUQ0hBUih2YWxsZW4sIGlucCk7Ci0JCQkJbGVuLS07Ci0JCQkJaWYgKHZhbGxlbiA+IGxlbikgewotCQkJCQllcnJvcigiRUFQOiBiYWRseS1mb3JtZWQgU1JQIENoYWxsZW5nZSIKLQkJCQkJICAgICIgKGcpIik7Ci0JCQkJCS8qIElnbm9yZSBiYWRseS1mb3JtZWQgbWVzc2FnZXMgKi8KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkvKiBJZiBubyBnZW5lcmF0b3IgcHJlc2VudCwgdGhlbiB1c2UgdmFsdWUgMiAqLwotCQkJCWlmICh2YWxsZW4gPT0gMCkgewotCQkJCQlndmFsLmRhdGEgPSAodV9jaGFyICopIlwwMDIiOwotCQkJCQlndmFsLmxlbiA9IDE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZ3ZhbC5kYXRhID0gaW5wOwotCQkJCQlndmFsLmxlbiA9IHZhbGxlbjsKLQkJCQl9Ci0JCQkJSU5DUFRSKHZhbGxlbiwgaW5wKTsKLQkJCQlsZW4gLT0gdmFsbGVuOwotCi0JCQkJLyoKLQkJCQkgKiBJZiBubyBtb2R1bHVzIHByZXNlbnQsIHRoZW4gdXNlIHdlbGwta25vd24KLQkJCQkgKiB2YWx1ZS4KLQkJCQkgKi8KLQkJCQlpZiAobGVuID09IDApIHsKLQkJCQkJTnZhbC5kYXRhID0gKHVfY2hhciAqKXdrbW9kdWx1czsKLQkJCQkJTnZhbC5sZW4gPSBzaXplb2YgKHdrbW9kdWx1cyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTnZhbC5kYXRhID0gaW5wOwotCQkJCQlOdmFsLmxlbiA9IGxlbjsKLQkJCQl9Ci0JCQkJdGMgPSB0X2NsaWVudG9wZW4oZXNwLT5lc19jbGllbnQuZWFfbmFtZSwKLQkJCQkgICAgJk52YWwsICZndmFsLCAmc3ZhbCk7Ci0JCQkJaWYgKHRjID09IE5VTEwpIHsKLQkJCQkJZWFwX3NlbmRfbmFrKGVzcCwgaWQsIEVBUFRfTUQ1Q0hBUCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQllc3AtPmVzX2NsaWVudC5lYV9zZXNzaW9uID0gKHZvaWQgKil0YzsKLQotCQkJCS8qIEFkZCBDaGFsbGVuZ2UgSUQgJiB0eXBlIHRvIHZlcmlmaWVyICovCi0JCQkJdmFsc1swXSA9IGlkOwotCQkJCXZhbHNbMV0gPSBFQVBUX1NSUDsKLQkJCQl0X2NsaWVudGFkZGV4ZGF0YSh0YywgdmFscywgMik7Ci0JCQl9Ci0JCQlBcCA9IHRfY2xpZW50Z2VuZXhwKHRjKTsKLQkJCWVhcF9zcnBfcmVzcG9uc2UoZXNwLCBpZCwgRUFQU1JQX0NLRVksIEFwLT5kYXRhLAotCQkJICAgIEFwLT5sZW4pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBFQVBTUlBfU0tFWToKLQkJCXRjID0gKHN0cnVjdCB0X2NsaWVudCAqKWVzcC0+ZXNfY2xpZW50LmVhX3Nlc3Npb247Ci0JCQlpZiAodGMgPT0gTlVMTCkgewotCQkJCXdhcm4oIkVBUDogcGVlciBzZW50IFN1YnR5cGUgMiB3aXRob3V0IDEiKTsKLQkJCQllYXBfc2VuZF9uYWsoZXNwLCBpZCwgRUFQVF9NRDVDSEFQKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChlc3AtPmVzX2NsaWVudC5lYV9za2V5ICE9IE5VTEwpIHsKLQkJCQkvKgotCQkJCSAqIElEIG51bWJlciBzaG91bGQgbm90IGNoYW5nZSBoZXJlLiAgV2FybgotCQkJCSAqIGlmIGl0IGRvZXMgKGJ1dCBvdGhlcndpc2UgaWdub3JlKS4KLQkJCQkgKi8KLQkJCQlpZiAoaWQgIT0gZXNwLT5lc19jbGllbnQuZWFfaWQpIHsKLQkJCQkJd2FybigiRUFQOiBJRCBjaGFuZ2VkIGZyb20gJWQgdG8gJWQgIgotCQkJCQkgICAgImluIFNSUCBTdWJ0eXBlIDIgcmV4bWl0IiwKLQkJCQkJICAgIGVzcC0+ZXNfY2xpZW50LmVhX2lkLCBpZCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZ2V0X3NycF9zZWNyZXQoZXNwLT5lc191bml0LAotCQkJCSAgICBlc3AtPmVzX2NsaWVudC5lYV9uYW1lLAotCQkJCSAgICBlc3AtPmVzX2NsaWVudC5lYV9wZWVyLCBzZWNyZXQsIDApID09IDApIHsKLQkJCQkJLyoKLQkJCQkJICogQ2FuJ3Qgd29yayB3aXRoIHRoaXMgcGVlciBiZWNhdXNlCi0JCQkJCSAqIHRoZSBzZWNyZXQgaXMgbWlzc2luZy4gIEp1c3QgZ2l2ZQotCQkJCQkgKiB1cC4KLQkJCQkJICovCi0JCQkJCWVhcF9zZW5kX25hayhlc3AsIGlkLCBFQVBUX01ENUNIQVApOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJQnZhbC5kYXRhID0gaW5wOwotCQkJCUJ2YWwubGVuID0gbGVuOwotCQkJCXRfY2xpZW50cGFzc3dkKHRjLCBzZWNyZXQpOwotCQkJCUJaRVJPKHNlY3JldCwgc2l6ZW9mIChzZWNyZXQpKTsKLQkJCQllc3AtPmVzX2NsaWVudC5lYV9za2V5ID0KLQkJCQkgICAgdF9jbGllbnRnZXRrZXkodGMsICZCdmFsKTsKLQkJCQlpZiAoZXNwLT5lc19jbGllbnQuZWFfc2tleSA9PSBOVUxMKSB7Ci0JCQkJCS8qIFNlcnZlciBpcyByb2d1ZTsgc3RvcCBub3cgKi8KLQkJCQkJZXJyb3IoIkVBUDogU1JQIHNlcnZlciBpcyByb2d1ZSIpOwotCQkJCQlnb3RvIGNsaWVudF9mYWlsdXJlOwotCQkJCX0KLQkJCX0KLQkJCWVhcF9zcnB2YWxfcmVzcG9uc2UoZXNwLCBpZCwgU1JQVkFMX0VCSVQsCi0JCQkgICAgdF9jbGllbnRyZXNwb25zZSh0YykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBFQVBTUlBfU1ZBTElEQVRPUjoKLQkJCXRjID0gKHN0cnVjdCB0X2NsaWVudCAqKWVzcC0+ZXNfY2xpZW50LmVhX3Nlc3Npb247Ci0JCQlpZiAodGMgPT0gTlVMTCB8fCBlc3AtPmVzX2NsaWVudC5lYV9za2V5ID09IE5VTEwpIHsKLQkJCQl3YXJuKCJFQVA6IHBlZXIgc2VudCBTdWJ0eXBlIDMgd2l0aG91dCAxLzIiKTsKLQkJCQllYXBfc2VuZF9uYWsoZXNwLCBpZCwgRUFQVF9NRDVDSEFQKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCS8qCi0JCQkgKiBJZiB3ZSdyZSBhbHJlYWR5IG9wZW4sIHRoZW4gdGhpcyBvdWdodCB0byBiZSBhCi0JCQkgKiBkdXBsaWNhdGUuICBPdGhlcndpc2UsIGNoZWNrIHRoYXQgdGhlIHNlcnZlciBpcwotCQkJICogd2hvIHdlIHRoaW5rIGl0IGlzLgotCQkJICovCi0JCQlpZiAoZXNwLT5lc19jbGllbnQuZWFfc3RhdGUgPT0gZWFwT3BlbikgewotCQkJCWlmIChpZCAhPSBlc3AtPmVzX2NsaWVudC5lYV9pZCkgewotCQkJCQl3YXJuKCJFQVA6IElEIGNoYW5nZWQgZnJvbSAlZCB0byAlZCAiCi0JCQkJCSAgICAiaW4gU1JQIFN1YnR5cGUgMyByZXhtaXQiLAotCQkJCQkgICAgZXNwLT5lc19jbGllbnQuZWFfaWQsIGlkKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWxlbiAtPSBzaXplb2YgKHVfaW50MzJfdCkgKyBTSEFfRElHRVNUU0laRTsKLQkJCQlpZiAobGVuIDwgMCB8fCB0X2NsaWVudHZlcmlmeSh0YywgaW5wICsKLQkJCQkJc2l6ZW9mICh1X2ludDMyX3QpKSAhPSAwKSB7Ci0JCQkJCWVycm9yKCJFQVA6IFNSUCBzZXJ2ZXIgdmVyaWZpY2F0aW9uICIKLQkJCQkJICAgICJmYWlsZWQiKTsKLQkJCQkJZ290byBjbGllbnRfZmFpbHVyZTsKLQkJCQl9Ci0JCQkJR0VUTE9ORyhlc3AtPmVzX2NsaWVudC5lYV9rZXlmbGFncywgaW5wKTsKLQkJCQkvKiBTYXZlIHBzZXVkb255bSBpZiB1c2VyIHdhbnRzIGl0LiAqLwotCQkJCWlmIChsZW4gPiAwICYmIGVzcC0+ZXNfdXNlcHNldWRvKSB7Ci0JCQkJCUlOQ1BUUihTSEFfRElHRVNUU0laRSwgaW5wKTsKLQkJCQkJd3JpdGVfcHNldWRvbnltKGVzcCwgaW5wLCBsZW4sIGlkKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvKgotCQkJICogV2UndmUgdmVyaWZpZWQgb3VyIHBlZXIuICBXZSdyZSBub3cgbW9zdGx5IGRvbmUsCi0JCQkgKiBleGNlcHQgZm9yIHdhaXRpbmcgb24gdGhlIHJlZ3VsYXIgRUFQIFN1Y2Nlc3MKLQkJCSAqIG1lc3NhZ2UuCi0JCQkgKi8KLQkJCWVhcF9zcnBfcmVzcG9uc2UoZXNwLCBpZCwgRUFQU1JQX0FDSywgTlVMTCwgMCk7Ci0JCQlicmVhazsKLQotCQljYXNlIEVBUFNSUF9MV1JFQ0hBTExFTkdFOgotCQkJaWYgKGxlbiA8IDQpIHsKLQkJCQl3YXJuKCJFQVA6IG1hbGZvcm1lZCBMaWdodHdlaWdodCByZWNoYWxsZW5nZSIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCVNIQTFJbml0KCZjdHh0KTsKLQkJCXZhbHNbMF0gPSBpZDsKLQkJCVNIQTFVcGRhdGUoJmN0eHQsIHZhbHMsIDEpOwotCQkJU0hBMVVwZGF0ZSgmY3R4dCwgZXNwLT5lc19jbGllbnQuZWFfc2tleSwKLQkJCSAgICBTRVNTSU9OX0tFWV9MRU4pOwotCQkJU0hBMVVwZGF0ZSgmY3R4dCwgaW5wLCBsZW4pOwotCQkJU0hBMVVwZGF0ZSgmY3R4dCwgZXNwLT5lc19jbGllbnQuZWFfbmFtZSwKLQkJCSAgICBlc3AtPmVzX2NsaWVudC5lYV9uYW1lbGVuKTsKLQkJCVNIQTFGaW5hbChkaWcsICZjdHh0KTsKLQkJCWVhcF9zcnBfcmVzcG9uc2UoZXNwLCBpZCwgRUFQU1JQX0xXUkVDSEFMTEVOR0UsIGRpZywKLQkJCSAgICBTSEFfRElHRVNUU0laRSk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJZXJyb3IoIkVBUDogdW5rbm93biBTUlAgU3VidHlwZSAlZCIsIHZhbGxlbik7Ci0JCQllYXBfc2VuZF9uYWsoZXNwLCBpZCwgRUFQVF9NRDVDSEFQKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotI2VuZGlmIC8qIFVTRV9TUlAgKi8KLQotCWRlZmF1bHQ6Ci0JCWluZm8oIkVBUDogdW5rbm93biBhdXRoZW50aWNhdGlvbiB0eXBlICVkOyBOYWtpbmciLCB0eXBlbnVtKTsKLQkJZWFwX3NlbmRfbmFrKGVzcCwgaWQsIEVBUFRfU1JQKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKGVzcC0+ZXNfY2xpZW50LmVhX3RpbWVvdXQgPiAwKSB7Ci0JCVVOVElNRU9VVChlYXBfY2xpZW50X3RpbWVvdXQsICh2b2lkICopZXNwKTsKLQkJVElNRU9VVChlYXBfY2xpZW50X3RpbWVvdXQsICh2b2lkICopZXNwLAotCQkgICAgZXNwLT5lc19jbGllbnQuZWFfdGltZW91dCk7Ci0JfQotCXJldHVybjsKLQotI2lmZGVmIFVTRV9TUlAKLWNsaWVudF9mYWlsdXJlOgotCWVzcC0+ZXNfY2xpZW50LmVhX3N0YXRlID0gZWFwQmFkQXV0aDsKLQlpZiAoZXNwLT5lc19jbGllbnQuZWFfdGltZW91dCA+IDApIHsKLQkJVU5USU1FT1VUKGVhcF9jbGllbnRfdGltZW91dCwgKHZvaWQgKillc3ApOwotCX0KLQllc3AtPmVzX2NsaWVudC5lYV9zZXNzaW9uID0gTlVMTDsKLQl0X2NsaWVudGNsb3NlKHRjKTsKLQlhdXRoX3dpdGhwZWVyX2ZhaWwoZXNwLT5lc191bml0LCBQUFBfRUFQKTsKLSNlbmRpZiAvKiBVU0VfU1JQICovCi19Ci0KLS8qCi0gKiBlYXBfcmVzcG9uc2UgLSBSZWNlaXZlIEVBUCBSZXNwb25zZSBtZXNzYWdlIChzZXJ2ZXIgbW9kZSkuCi0gKi8KLXN0YXRpYyB2b2lkCi1lYXBfcmVzcG9uc2UoZXNwLCBpbnAsIGlkLCBsZW4pCi1lYXBfc3RhdGUgKmVzcDsKLXVfY2hhciAqaW5wOwotaW50IGlkOwotaW50IGxlbjsKLXsKLQl1X2NoYXIgdHlwZW51bTsKLQl1X2NoYXIgdmFsbGVuOwotCWludCBzZWNyZXRfbGVuOwotCWNoYXIgc2VjcmV0W01BWFNFQ1JFVExFTl07Ci0JY2hhciByaG9zdG5hbWVbMjU2XTsKLQlNRDVfQ1RYIG1kQ29udGV4dDsKLQl1X2NoYXIgaGFzaFtNRDVfU0lHTkFUVVJFX1NJWkVdOwotI2lmZGVmIFVTRV9TUlAKLQlzdHJ1Y3QgdF9zZXJ2ZXIgKnRzOwotCXN0cnVjdCB0X251bSBBOwotCVNIQTFfQ1RYIGN0eHQ7Ci0JdV9jaGFyIGRpZ1tTSEFfRElHRVNUU0laRV07Ci0jZW5kaWYgLyogVVNFX1NSUCAqLwotCi0JaWYgKGVzcC0+ZXNfc2VydmVyLmVhX2lkICE9IGlkKSB7Ci0JCWRiZ2xvZygiRUFQOiBkaXNjYXJkaW5nIFJlc3BvbnNlICVkOyBleHBlY3RlZCBJRCAlZCIsIGlkLAotCQkgICAgZXNwLT5lc19zZXJ2ZXIuZWFfaWQpOwotCQlyZXR1cm47Ci0JfQotCi0JZXNwLT5lc19zZXJ2ZXIuZWFfcmVzcG9uc2VzKys7Ci0KLQlpZiAobGVuIDw9IDApIHsKLQkJZXJyb3IoIkVBUDogZW1wdHkgUmVzcG9uc2UgbWVzc2FnZSBkaXNjYXJkZWQiKTsKLQkJcmV0dXJuOwotCX0KLQotCUdFVENIQVIodHlwZW51bSwgaW5wKTsKLQlsZW4tLTsKLQotCXN3aXRjaCAodHlwZW51bSkgewotCWNhc2UgRUFQVF9JREVOVElUWToKLQkJaWYgKGVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlICE9IGVhcElkZW50aWZ5KSB7Ci0JCQlkYmdsb2coIkVBUCBkaXNjYXJkaW5nIHVud2FudGVkIElkZW50aWZ5IFwiJS5xXCIiLCBsZW4sCi0JCQkgICAgaW5wKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWluZm8oIkVBUDogdW5hdXRoZW50aWNhdGVkIHBlZXIgbmFtZSBcIiUuKnFcIiIsIGxlbiwgaW5wKTsKLQkJaWYgKGVzcC0+ZXNfc2VydmVyLmVhX3BlZXIgIT0gTlVMTCAmJgotCQkgICAgZXNwLT5lc19zZXJ2ZXIuZWFfcGVlciAhPSByZW1vdGVfbmFtZSkKLQkJCWZyZWUoZXNwLT5lc19zZXJ2ZXIuZWFfcGVlcik7Ci0JCWVzcC0+ZXNfc2VydmVyLmVhX3BlZXIgPSBtYWxsb2MobGVuICsgMSk7Ci0JCWlmIChlc3AtPmVzX3NlcnZlci5lYV9wZWVyID09IE5VTEwpIHsKLQkJCWVzcC0+ZXNfc2VydmVyLmVhX3BlZXJsZW4gPSAwOwotCQkJZWFwX2ZpZ3VyZV9uZXh0X3N0YXRlKGVzcCwgMSk7Ci0JCQlicmVhazsKLQkJfQotCQlCQ09QWShpbnAsIGVzcC0+ZXNfc2VydmVyLmVhX3BlZXIsIGxlbik7Ci0JCWVzcC0+ZXNfc2VydmVyLmVhX3BlZXJbbGVuXSA9ICdcMCc7Ci0JCWVzcC0+ZXNfc2VydmVyLmVhX3BlZXJsZW4gPSBsZW47Ci0JCWVhcF9maWd1cmVfbmV4dF9zdGF0ZShlc3AsIDApOwotCQlicmVhazsKLQotCWNhc2UgRUFQVF9OT1RJRklDQVRJT046Ci0JCWRiZ2xvZygiRUFQIHVuZXhwZWN0ZWQgTm90aWZpY2F0aW9uOyByZXNwb25zZSBkaXNjYXJkZWQiKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEVBUFRfTkFLOgotCQlpZiAobGVuIDwgMSkgewotCQkJaW5mbygiRUFQOiBOYWsgUmVzcG9uc2Ugd2l0aCBubyBzdWdnZXN0ZWQgcHJvdG9jb2wiKTsKLQkJCWVhcF9maWd1cmVfbmV4dF9zdGF0ZShlc3AsIDEpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlHRVRDSEFSKHZhbGxlbiwgaW5wKTsKLQkJbGVuLS07Ci0KLQkJaWYgKCFleHBsaWNpdF9yZW1vdGUgJiYgZXNwLT5lc19zZXJ2ZXIuZWFfc3RhdGUgPT0gZWFwSWRlbnRpZnkpewotCQkJLyogUGVlciBjYW5ub3QgTmFrIElkZW50aWZ5IFJlcXVlc3QgKi8KLQkJCWVhcF9maWd1cmVfbmV4dF9zdGF0ZShlc3AsIDEpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzd2l0Y2ggKHZhbGxlbikgewotCQljYXNlIEVBUFRfU1JQOgotCQkJLyogUnVuIHRocm91Z2ggU1JQIHZhbGlkYXRvciBzZWxlY3Rpb24gYWdhaW4uICovCi0JCQllc3AtPmVzX3NlcnZlci5lYV9zdGF0ZSA9IGVhcElkZW50aWZ5OwotCQkJZWFwX2ZpZ3VyZV9uZXh0X3N0YXRlKGVzcCwgMCk7Ci0JCQlicmVhazsKLQotCQljYXNlIEVBUFRfTUQ1Q0hBUDoKLQkJCWVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlID0gZWFwTUQ1Q2hhbGw7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJZGJnbG9nKCJFQVA6IHBlZXIgcmVxdWVzdGluZyB1bmtub3duIFR5cGUgJWQiLCB2YWxsZW4pOwotCQkJc3dpdGNoIChlc3AtPmVzX3NlcnZlci5lYV9zdGF0ZSkgewotCQkJY2FzZSBlYXBTUlAxOgotCQkJY2FzZSBlYXBTUlAyOgotCQkJY2FzZSBlYXBTUlAzOgotCQkJCWVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlID0gZWFwTUQ1Q2hhbGw7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIGVhcE1ENUNoYWxsOgotCQkJY2FzZSBlYXBTUlA0OgotCQkJCWVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlID0gZWFwSWRlbnRpZnk7Ci0JCQkJZWFwX2ZpZ3VyZV9uZXh0X3N0YXRlKGVzcCwgMCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEVBUFRfTUQ1Q0hBUDoKLQkJaWYgKGVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlICE9IGVhcE1ENUNoYWxsKSB7Ci0JCQllcnJvcigiRUFQOiB1bmV4cGVjdGVkIE1ENS1SZXNwb25zZSIpOwotCQkJZWFwX2ZpZ3VyZV9uZXh0X3N0YXRlKGVzcCwgMSk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAobGVuIDwgMSkgewotCQkJZXJyb3IoIkVBUDogcmVjZWl2ZWQgTUQ1LVJlc3BvbnNlIHdpdGggbm8gZGF0YSIpOwotCQkJZWFwX2ZpZ3VyZV9uZXh0X3N0YXRlKGVzcCwgMSk7Ci0JCQlicmVhazsKLQkJfQotCQlHRVRDSEFSKHZhbGxlbiwgaW5wKTsKLQkJbGVuLS07Ci0JCWlmICh2YWxsZW4gIT0gMTYgfHwgdmFsbGVuID4gbGVuKSB7Ci0JCQllcnJvcigiRUFQOiBNRDUtUmVzcG9uc2Ugd2l0aCBiYWQgbGVuZ3RoICVkIiwgdmFsbGVuKTsKLQkJCWVhcF9maWd1cmVfbmV4dF9zdGF0ZShlc3AsIDEpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBOb3Qgc28gbGlrZWx5IHRvIGhhcHBlbi4gKi8KLQkJaWYgKGxlbiAtIHZhbGxlbiA+PSBzaXplb2YgKHJob3N0bmFtZSkpIHsKLQkJCWRiZ2xvZygiRUFQOiB0cmltbWluZyByZWFsbHkgbG9uZyBwZWVyIG5hbWUgZG93biIpOwotCQkJQkNPUFkoaW5wICsgdmFsbGVuLCByaG9zdG5hbWUsIHNpemVvZiAocmhvc3RuYW1lKSAtIDEpOwotCQkJcmhvc3RuYW1lW3NpemVvZiAocmhvc3RuYW1lKSAtIDFdID0gJ1wwJzsKLQkJfSBlbHNlIHsKLQkJCUJDT1BZKGlucCArIHZhbGxlbiwgcmhvc3RuYW1lLCBsZW4gLSB2YWxsZW4pOwotCQkJcmhvc3RuYW1lW2xlbiAtIHZhbGxlbl0gPSAnXDAnOwotCQl9Ci0KLQkJLyogSW4gY2FzZSB0aGUgcmVtb3RlIGRvZXNuJ3QgZ2l2ZSB1cyBoaXMgbmFtZS4gKi8KLQkJaWYgKGV4cGxpY2l0X3JlbW90ZSB8fAotCQkgICAgKHJlbW90ZV9uYW1lWzBdICE9ICdcMCcgJiYgdmFsbGVuID09IGxlbikpCi0JCQlzdHJsY3B5KHJob3N0bmFtZSwgcmVtb3RlX25hbWUsIHNpemVvZiAocmhvc3RuYW1lKSk7Ci0KLQkJLyoKLQkJICogR2V0IHRoZSBzZWNyZXQgZm9yIGF1dGhlbnRpY2F0aW5nIHRoZSBzcGVjaWZpZWQKLQkJICogaG9zdC4KLQkJICovCi0JCWlmICghZ2V0X3NlY3JldChlc3AtPmVzX3VuaXQsIHJob3N0bmFtZSwKLQkJICAgIGVzcC0+ZXNfc2VydmVyLmVhX25hbWUsIHNlY3JldCwgJnNlY3JldF9sZW4sIDEpKSB7Ci0JCQlkYmdsb2coIkVBUDogbm8gTUQ1IHNlY3JldCBmb3IgYXV0aCBvZiAlcSIsIHJob3N0bmFtZSk7Ci0JCQllYXBfc2VuZF9mYWlsdXJlKGVzcCk7Ci0JCQlicmVhazsKLQkJfQotCQlNRDVfSW5pdCgmbWRDb250ZXh0KTsKLQkJTUQ1X1VwZGF0ZSgmbWRDb250ZXh0LCAmZXNwLT5lc19zZXJ2ZXIuZWFfaWQsIDEpOwotCQlNRDVfVXBkYXRlKCZtZENvbnRleHQsICh1X2NoYXIgKilzZWNyZXQsIHNlY3JldF9sZW4pOwotCQlCWkVSTyhzZWNyZXQsIHNpemVvZiAoc2VjcmV0KSk7Ci0JCU1ENV9VcGRhdGUoJm1kQ29udGV4dCwgZXNwLT5lc19jaGFsbGVuZ2UsIGVzcC0+ZXNfY2hhbGxlbik7Ci0JCU1ENV9GaW5hbChoYXNoLCAmbWRDb250ZXh0KTsKLQkJaWYgKEJDTVAoaGFzaCwgaW5wLCBNRDVfU0lHTkFUVVJFX1NJWkUpICE9IDApIHsKLQkJCWVhcF9zZW5kX2ZhaWx1cmUoZXNwKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWVzcC0+ZXNfc2VydmVyLmVhX3R5cGUgPSBFQVBUX01ENUNIQVA7Ci0JCWVhcF9zZW5kX3N1Y2Nlc3MoZXNwKTsKLQkJZWFwX2ZpZ3VyZV9uZXh0X3N0YXRlKGVzcCwgMCk7Ci0JCWlmIChlc3AtPmVzX3JlY2hhbGxlbmdlICE9IDApCi0JCQlUSU1FT1VUKGVhcF9yZWNoYWxsZW5nZSwgZXNwLCBlc3AtPmVzX3JlY2hhbGxlbmdlKTsKLQkJYnJlYWs7Ci0KLSNpZmRlZiBVU0VfU1JQCi0JY2FzZSBFQVBUX1NSUDoKLQkJaWYgKGxlbiA8IDEpIHsKLQkJCWVycm9yKCJFQVA6IGVtcHR5IFNSUCBSZXNwb25zZSIpOwotCQkJZWFwX2ZpZ3VyZV9uZXh0X3N0YXRlKGVzcCwgMSk7Ci0JCQlicmVhazsKLQkJfQotCQlHRVRDSEFSKHR5cGVudW0sIGlucCk7Ci0JCWxlbi0tOwotCQlzd2l0Y2ggKHR5cGVudW0pIHsKLQkJY2FzZSBFQVBTUlBfQ0tFWToKLQkJCWlmIChlc3AtPmVzX3NlcnZlci5lYV9zdGF0ZSAhPSBlYXBTUlAxKSB7Ci0JCQkJZXJyb3IoIkVBUDogdW5leHBlY3RlZCBTUlAgU3VidHlwZSAxIFJlc3BvbnNlIik7Ci0JCQkJZWFwX2ZpZ3VyZV9uZXh0X3N0YXRlKGVzcCwgMSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlBLmRhdGEgPSBpbnA7Ci0JCQlBLmxlbiA9IGxlbjsKLQkJCXRzID0gKHN0cnVjdCB0X3NlcnZlciAqKWVzcC0+ZXNfc2VydmVyLmVhX3Nlc3Npb247Ci0JCQlhc3NlcnQodHMgIT0gTlVMTCk7Ci0JCQllc3AtPmVzX3NlcnZlci5lYV9za2V5ID0gdF9zZXJ2ZXJnZXRrZXkodHMsICZBKTsKLQkJCWlmIChlc3AtPmVzX3NlcnZlci5lYV9za2V5ID09IE5VTEwpIHsKLQkJCQkvKiBDbGllbnQncyBBIHZhbHVlIGlzIGJvZ3VzOyB0ZXJtaW5hdGUgbm93ICovCi0JCQkJZXJyb3IoIkVBUDogYm9ndXMgQSB2YWx1ZSBmcm9tIGNsaWVudCIpOwotCQkJCWVhcF9zZW5kX2ZhaWx1cmUoZXNwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZWFwX2ZpZ3VyZV9uZXh0X3N0YXRlKGVzcCwgMCk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEVBUFNSUF9DVkFMSURBVE9SOgotCQkJaWYgKGVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlICE9IGVhcFNSUDIpIHsKLQkJCQllcnJvcigiRUFQOiB1bmV4cGVjdGVkIFNSUCBTdWJ0eXBlIDIgUmVzcG9uc2UiKTsKLQkJCQllYXBfZmlndXJlX25leHRfc3RhdGUoZXNwLCAxKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChsZW4gPCBzaXplb2YgKHVfaW50MzJfdCkgKyBTSEFfRElHRVNUU0laRSkgewotCQkJCWVycm9yKCJFQVA6IE0xIGxlbmd0aCAlZCA8ICVkIiwgbGVuLAotCQkJCSAgICBzaXplb2YgKHVfaW50MzJfdCkgKyBTSEFfRElHRVNUU0laRSk7Ci0JCQkJZWFwX2ZpZ3VyZV9uZXh0X3N0YXRlKGVzcCwgMSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlHRVRMT05HKGVzcC0+ZXNfc2VydmVyLmVhX2tleWZsYWdzLCBpbnApOwotCQkJdHMgPSAoc3RydWN0IHRfc2VydmVyICopZXNwLT5lc19zZXJ2ZXIuZWFfc2Vzc2lvbjsKLQkJCWFzc2VydCh0cyAhPSBOVUxMKTsKLQkJCWlmICh0X3NlcnZlcnZlcmlmeSh0cywgaW5wKSkgewotCQkJCWluZm8oIkVBUDogdW5hYmxlIHRvIHZhbGlkYXRlIGNsaWVudCBpZGVudGl0eSIpOwotCQkJCWVhcF9zZW5kX2ZhaWx1cmUoZXNwKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVhcF9maWd1cmVfbmV4dF9zdGF0ZShlc3AsIDApOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBFQVBTUlBfQUNLOgotCQkJaWYgKGVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlICE9IGVhcFNSUDMpIHsKLQkJCQllcnJvcigiRUFQOiB1bmV4cGVjdGVkIFNSUCBTdWJ0eXBlIDMgUmVzcG9uc2UiKTsKLQkJCQllYXBfc2VuZF9mYWlsdXJlKGVzcCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllc3AtPmVzX3NlcnZlci5lYV90eXBlID0gRUFQVF9TUlA7Ci0JCQllYXBfc2VuZF9zdWNjZXNzKGVzcCk7Ci0JCQllYXBfZmlndXJlX25leHRfc3RhdGUoZXNwLCAwKTsKLQkJCWlmIChlc3AtPmVzX3JlY2hhbGxlbmdlICE9IDApCi0JCQkJVElNRU9VVChlYXBfcmVjaGFsbGVuZ2UsIGVzcCwKLQkJCQkgICAgZXNwLT5lc19yZWNoYWxsZW5nZSk7Ci0JCQlpZiAoZXNwLT5lc19sd3JlY2hhbGxlbmdlICE9IDApCi0JCQkJVElNRU9VVChzcnBfbHdyZWNoYWxsZW5nZSwgZXNwLAotCQkJCSAgICBlc3AtPmVzX2x3cmVjaGFsbGVuZ2UpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBFQVBTUlBfTFdSRUNIQUxMRU5HRToKLQkJCWlmIChlc3AtPmVzX3NlcnZlci5lYV9zdGF0ZSAhPSBlYXBTUlA0KSB7Ci0JCQkJaW5mbygiRUFQOiB1bmV4cGVjdGVkIFNSUCBTdWJ0eXBlIDQgUmVzcG9uc2UiKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAobGVuICE9IFNIQV9ESUdFU1RTSVpFKSB7Ci0JCQkJZXJyb3IoIkVBUDogYmFkIExpZ2h0d2VpZ2h0IHJlY2hhbGxlbmdlICIKLQkJCQkgICAgInJlc3BvbnNlIik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU0hBMUluaXQoJmN0eHQpOwotCQkJdmFsbGVuID0gaWQ7Ci0JCQlTSEExVXBkYXRlKCZjdHh0LCAmdmFsbGVuLCAxKTsKLQkJCVNIQTFVcGRhdGUoJmN0eHQsIGVzcC0+ZXNfc2VydmVyLmVhX3NrZXksCi0JCQkgICAgU0VTU0lPTl9LRVlfTEVOKTsKLQkJCVNIQTFVcGRhdGUoJmN0eHQsIGVzcC0+ZXNfY2hhbGxlbmdlLCBlc3AtPmVzX2NoYWxsZW4pOwotCQkJU0hBMVVwZGF0ZSgmY3R4dCwgZXNwLT5lc19zZXJ2ZXIuZWFfcGVlciwKLQkJCSAgICBlc3AtPmVzX3NlcnZlci5lYV9wZWVybGVuKTsKLQkJCVNIQTFGaW5hbChkaWcsICZjdHh0KTsKLQkJCWlmIChCQ01QKGRpZywgaW5wLCBTSEFfRElHRVNUU0laRSkgIT0gMCkgewotCQkJCWVycm9yKCJFQVA6IGZhaWxlZCBMaWdodHdlaWdodCByZWNoYWxsZW5nZSIpOwotCQkJCWVhcF9zZW5kX2ZhaWx1cmUoZXNwKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlID0gZWFwT3BlbjsKLQkJCWlmIChlc3AtPmVzX2x3cmVjaGFsbGVuZ2UgIT0gMCkKLQkJCQlUSU1FT1VUKHNycF9sd3JlY2hhbGxlbmdlLCBlc3AsCi0JCQkJICAgIGVzcC0+ZXNfbHdyZWNoYWxsZW5nZSk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLSNlbmRpZiAvKiBVU0VfU1JQICovCi0KLQlkZWZhdWx0OgotCQkvKiBUaGlzIGNhbid0IGhhcHBlbi4gKi8KLQkJZXJyb3IoIkVBUDogdW5rbm93biBSZXNwb25zZSB0eXBlICVkOyBpZ25vcmVkIiwgdHlwZW51bSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoZXNwLT5lc19zZXJ2ZXIuZWFfdGltZW91dCA+IDApIHsKLQkJVU5USU1FT1VUKGVhcF9zZXJ2ZXJfdGltZW91dCwgKHZvaWQgKillc3ApOwotCX0KLQotCWlmIChlc3AtPmVzX3NlcnZlci5lYV9zdGF0ZSAhPSBlYXBCYWRBdXRoICYmCi0JICAgIGVzcC0+ZXNfc2VydmVyLmVhX3N0YXRlICE9IGVhcE9wZW4pIHsKLQkJZXNwLT5lc19zZXJ2ZXIuZWFfaWQrKzsKLQkJZWFwX3NlbmRfcmVxdWVzdChlc3ApOwotCX0KLX0KLQotLyoKLSAqIGVhcF9zdWNjZXNzIC0gUmVjZWl2ZSBFQVAgU3VjY2VzcyBtZXNzYWdlIChjbGllbnQgbW9kZSkuCi0gKi8KLXN0YXRpYyB2b2lkCi1lYXBfc3VjY2Vzcyhlc3AsIGlucCwgaWQsIGxlbikKLWVhcF9zdGF0ZSAqZXNwOwotdV9jaGFyICppbnA7Ci1pbnQgaWQ7Ci1pbnQgbGVuOwotewotCWlmIChlc3AtPmVzX2NsaWVudC5lYV9zdGF0ZSAhPSBlYXBPcGVuICYmICFlYXBfY2xpZW50X2FjdGl2ZShlc3ApKSB7Ci0JCWRiZ2xvZygiRUFQIHVuZXhwZWN0ZWQgc3VjY2VzcyBtZXNzYWdlIGluIHN0YXRlICVzICglZCkiLAotCQkgICAgZWFwX3N0YXRlX25hbWUoZXNwLT5lc19jbGllbnQuZWFfc3RhdGUpLAotCQkgICAgZXNwLT5lc19jbGllbnQuZWFfc3RhdGUpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGVzcC0+ZXNfY2xpZW50LmVhX3RpbWVvdXQgPiAwKSB7Ci0JCVVOVElNRU9VVChlYXBfY2xpZW50X3RpbWVvdXQsICh2b2lkICopZXNwKTsKLQl9Ci0KLQlpZiAobGVuID4gMCkgewotCQkvKiBUaGlzIGlzIG9kZC4gIFRoZSBzcGVjIGRvZXNuJ3QgYWxsb3cgZm9yIHRoaXMuICovCi0JCVBSSU5UTVNHKGlucCwgbGVuKTsKLQl9Ci0KLQllc3AtPmVzX2NsaWVudC5lYV9zdGF0ZSA9IGVhcE9wZW47Ci0JYXV0aF93aXRocGVlcl9zdWNjZXNzKGVzcC0+ZXNfdW5pdCwgUFBQX0VBUCwgMCk7Ci19Ci0KLS8qCi0gKiBlYXBfZmFpbHVyZSAtIFJlY2VpdmUgRUFQIEZhaWx1cmUgbWVzc2FnZSAoY2xpZW50IG1vZGUpLgotICovCi1zdGF0aWMgdm9pZAotZWFwX2ZhaWx1cmUoZXNwLCBpbnAsIGlkLCBsZW4pCi1lYXBfc3RhdGUgKmVzcDsKLXVfY2hhciAqaW5wOwotaW50IGlkOwotaW50IGxlbjsKLXsKLQlpZiAoIWVhcF9jbGllbnRfYWN0aXZlKGVzcCkpIHsKLQkJZGJnbG9nKCJFQVAgdW5leHBlY3RlZCBmYWlsdXJlIG1lc3NhZ2UgaW4gc3RhdGUgJXMgKCVkKSIsCi0JCSAgICBlYXBfc3RhdGVfbmFtZShlc3AtPmVzX2NsaWVudC5lYV9zdGF0ZSksCi0JCSAgICBlc3AtPmVzX2NsaWVudC5lYV9zdGF0ZSk7Ci0JfQotCi0JaWYgKGVzcC0+ZXNfY2xpZW50LmVhX3RpbWVvdXQgPiAwKSB7Ci0JCVVOVElNRU9VVChlYXBfY2xpZW50X3RpbWVvdXQsICh2b2lkICopZXNwKTsKLQl9Ci0KLQlpZiAobGVuID4gMCkgewotCQkvKiBUaGlzIGlzIG9kZC4gIFRoZSBzcGVjIGRvZXNuJ3QgYWxsb3cgZm9yIHRoaXMuICovCi0JCVBSSU5UTVNHKGlucCwgbGVuKTsKLQl9Ci0KLQllc3AtPmVzX2NsaWVudC5lYV9zdGF0ZSA9IGVhcEJhZEF1dGg7Ci0KLQllcnJvcigiRUFQOiBwZWVyIHJlcG9ydHMgYXV0aGVudGljYXRpb24gZmFpbHVyZSIpOwotCWF1dGhfd2l0aHBlZXJfZmFpbChlc3AtPmVzX3VuaXQsIFBQUF9FQVApOwotfQotCi0vKgotICogZWFwX2lucHV0IC0gSGFuZGxlIHJlY2VpdmVkIEVBUCBtZXNzYWdlLgotICovCi1zdGF0aWMgdm9pZAotZWFwX2lucHV0KHVuaXQsIGlucCwgaW5sZW4pCi1pbnQgdW5pdDsKLXVfY2hhciAqaW5wOwotaW50IGlubGVuOwotewotCWVhcF9zdGF0ZSAqZXNwID0gJmVhcF9zdGF0ZXNbdW5pdF07Ci0JdV9jaGFyIGNvZGUsIGlkOwotCWludCBsZW47Ci0KLQkvKgotCSAqIFBhcnNlIGhlYWRlciAoY29kZSwgaWQgYW5kIGxlbmd0aCkuICBJZiBwYWNrZXQgdG9vIHNob3J0LAotCSAqIGRyb3AgaXQuCi0JICovCi0JaWYgKGlubGVuIDwgRUFQX0hFQURFUkxFTikgewotCQllcnJvcigiRUFQOiBwYWNrZXQgdG9vIHNob3J0OiAlZCA8ICVkIiwgaW5sZW4sIEVBUF9IRUFERVJMRU4pOwotCQlyZXR1cm47Ci0JfQotCUdFVENIQVIoY29kZSwgaW5wKTsKLQlHRVRDSEFSKGlkLCBpbnApOwotCUdFVFNIT1JUKGxlbiwgaW5wKTsKLQlpZiAobGVuIDwgRUFQX0hFQURFUkxFTiB8fCBsZW4gPiBpbmxlbikgewotCQllcnJvcigiRUFQOiBwYWNrZXQgaGFzIGlsbGVnYWwgbGVuZ3RoIGZpZWxkICVkICglZC4uJWQpIiwgbGVuLAotCQkgICAgRUFQX0hFQURFUkxFTiwgaW5sZW4pOwotCQlyZXR1cm47Ci0JfQotCWxlbiAtPSBFQVBfSEVBREVSTEVOOwotCi0JLyogRGlzcGF0Y2ggYmFzZWQgb24gbWVzc2FnZSBjb2RlICovCi0Jc3dpdGNoIChjb2RlKSB7Ci0JY2FzZSBFQVBfUkVRVUVTVDoKLQkJZWFwX3JlcXVlc3QoZXNwLCBpbnAsIGlkLCBsZW4pOwotCQlicmVhazsKLQotCWNhc2UgRUFQX1JFU1BPTlNFOgotCQllYXBfcmVzcG9uc2UoZXNwLCBpbnAsIGlkLCBsZW4pOwotCQlicmVhazsKLQotCWNhc2UgRUFQX1NVQ0NFU1M6Ci0JCWVhcF9zdWNjZXNzKGVzcCwgaW5wLCBpZCwgbGVuKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEVBUF9GQUlMVVJFOgotCQllYXBfZmFpbHVyZShlc3AsIGlucCwgaWQsIGxlbik7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoJCQkJLyogWFhYIE5lZWQgY29kZSByZWplY3QgKi8KLQkJLyogTm90ZTogaXQncyBub3QgbGVnYWwgdG8gc2VuZCBFQVAgTmFrIGhlcmUuICovCi0JCXdhcm4oIkVBUDogdW5rbm93biBjb2RlICVkIHJlY2VpdmVkIiwgY29kZSk7Ci0JCWJyZWFrOwotCX0KLX0KLQotLyoKLSAqIGVhcF9wcmludHBrdCAtIHByaW50IHRoZSBjb250ZW50cyBvZiBhbiBFQVAgcGFja2V0LgotICovCi1zdGF0aWMgY2hhciAqZWFwX2NvZGVuYW1lc1tdID0gewotCSJSZXF1ZXN0IiwgIlJlc3BvbnNlIiwgIlN1Y2Nlc3MiLCAiRmFpbHVyZSIKLX07Ci0KLXN0YXRpYyBjaGFyICplYXBfdHlwZW5hbWVzW10gPSB7Ci0JIklkZW50aXR5IiwgIk5vdGlmaWNhdGlvbiIsICJOYWsiLCAiTUQ1LUNoYWxsZW5nZSIsCi0JIk9UUCIsICJHZW5lcmljLVRva2VuIiwgTlVMTCwgTlVMTCwKLQkiUlNBIiwgIkRTUyIsICJLRUEiLCAiS0VBLVZhbGlkYXRlIiwKLQkiVExTIiwgIkRlZmVuZGVyIiwgIldpbmRvd3MgMjAwMCIsICJBcmNvdCIsCi0JIkNpc2NvIiwgIk5va2lhIiwgIlNSUCIKLX07Ci0KLXN0YXRpYyBpbnQKLWVhcF9wcmludHBrdChpbnAsIGlubGVuLCBwcmludGVyLCBhcmcpCi11X2NoYXIgKmlucDsKLWludCBpbmxlbjsKLXZvaWQgKCpwcmludGVyKSBfX1AoKHZvaWQgKiwgY2hhciAqLCAuLi4pKTsKLXZvaWQgKmFyZzsKLXsKLQlpbnQgY29kZSwgaWQsIGxlbiwgcnR5cGUsIHZhbGxlbjsKLQl1X2NoYXIgKnBzdGFydDsKLQl1X2ludDMyX3QgdXZhbDsKLQotCWlmIChpbmxlbiA8IEVBUF9IRUFERVJMRU4pCi0JCXJldHVybiAoMCk7Ci0JcHN0YXJ0ID0gaW5wOwotCUdFVENIQVIoY29kZSwgaW5wKTsKLQlHRVRDSEFSKGlkLCBpbnApOwotCUdFVFNIT1JUKGxlbiwgaW5wKTsKLQlpZiAobGVuIDwgRUFQX0hFQURFUkxFTiB8fCBsZW4gPiBpbmxlbikKLQkJcmV0dXJuICgwKTsKLQotCWlmIChjb2RlID49IDEgJiYgY29kZSA8PSBzaXplb2YoZWFwX2NvZGVuYW1lcykgLyBzaXplb2YoY2hhciAqKSkKLQkJcHJpbnRlcihhcmcsICIgJXMiLCBlYXBfY29kZW5hbWVzW2NvZGUtMV0pOwotCWVsc2UKLQkJcHJpbnRlcihhcmcsICIgY29kZT0weCV4IiwgY29kZSk7Ci0JcHJpbnRlcihhcmcsICIgaWQ9MHgleCIsIGlkKTsKLQlsZW4gLT0gRUFQX0hFQURFUkxFTjsKLQlzd2l0Y2ggKGNvZGUpIHsKLQljYXNlIEVBUF9SRVFVRVNUOgotCQlpZiAobGVuIDwgMSkgewotCQkJcHJpbnRlcihhcmcsICIgPG1pc3NpbmcgdHlwZT4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCUdFVENIQVIocnR5cGUsIGlucCk7Ci0JCWxlbi0tOwotCQlpZiAocnR5cGUgPj0gMSAmJgotCQkgICAgcnR5cGUgPD0gc2l6ZW9mIChlYXBfdHlwZW5hbWVzKSAvIHNpemVvZiAoY2hhciAqKSkKLQkJCXByaW50ZXIoYXJnLCAiICVzIiwgZWFwX3R5cGVuYW1lc1tydHlwZS0xXSk7Ci0JCWVsc2UKLQkJCXByaW50ZXIoYXJnLCAiIHR5cGU9MHgleCIsIHJ0eXBlKTsKLQkJc3dpdGNoIChydHlwZSkgewotCQljYXNlIEVBUFRfSURFTlRJVFk6Ci0JCWNhc2UgRUFQVF9OT1RJRklDQVRJT046Ci0JCQlpZiAobGVuID4gMCkgewotCQkJCXByaW50ZXIoYXJnLCAiIDxNZXNzYWdlICIpOwotCQkJCXByaW50X3N0cmluZygoY2hhciAqKWlucCwgbGVuLCBwcmludGVyLCBhcmcpOwotCQkJCXByaW50ZXIoYXJnLCAiPiIpOwotCQkJCUlOQ1BUUihsZW4sIGlucCk7Ci0JCQkJbGVuID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJpbnRlcihhcmcsICIgPE5vIG1lc3NhZ2U+Iik7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEVBUFRfTUQ1Q0hBUDoKLQkJCWlmIChsZW4gPD0gMCkKLQkJCQlicmVhazsKLQkJCUdFVENIQVIodmFsbGVuLCBpbnApOwotCQkJbGVuLS07Ci0JCQlpZiAodmFsbGVuID4gbGVuKQotCQkJCWdvdG8gdHJ1bmNhdGVkOwotCQkJcHJpbnRlcihhcmcsICIgPFZhbHVlJS4qQj4iLCB2YWxsZW4sIGlucCk7Ci0JCQlJTkNQVFIodmFsbGVuLCBpbnApOwotCQkJbGVuIC09IHZhbGxlbjsKLQkJCWlmIChsZW4gPiAwKSB7Ci0JCQkJcHJpbnRlcihhcmcsICIgPE5hbWUgIik7Ci0JCQkJcHJpbnRfc3RyaW5nKChjaGFyICopaW5wLCBsZW4sIHByaW50ZXIsIGFyZyk7Ci0JCQkJcHJpbnRlcihhcmcsICI+Iik7Ci0JCQkJSU5DUFRSKGxlbiwgaW5wKTsKLQkJCQlsZW4gPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlwcmludGVyKGFyZywgIiA8Tm8gbmFtZT4iKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgRUFQVF9TUlA6Ci0JCQlpZiAobGVuIDwgMykKLQkJCQlnb3RvIHRydW5jYXRlZDsKLQkJCUdFVENIQVIodmFsbGVuLCBpbnApOwotCQkJbGVuLS07Ci0JCQlwcmludGVyKGFyZywgIi0lZCIsIHZhbGxlbik7Ci0JCQlzd2l0Y2ggKHZhbGxlbikgewotCQkJY2FzZSBFQVBTUlBfQ0hBTExFTkdFOgotCQkJCUdFVENIQVIodmFsbGVuLCBpbnApOwotCQkJCWxlbi0tOwotCQkJCWlmICh2YWxsZW4gPj0gbGVuKQotCQkJCQlnb3RvIHRydW5jYXRlZDsKLQkJCQlpZiAodmFsbGVuID4gMCkgewotCQkJCQlwcmludGVyKGFyZywgIiA8TmFtZSAiKTsKLQkJCQkJcHJpbnRfc3RyaW5nKChjaGFyICopaW5wLCB2YWxsZW4sIHByaW50ZXIsCi0JCQkJCSAgICBhcmcpOwotCQkJCQlwcmludGVyKGFyZywgIj4iKTsKLQkJCQl9IGVsc2UgewotCQkJCQlwcmludGVyKGFyZywgIiA8Tm8gbmFtZT4iKTsKLQkJCQl9Ci0JCQkJSU5DUFRSKHZhbGxlbiwgaW5wKTsKLQkJCQlsZW4gLT0gdmFsbGVuOwotCQkJCUdFVENIQVIodmFsbGVuLCBpbnApOwotCQkJCWxlbi0tOwotCQkJCWlmICh2YWxsZW4gPj0gbGVuKQotCQkJCQlnb3RvIHRydW5jYXRlZDsKLQkJCQlwcmludGVyKGFyZywgIiA8cyUuKkI+IiwgdmFsbGVuLCBpbnApOwotCQkJCUlOQ1BUUih2YWxsZW4sIGlucCk7Ci0JCQkJbGVuIC09IHZhbGxlbjsKLQkJCQlHRVRDSEFSKHZhbGxlbiwgaW5wKTsKLQkJCQlsZW4tLTsKLQkJCQlpZiAodmFsbGVuID4gbGVuKQotCQkJCQlnb3RvIHRydW5jYXRlZDsKLQkJCQlpZiAodmFsbGVuID09IDApIHsKLQkJCQkJcHJpbnRlcihhcmcsICIgPERlZmF1bHQgZz0yPiIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXByaW50ZXIoYXJnLCAiIDxnJS4qQj4iLCB2YWxsZW4sIGlucCk7Ci0JCQkJfQotCQkJCUlOQ1BUUih2YWxsZW4sIGlucCk7Ci0JCQkJbGVuIC09IHZhbGxlbjsKLQkJCQlpZiAobGVuID09IDApIHsKLQkJCQkJcHJpbnRlcihhcmcsICIgPERlZmF1bHQgTj4iKTsKLQkJCQl9IGVsc2UgewotCQkJCQlwcmludGVyKGFyZywgIiA8TiUuKkI+IiwgbGVuLCBpbnApOwotCQkJCQlJTkNQVFIobGVuLCBpbnApOwotCQkJCQlsZW4gPSAwOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBFQVBTUlBfU0tFWToKLQkJCQlwcmludGVyKGFyZywgIiA8QiUuKkI+IiwgbGVuLCBpbnApOwotCQkJCUlOQ1BUUihsZW4sIGlucCk7Ci0JCQkJbGVuID0gMDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBFQVBTUlBfU1ZBTElEQVRPUjoKLQkJCQlpZiAobGVuIDwgc2l6ZW9mICh1X2ludDMyX3QpKQotCQkJCQlicmVhazsKLQkJCQlHRVRMT05HKHV2YWwsIGlucCk7Ci0JCQkJbGVuIC09IHNpemVvZiAodV9pbnQzMl90KTsKLQkJCQlpZiAodXZhbCAmIFNSUFZBTF9FQklUKSB7Ci0JCQkJCXByaW50ZXIoYXJnLCAiIEUiKTsKLQkJCQkJdXZhbCAmPSB+U1JQVkFMX0VCSVQ7Ci0JCQkJfQotCQkJCWlmICh1dmFsICE9IDApIHsKLQkJCQkJcHJpbnRlcihhcmcsICIgZjwlWD4iLCB1dmFsKTsKLQkJCQl9Ci0JCQkJaWYgKCh2YWxsZW4gPSBsZW4pID4gU0hBX0RJR0VTVFNJWkUpCi0JCQkJCXZhbGxlbiA9IFNIQV9ESUdFU1RTSVpFOwotCQkJCXByaW50ZXIoYXJnLCAiIDxNMiUuKkIlcz4iLCBsZW4sIGlucCwKLQkJCQkgICAgbGVuIDwgU0hBX0RJR0VTVFNJWkUgPyAiPyIgOiAiIik7Ci0JCQkJSU5DUFRSKHZhbGxlbiwgaW5wKTsKLQkJCQlsZW4gLT0gdmFsbGVuOwotCQkJCWlmIChsZW4gPiAwKSB7Ci0JCQkJCXByaW50ZXIoYXJnLCAiIDxQTiUuKkI+IiwgbGVuLCBpbnApOwotCQkJCQlJTkNQVFIobGVuLCBpbnApOwotCQkJCQlsZW4gPSAwOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBFQVBTUlBfTFdSRUNIQUxMRU5HRToKLQkJCQlwcmludGVyKGFyZywgIiA8Q2hhbGxlbmdlJS4qQj4iLCBsZW4sIGlucCk7Ci0JCQkJSU5DUFRSKGxlbiwgaW5wKTsKLQkJCQlsZW4gPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEVBUF9SRVNQT05TRToKLQkJaWYgKGxlbiA8IDEpCi0JCQlicmVhazsKLQkJR0VUQ0hBUihydHlwZSwgaW5wKTsKLQkJbGVuLS07Ci0JCWlmIChydHlwZSA+PSAxICYmCi0JCSAgICBydHlwZSA8PSBzaXplb2YgKGVhcF90eXBlbmFtZXMpIC8gc2l6ZW9mIChjaGFyICopKQotCQkJcHJpbnRlcihhcmcsICIgJXMiLCBlYXBfdHlwZW5hbWVzW3J0eXBlLTFdKTsKLQkJZWxzZQotCQkJcHJpbnRlcihhcmcsICIgdHlwZT0weCV4IiwgcnR5cGUpOwotCQlzd2l0Y2ggKHJ0eXBlKSB7Ci0JCWNhc2UgRUFQVF9JREVOVElUWToKLQkJCWlmIChsZW4gPiAwKSB7Ci0JCQkJcHJpbnRlcihhcmcsICIgPE5hbWUgIik7Ci0JCQkJcHJpbnRfc3RyaW5nKChjaGFyICopaW5wLCBsZW4sIHByaW50ZXIsIGFyZyk7Ci0JCQkJcHJpbnRlcihhcmcsICI+Iik7Ci0JCQkJSU5DUFRSKGxlbiwgaW5wKTsKLQkJCQlsZW4gPSAwOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBFQVBUX05BSzoKLQkJCWlmIChsZW4gPD0gMCkgewotCQkJCXByaW50ZXIoYXJnLCAiIDxtaXNzaW5nIGhpbnQ+Iik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlHRVRDSEFSKHJ0eXBlLCBpbnApOwotCQkJbGVuLS07Ci0JCQlwcmludGVyKGFyZywgIiA8U3VnZ2VzdGVkLXR5cGUgJTAyWCIsIHJ0eXBlKTsKLQkJCWlmIChydHlwZSA+PSAxICYmCi0JCQkgICAgcnR5cGUgPCBzaXplb2YgKGVhcF90eXBlbmFtZXMpIC8gc2l6ZW9mIChjaGFyICopKQotCQkJCXByaW50ZXIoYXJnLCAiICglcykiLCBlYXBfdHlwZW5hbWVzW3J0eXBlLTFdKTsKLQkJCXByaW50ZXIoYXJnLCAiPiIpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBFQVBUX01ENUNIQVA6Ci0JCQlpZiAobGVuIDw9IDApIHsKLQkJCQlwcmludGVyKGFyZywgIiA8bWlzc2luZyBsZW5ndGg+Iik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlHRVRDSEFSKHZhbGxlbiwgaW5wKTsKLQkJCWxlbi0tOwotCQkJaWYgKHZhbGxlbiA+IGxlbikKLQkJCQlnb3RvIHRydW5jYXRlZDsKLQkJCXByaW50ZXIoYXJnLCAiIDxWYWx1ZSUuKkI+IiwgdmFsbGVuLCBpbnApOwotCQkJSU5DUFRSKHZhbGxlbiwgaW5wKTsKLQkJCWxlbiAtPSB2YWxsZW47Ci0JCQlpZiAobGVuID4gMCkgewotCQkJCXByaW50ZXIoYXJnLCAiIDxOYW1lICIpOwotCQkJCXByaW50X3N0cmluZygoY2hhciAqKWlucCwgbGVuLCBwcmludGVyLCBhcmcpOwotCQkJCXByaW50ZXIoYXJnLCAiPiIpOwotCQkJCUlOQ1BUUihsZW4sIGlucCk7Ci0JCQkJbGVuID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJpbnRlcihhcmcsICIgPE5vIG5hbWU+Iik7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEVBUFRfU1JQOgotCQkJaWYgKGxlbiA8IDEpCi0JCQkJZ290byB0cnVuY2F0ZWQ7Ci0JCQlHRVRDSEFSKHZhbGxlbiwgaW5wKTsKLQkJCWxlbi0tOwotCQkJcHJpbnRlcihhcmcsICItJWQiLCB2YWxsZW4pOwotCQkJc3dpdGNoICh2YWxsZW4pIHsKLQkJCWNhc2UgRUFQU1JQX0NLRVk6Ci0JCQkJcHJpbnRlcihhcmcsICIgPEElLipCPiIsIGxlbiwgaW5wKTsKLQkJCQlJTkNQVFIobGVuLCBpbnApOwotCQkJCWxlbiA9IDA7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgRUFQU1JQX0NWQUxJREFUT1I6Ci0JCQkJaWYgKGxlbiA8IHNpemVvZiAodV9pbnQzMl90KSkKLQkJCQkJYnJlYWs7Ci0JCQkJR0VUTE9ORyh1dmFsLCBpbnApOwotCQkJCWxlbiAtPSBzaXplb2YgKHVfaW50MzJfdCk7Ci0JCQkJaWYgKHV2YWwgJiBTUlBWQUxfRUJJVCkgewotCQkJCQlwcmludGVyKGFyZywgIiBFIik7Ci0JCQkJCXV2YWwgJj0gflNSUFZBTF9FQklUOwotCQkJCX0KLQkJCQlpZiAodXZhbCAhPSAwKSB7Ci0JCQkJCXByaW50ZXIoYXJnLCAiIGY8JVg+IiwgdXZhbCk7Ci0JCQkJfQotCQkJCXByaW50ZXIoYXJnLCAiIDxNMSUuKkIlcz4iLCBsZW4sIGlucCwKLQkJCQkgICAgbGVuID09IFNIQV9ESUdFU1RTSVpFID8gIiIgOiAiPyIpOwotCQkJCUlOQ1BUUihsZW4sIGlucCk7Ci0JCQkJbGVuID0gMDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBFQVBTUlBfQUNLOgotCQkJCWJyZWFrOwotCi0JCQljYXNlIEVBUFNSUF9MV1JFQ0hBTExFTkdFOgotCQkJCXByaW50ZXIoYXJnLCAiIDxSZXNwb25zZSUuKkIlcz4iLCBsZW4sIGlucCwKLQkJCQkgICAgbGVuID09IFNIQV9ESUdFU1RTSVpFID8gIiIgOiAiPyIpOwotCQkJCWlmICgodmFsbGVuID0gbGVuKSA+IFNIQV9ESUdFU1RTSVpFKQotCQkJCQl2YWxsZW4gPSBTSEFfRElHRVNUU0laRTsKLQkJCQlJTkNQVFIodmFsbGVuLCBpbnApOwotCQkJCWxlbiAtPSB2YWxsZW47Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgRUFQX1NVQ0NFU1M6CS8qIE5vIHBheWxvYWQgZXhwZWN0ZWQgZm9yIHRoZXNlISAqLwotCWNhc2UgRUFQX0ZBSUxVUkU6Ci0JCWJyZWFrOwotCi0JdHJ1bmNhdGVkOgotCQlwcmludGVyKGFyZywgIiA8dHJ1bmNhdGVkPiIpOwotCQlicmVhazsKLQl9Ci0KLQlpZiAobGVuID4gOCkKLQkJcHJpbnRlcihhcmcsICIlOEIuLi4iLCBpbnApOwotCWVsc2UgaWYgKGxlbiA+IDApCi0JCXByaW50ZXIoYXJnLCAiJS4qQiIsIGxlbiwgaW5wKTsKLQlJTkNQVFIobGVuLCBpbnApOwotCi0JcmV0dXJuIChpbnAgLSBwc3RhcnQpOwotfQpkaWZmIC0tZ2l0IGEvcHBwZC9lYXAuaCBiL3BwcGQvZWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OWQxODQuLjAwMDAwMDAKLS0tIGEvcHBwZC9lYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKgotICogZWFwLmggLSBFeHRlbnNpYmxlIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sIGZvciBQUFAgKFJGQyAyMjg0KQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIE5vbi1leGNsdXNpdmUgcmlnaHRzIHRvIHJlZGlzdHJpYnV0ZSwgbW9kaWZ5LCB0cmFuc2xhdGUsIGFuZCB1c2UKLSAqIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIGluIHdob2xlIG9yIGluIHBhcnQsIGlzCi0gKiBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcwotICogZHVwbGljYXRlZCBpbiBhbnkgc291cmNlIGZvcm0sIGFuZCB0aGF0IG5laXRoZXIgdGhlIG5hbWUgb2YgdGhlCi0gKiBjb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgYXV0aG9yIGlzIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZS4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBPcmlnaW5hbCB2ZXJzaW9uIGJ5IEphbWVzIENhcmxzb24KLSAqCi0gKiAkSWQ6IGVhcC5oLHYgMS4yIDIwMDMvMDYvMTEgMjM6NTY6MjYgcGF1bHVzIEV4cCAkCi0gKi8KLQotI2lmbmRlZiBQUFBfRUFQX0gKLSNkZWZpbmUJUFBQX0VBUF9ICi0KLSNpZmRlZglfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoKLSAqIFBhY2tldCBoZWFkZXIgPSBDb2RlLCBpZCwgbGVuZ3RoLgotICovCi0jZGVmaW5lCUVBUF9IRUFERVJMRU4JNAotCi0KLS8qIEVBUCBtZXNzYWdlIGNvZGVzLiAqLwotI2RlZmluZQlFQVBfUkVRVUVTVAkxCi0jZGVmaW5lCUVBUF9SRVNQT05TRQkyCi0jZGVmaW5lCUVBUF9TVUNDRVNTCTMKLSNkZWZpbmUJRUFQX0ZBSUxVUkUJNAotCi0vKiBFQVAgdHlwZXMgKi8KLSNkZWZpbmUJRUFQVF9JREVOVElUWQkJMQotI2RlZmluZQlFQVBUX05PVElGSUNBVElPTgkyCi0jZGVmaW5lCUVBUFRfTkFLCQkzCS8qIChyZXNwb25zZSBvbmx5KSAqLwotI2RlZmluZQlFQVBUX01ENUNIQVAJCTQKLSNkZWZpbmUJRUFQVF9PVFAJCTUJLyogT25lLVRpbWUgUGFzc3dvcmQ7IFJGQyAxOTM4ICovCi0jZGVmaW5lCUVBUFRfVE9LRU4JCTYJLyogR2VuZXJpYyBUb2tlbiBDYXJkICovCi0vKiA3IGFuZCA4IGFyZSB1bmFzc2lnbmVkLiAqLwotI2RlZmluZQlFQVBUX1JTQQkJOQkvKiBSU0EgUHVibGljIEtleSBBdXRoZW50aWNhdGlvbiAqLwotI2RlZmluZQlFQVBUX0RTUwkJMTAJLyogRFNTIFVuaWxhdGVyYWwgKi8KLSNkZWZpbmUJRUFQVF9LRUEJCTExCS8qIEtFQSAqLwotI2RlZmluZQlFQVBUX0tFQV9WQUxJREFURQkxMgkvKiBLRUEtVkFMSURBVEUJKi8KLSNkZWZpbmUJRUFQVF9UTFMJCTEzCS8qIEVBUC1UTFMgKi8KLSNkZWZpbmUJRUFQVF9ERUZFTkRFUgkJMTQJLyogRGVmZW5kZXIgVG9rZW4gKEFYRU5UKSAqLwotI2RlZmluZQlFQVBUX1cySwkJMTUJLyogV2luZG93cyAyMDAwIEVBUCAqLwotI2RlZmluZQlFQVBUX0FSQ09UCQkxNgkvKiBBcmNvdCBTeXN0ZW1zICovCi0jZGVmaW5lCUVBUFRfQ0lTQ09XSVJFTEVTUwkxNwkvKiBDaXNjbyBXaXJlbGVzcyAqLwotI2RlZmluZQlFQVBUX05PS0lBQ0FSRAkJMTgJLyogTm9raWEgSVAgc21hcnQgY2FyZCAqLwotI2RlZmluZQlFQVBUX1NSUAkJMTkJLyogU2VjdXJlIFJlbW90ZSBQYXNzd29yZCAqLwotLyogMjAgaXMgZGVwcmVjYXRlZCAqLwotCi0vKiBFQVAgU1JQLVNIQTEgU3VidHlwZXMgKi8KLSNkZWZpbmUJRUFQU1JQX0NIQUxMRU5HRQkxCS8qIFJlcXVlc3QgMSAtIENoYWxsZW5nZSAqLwotI2RlZmluZQlFQVBTUlBfQ0tFWQkJMQkvKiBSZXNwb25zZSAxIC0gQ2xpZW50IEtleSAqLwotI2RlZmluZQlFQVBTUlBfU0tFWQkJMgkvKiBSZXF1ZXN0IDIgLSBTZXJ2ZXIgS2V5ICovCi0jZGVmaW5lCUVBUFNSUF9DVkFMSURBVE9SCTIJLyogUmVzcG9uc2UgMiAtIENsaWVudCBWYWxpZGF0b3IgKi8KLSNkZWZpbmUJRUFQU1JQX1NWQUxJREFUT1IJMwkvKiBSZXF1ZXN0IDMgLSBTZXJ2ZXIgVmFsaWRhdG9yICovCi0jZGVmaW5lCUVBUFNSUF9BQ0sJCTMJLyogUmVzcG9uc2UgMyAtIGZpbmFsIGFjayAqLwotI2RlZmluZQlFQVBTUlBfTFdSRUNIQUxMRU5HRQk0CS8qIFJlcS9yZXNwIDQgLSBMaWdodHdlaWdodCByZWNoYWwgKi8KLQotI2RlZmluZQlTUlBWQUxfRUJJVAkweDAwMDAwMDAxCS8qIFVzZSBzaGFyZWQga2V5IGZvciBFQ1AgKi8KLQotI2RlZmluZQlTUlBfUFNFVURPX0lECSJwc2V1ZG9fIgotI2RlZmluZQlTUlBfUFNFVURPX0xFTgk3Ci0KLSNkZWZpbmUgTUQ1X1NJR05BVFVSRV9TSVpFCTE2Ci0jZGVmaW5lIE1JTl9DSEFMTEVOR0VfTEVOR1RICTE2Ci0jZGVmaW5lIE1BWF9DSEFMTEVOR0VfTEVOR1RICTI0Ci0KLWVudW0gZWFwX3N0YXRlX2NvZGUgewotCWVhcEluaXRpYWwgPSAwLAkvKiBObyBFQVAgYXV0aGVudGljYXRpb24geWV0IHJlcXVlc3RlZCAqLwotCWVhcFBlbmRpbmcsCS8qIFdhaXRpbmcgZm9yIExDUCAobm8gdGltZXIpICovCi0JZWFwQ2xvc2VkLAkvKiBBdXRoZW50aWNhdGlvbiBub3QgaW4gdXNlICovCi0JZWFwTGlzdGVuLAkvKiBDbGllbnQgcmVhZHkgKGFuZCB0aW1lciBydW5uaW5nKSAqLwotCWVhcElkZW50aWZ5LAkvKiBFQVAgSWRlbnRpZnkgc2VudCAqLwotCWVhcFNSUDEsCS8qIFNlbnQgRUFQIFNSUC1TSEExIFN1YnR5cGUgMSAqLwotCWVhcFNSUDIsCS8qIFNlbnQgRUFQIFNSUC1TSEExIFN1YnR5cGUgMiAqLwotCWVhcFNSUDMsCS8qIFNlbnQgRUFQIFNSUC1TSEExIFN1YnR5cGUgMyAqLwotCWVhcE1ENUNoYWxsLAkvKiBTZW50IE1ENS1DaGFsbGVuZ2UgKi8KLQllYXBPcGVuLAkvKiBDb21wbGV0ZWQgYXV0aGVudGljYXRpb24gKi8KLQllYXBTUlA0LAkvKiBTZW50IEVBUCBTUlAtU0hBMSBTdWJ0eXBlIDQgKi8KLQllYXBCYWRBdXRoCS8qIEZhaWxlZCBhdXRoZW50aWNhdGlvbiAqLwotfTsKLQotI2RlZmluZQlFQVBfU1RBVEVTCVwKLQkiSW5pdGlhbCIsICJQZW5kaW5nIiwgIkNsb3NlZCIsICJMaXN0ZW4iLCAiSWRlbnRpZnkiLCBcCi0JIlNSUDEiLCAiU1JQMiIsICJTUlAzIiwgIk1ENUNoYWxsIiwgIk9wZW4iLCAiU1JQNCIsICJCYWRBdXRoIgotCi0jZGVmaW5lCWVhcF9jbGllbnRfYWN0aXZlKGVzcCkJKChlc3ApLT5lc19jbGllbnQuZWFfc3RhdGUgPT0gZWFwTGlzdGVuKQotI2RlZmluZQllYXBfc2VydmVyX2FjdGl2ZShlc3ApCVwKLQkoKGVzcCktPmVzX3NlcnZlci5lYV9zdGF0ZSA+PSBlYXBJZGVudGlmeSAmJiBcCi0JIChlc3ApLT5lc19zZXJ2ZXIuZWFfc3RhdGUgPD0gZWFwTUQ1Q2hhbGwpCi0KLXN0cnVjdCBlYXBfYXV0aCB7Ci0JY2hhciAqZWFfbmFtZTsJCS8qIE91ciBuYW1lICovCi0JY2hhciAqZWFfcGVlcjsJCS8qIFBlZXIncyBuYW1lICovCi0Jdm9pZCAqZWFfc2Vzc2lvbjsJLyogQXV0aGVudGljYXRpb24gbGlicmFyeSBsaW5rYWdlICovCi0JdV9jaGFyICplYV9za2V5OwkvKiBTaGFyZWQgZW5jcnlwdGlvbiBrZXkgKi8KLQlpbnQgZWFfdGltZW91dDsJCS8qIFRpbWUgdG8gd2FpdCAoZm9yIHJldHJhbnNtaXQvZmFpbCkgKi8KLQlpbnQgZWFfbWF4cmVxdWVzdHM7CS8qIE1heCBSZXF1ZXN0cyBhbGxvd2VkICovCi0JdV9zaG9ydCBlYV9uYW1lbGVuOwkvKiBMZW5ndGggb2Ygb3VyIG5hbWUgKi8KLQl1X3Nob3J0IGVhX3BlZXJsZW47CS8qIExlbmd0aCBvZiBwZWVyJ3MgbmFtZSAqLwotCWVudW0gZWFwX3N0YXRlX2NvZGUgZWFfc3RhdGU7Ci0JdV9jaGFyIGVhX2lkOwkJLyogQ3VycmVudCBpZCAqLwotCXVfY2hhciBlYV9yZXF1ZXN0czsJLyogTnVtYmVyIG9mIFJlcXVlc3RzIHNlbnQvcmVjZWl2ZWQgKi8KLQl1X2NoYXIgZWFfcmVzcG9uc2VzOwkvKiBOdW1iZXIgb2YgUmVzcG9uc2VzICovCi0JdV9jaGFyIGVhX3R5cGU7CQkvKiBPbmUgb2YgRUFQVF8qICovCi0JdV9pbnQzMl90IGVhX2tleWZsYWdzOwkvKiBTUlAgc2hhcmVkIGtleSB1c2FnZSBmbGFncyAqLwotfTsKLQotLyoKLSAqIENvbXBsZXRlIEVBUCBzdGF0ZSBmb3Igb25lIFBQUCBzZXNzaW9uLgotICovCi10eXBlZGVmIHN0cnVjdCBlYXBfc3RhdGUgewotCWludCBlc191bml0OwkJCS8qIEludGVyZmFjZSB1bml0IG51bWJlciAqLwotCXN0cnVjdCBlYXBfYXV0aCBlc19jbGllbnQ7CS8qIENsaWVudCAoYXV0aGVudGljYXRlZSkgZGF0YSAqLwotCXN0cnVjdCBlYXBfYXV0aCBlc19zZXJ2ZXI7CS8qIFNlcnZlciAoYXV0aGVudGljYXRvcikgZGF0YSAqLwotCWludCBlc19zYXZlZHRpbWU7CQkvKiBTYXZlZCB0aW1lb3V0ICovCi0JaW50IGVzX3JlY2hhbGxlbmdlOwkJLyogRUFQIHJlY2hhbGxlbmdlIGludGVydmFsICovCi0JaW50IGVzX2x3cmVjaGFsbGVuZ2U7CQkvKiBTUlAgbGlnaHR3ZWlnaHQgcmVjaGFsbGVuZ2UgaW50ZXIgKi8KLQlib29sIGVzX3VzZXBzZXVkbzsJCS8qIFVzZSBTUlAgUHNldWRvbnltIGlmIG9mZmVyZWQgb25lICovCi0JaW50IGVzX3VzZWRwc2V1ZG87CQkvKiBTZXQgaWYgd2UgYWxyZWFkeSBzZW50IFBOICovCi0JaW50IGVzX2NoYWxsZW47CQkJLyogTGVuZ3RoIG9mIGNoYWxsZW5nZSBzdHJpbmcgKi8KLQl1X2NoYXIgZXNfY2hhbGxlbmdlW01BWF9DSEFMTEVOR0VfTEVOR1RIXTsKLX0gZWFwX3N0YXRlOwotCi0vKgotICogVGltZW91dHMuCi0gKi8KLSNkZWZpbmUJRUFQX0RFRlRJTUVPVVQJCTMJLyogVGltZW91dCAoc2Vjb25kcykgZm9yIHJleG1pdCAqLwotI2RlZmluZQlFQVBfREVGVFJBTlNNSVRTCTEwCS8qIG1heCAjIHRpbWVzIHRvIHRyYW5zbWl0ICovCi0jZGVmaW5lCUVBUF9ERUZSRVFUSU1FCQkyMAkvKiBUaW1lIHRvIHdhaXQgZm9yIHBlZXIgcmVxdWVzdCAqLwotI2RlZmluZQlFQVBfREVGQUxMT1dSRVEJCTIwCS8qIG1heCAjIHRpbWVzIHRvIGFjY2VwdCByZXF1ZXN0cyAqLwotCi1leHRlcm4gZWFwX3N0YXRlIGVhcF9zdGF0ZXNbXTsKLQotdm9pZCBlYXBfYXV0aHdpdGhwZWVyIF9fUCgoaW50IHVuaXQsIGNoYXIgKmxvY2FsbmFtZSkpOwotdm9pZCBlYXBfYXV0aHBlZXIgX19QKChpbnQgdW5pdCwgY2hhciAqbG9jYWxuYW1lKSk7Ci0KLWV4dGVybiBzdHJ1Y3QgcHJvdGVudCBlYXBfcHJvdGVudDsKLQotI2lmZGVmCV9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIFBQUF9FQVBfSCAqLwotCmRpZmYgLS1naXQgYS9wcHBkL2VjcC5jIGIvcHBwZC9lY3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU3NTRlNS4uMDAwMDAwMAotLS0gYS9wcHBkL2VjcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qCi0gKiBlY3AuYyAtIFBQUCBFbmNyeXB0aW9uIENvbnRyb2wgUHJvdG9jb2wuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyIEdvb2dsZSwgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgbmFtZShzKSBvZiB0aGUgYXV0aG9ycyBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhFIEFVVEhPUlMgT0YgVEhJUyBTT0ZUV0FSRSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotICogVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi0gKiBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi0gKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi0gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqCi0gKiBEZXJpdmVkIGZyb20gY2NwLmMsIHdoaWNoIGlzOgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NC0yMDAyIFBhdWwgTWFja2VycmFzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIDMuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgUGF1bCBNYWNrZXJyYXMKLSAqICAgICA8cGF1bHVzQHNhbWJhLm9yZz4iLgotICoKLSAqIFRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLSAqIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotICogQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2RlZmluZSBSQ1NJRAkiJElkOiBlY3AuYyx2IDEuNCAyMDA0LzExLzA0IDEwOjAyOjI2IHBhdWx1cyBFeHAgJCIKLQotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSA9IFJDU0lEOwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJwcHBkLmgiCi0jaW5jbHVkZSAiZnNtLmgiCi0jaW5jbHVkZSAiZWNwLmgiCi0KLXN0YXRpYyBvcHRpb25fdCBlY3Bfb3B0aW9uX2xpc3RbXSA9IHsKLSAgICB7ICJub2VjcCIsIG9fYm9vbCwgJmVjcF9wcm90ZW50LmVuYWJsZWRfZmxhZywKLSAgICAgICJEaXNhYmxlIEVDUCBuZWdvdGlhdGlvbiIgfSwKLSAgICB7ICItZWNwIiwgb19ib29sLCAmZWNwX3Byb3RlbnQuZW5hYmxlZF9mbGFnLAotICAgICAgIkRpc2FibGUgRUNQIG5lZ290aWF0aW9uIiwgT1BUX0FMSUFTIH0sCi0KLSAgICB7IE5VTEwgfQotfTsKLQotLyoKLSAqIFByb3RvY29sIGVudHJ5IHBvaW50cyBmcm9tIG1haW4gY29kZS4KLSAqLwotc3RhdGljIHZvaWQgZWNwX2luaXQgX19QKChpbnQgdW5pdCkpOwotLyoKLXN0YXRpYyB2b2lkIGVjcF9vcGVuIF9fUCgoaW50IHVuaXQpKTsKLXN0YXRpYyB2b2lkIGVjcF9jbG9zZSBfX1AoKGludCB1bml0LCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGVjcF9sb3dlcnVwIF9fUCgoaW50IHVuaXQpKTsKLXN0YXRpYyB2b2lkIGVjcF9sb3dlcmRvd24gX19QKChpbnQpKTsKLXN0YXRpYyB2b2lkIGVjcF9pbnB1dCBfX1AoKGludCB1bml0LCB1X2NoYXIgKnBrdCwgaW50IGxlbikpOwotc3RhdGljIHZvaWQgZWNwX3Byb3RyZWogX19QKChpbnQgdW5pdCkpOwotKi8KLXN0YXRpYyBpbnQgIGVjcF9wcmludHBrdCBfX1AoKHVfY2hhciAqcGt0LCBpbnQgbGVuLAotCQkJICAgICAgdm9pZCAoKnByaW50ZXIpIF9fUCgodm9pZCAqLCBjaGFyICosIC4uLikpLAotCQkJICAgICAgdm9pZCAqYXJnKSk7Ci0vKgotc3RhdGljIHZvaWQgZWNwX2RhdGFpbnB1dCBfX1AoKGludCB1bml0LCB1X2NoYXIgKnBrdCwgaW50IGxlbikpOwotKi8KLQotc3RydWN0IHByb3RlbnQgZWNwX3Byb3RlbnQgPSB7Ci0gICAgUFBQX0VDUCwKLSAgICBlY3BfaW5pdCwKLSAgICBOVUxMLCAvKiBlY3BfaW5wdXQsICovCi0gICAgTlVMTCwgLyogZWNwX3Byb3RyZWosICovCi0gICAgTlVMTCwgLyogZWNwX2xvd2VydXAsICovCi0gICAgTlVMTCwgLyogZWNwX2xvd2VyZG93biwgKi8KLSAgICBOVUxMLCAvKiBlY3Bfb3BlbiwgKi8KLSAgICBOVUxMLCAvKiBlY3BfY2xvc2UsICovCi0gICAgZWNwX3ByaW50cGt0LAotICAgIE5VTEwsIC8qIGVjcF9kYXRhaW5wdXQsICovCi0gICAgMCwKLSAgICAiRUNQIiwKLSAgICAiRW5jcnlwdGVkIiwKLSAgICBlY3Bfb3B0aW9uX2xpc3QsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwKLX07Ci0KLWZzbSBlY3BfZnNtW05VTV9QUFBdOwotZWNwX29wdGlvbnMgZWNwX3dhbnRvcHRpb25zW05VTV9QUFBdOwkvKiB3aGF0IHRvIHJlcXVlc3QgdGhlIHBlZXIgdG8gdXNlICovCi1lY3Bfb3B0aW9ucyBlY3BfZ290b3B0aW9uc1tOVU1fUFBQXTsJLyogd2hhdCB0aGUgcGVlciBhZ3JlZWQgdG8gZG8gKi8KLWVjcF9vcHRpb25zIGVjcF9hbGxvd29wdGlvbnNbTlVNX1BQUF07CS8qIHdoYXQgd2UnbGwgYWdyZWUgdG8gZG8gKi8KLWVjcF9vcHRpb25zIGVjcF9oaXNvcHRpb25zW05VTV9QUFBdOwkvKiB3aGF0IHdlIGFncmVlZCB0byBkbyAqLwotCi1zdGF0aWMgZnNtX2NhbGxiYWNrcyBlY3BfY2FsbGJhY2tzID0gewotICAgIE5VTEwsIC8qIGVjcF9yZXNldGNpLCAqLwotICAgIE5VTEwsIC8qIGVjcF9jaWxlbiwgKi8KLSAgICBOVUxMLCAvKiBlY3BfYWRkY2ksICovCi0gICAgTlVMTCwgLyogZWNwX2Fja2NpLCAqLwotICAgIE5VTEwsIC8qIGVjcF9uYWtjaSwgKi8KLSAgICBOVUxMLCAvKiBlY3BfcmVqY2ksICovCi0gICAgTlVMTCwgLyogZWNwX3JlcWNpLCAqLwotICAgIE5VTEwsIC8qIGVjcF91cCwgKi8KLSAgICBOVUxMLCAvKiBlY3BfZG93biwgKi8KLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsIC8qIGVjcF9leHRjb2RlLCAqLwotICAgICJFQ1AiCi19OwotCi0vKgotICogZWNwX2luaXQgLSBpbml0aWFsaXplIEVDUC4KLSAqLwotc3RhdGljIHZvaWQKLWVjcF9pbml0KHVuaXQpCi0gICAgaW50IHVuaXQ7Ci17Ci0gICAgZnNtICpmID0gJmVjcF9mc21bdW5pdF07Ci0KLSAgICBmLT51bml0ID0gdW5pdDsKLSAgICBmLT5wcm90b2NvbCA9IFBQUF9FQ1A7Ci0gICAgZi0+Y2FsbGJhY2tzID0gJmVjcF9jYWxsYmFja3M7Ci0gICAgZnNtX2luaXQoZik7Ci0KLSAgICBtZW1zZXQoJmVjcF93YW50b3B0aW9uc1t1bml0XSwgIDAsIHNpemVvZihlY3Bfb3B0aW9ucykpOwotICAgIG1lbXNldCgmZWNwX2dvdG9wdGlvbnNbdW5pdF0sICAgMCwgc2l6ZW9mKGVjcF9vcHRpb25zKSk7Ci0gICAgbWVtc2V0KCZlY3BfYWxsb3dvcHRpb25zW3VuaXRdLCAwLCBzaXplb2YoZWNwX29wdGlvbnMpKTsKLSAgICBtZW1zZXQoJmVjcF9oaXNvcHRpb25zW3VuaXRdLCAgIDAsIHNpemVvZihlY3Bfb3B0aW9ucykpOwotCi19Ci0KLQotc3RhdGljIGludAotZWNwX3ByaW50cGt0KHAsIHBsZW4sIHByaW50ZXIsIGFyZykKLSAgICB1X2NoYXIgKnA7Ci0gICAgaW50IHBsZW47Ci0gICAgdm9pZCAoKnByaW50ZXIpIF9fUCgodm9pZCAqLCBjaGFyICosIC4uLikpOwotICAgIHZvaWQgKmFyZzsKLXsKLSAgICByZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvcHBwZC9lY3AuaCBiL3BwcGQvZWNwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNmUzY2EuLjAwMDAwMDAKLS0tIGEvcHBwZC9lY3AuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBlY3AuaCAtIERlZmluaXRpb25zIGZvciBQUFAgRW5jcnlwdGlvbiBDb250cm9sIFByb3RvY29sLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMiBHb29nbGUsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLSAqIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotICogQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKgotICogJElkOiBlY3AuaCx2IDEuMiAyMDAzLzAxLzEwIDA3OjEyOjM2IGZjdXNhY2sgRXhwICQKLSAqLwotCi10eXBlZGVmIHN0cnVjdCBlY3Bfb3B0aW9ucyB7Ci0gICAgYm9vbCByZXF1aXJlZDsJCS8qIElzIEVDUCByZXF1aXJlZD8gKi8KLSAgICB1bnNpZ25lZCBlbmN0eXBlOwkJLyogRW5jcnlwdGlvbiB0eXBlICovCi19IGVjcF9vcHRpb25zOwotCi1leHRlcm4gZnNtIGVjcF9mc21bXTsKLWV4dGVybiBlY3Bfb3B0aW9ucyBlY3Bfd2FudG9wdGlvbnNbXTsKLWV4dGVybiBlY3Bfb3B0aW9ucyBlY3BfZ290b3B0aW9uc1tdOwotZXh0ZXJuIGVjcF9vcHRpb25zIGVjcF9hbGxvd29wdGlvbnNbXTsKLWV4dGVybiBlY3Bfb3B0aW9ucyBlY3BfaGlzb3B0aW9uc1tdOwotCi1leHRlcm4gc3RydWN0IHByb3RlbnQgZWNwX3Byb3RlbnQ7CmRpZmYgLS1naXQgYS9wcHBkL2V1aTY0LmMgYi9wcHBkL2V1aTY0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMjVlZmYuLjAwMDAwMDAKLS0tIGEvcHBwZC9ldWk2NC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIGV1aTY0LmMgLSBFVUk2NCByb3V0aW5lcyBmb3IgSVB2NkNQLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUb21taSBLb211bGFpbmVuLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgbmFtZShzKSBvZiB0aGUgYXV0aG9ycyBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogNC4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBUb21taSBLb211bGFpbmVuCi0gKiAgICAgPFRvbW1pLktvbXVsYWluZW5AaWtpLmZpPiIuCi0gKgotICogVEhFIEFVVEhPUlMgT0YgVEhJUyBTT0ZUV0FSRSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotICogVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi0gKiBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi0gKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi0gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqCi0gKiAkSWQ6IGV1aTY0LmMsdiAxLjYgMjAwMi8xMi8wNCAyMzowMzozMiBwYXVsdXMgRXhwICQKLSAqLwotCi0jZGVmaW5lIFJDU0lECSIkSWQ6IGV1aTY0LmMsdiAxLjYgMjAwMi8xMi8wNCAyMzowMzozMiBwYXVsdXMgRXhwICQiCi0KLSNpbmNsdWRlICJwcHBkLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gPSBSQ1NJRDsKLQotLyoKLSAqIGV1aTY0X250b2EgLSBNYWtlIGFuIGFzY2lpIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVyZmFjZSBpZGVudGlmaWVyCi0gKi8KLWNoYXIgKgotZXVpNjRfbnRvYShlKQotICAgIGV1aTY0X3QgZTsKLXsKLSAgICBzdGF0aWMgY2hhciBidWZbMzJdOwotCi0gICAgc25wcmludGYoYnVmLCAzMiwgIiUwMnglMDJ4OiUwMnglMDJ4OiUwMnglMDJ4OiUwMnglMDJ4IiwKLQkgICAgIGUuZThbMF0sIGUuZThbMV0sIGUuZThbMl0sIGUuZThbM10sIAotCSAgICAgZS5lOFs0XSwgZS5lOFs1XSwgZS5lOFs2XSwgZS5lOFs3XSk7Ci0gICAgcmV0dXJuIGJ1ZjsKLX0KZGlmZiAtLWdpdCBhL3BwcGQvZXVpNjQuaCBiL3BwcGQvZXVpNjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2YjZmZC4uMDAwMDAwMAotLS0gYS9wcHBkL2V1aTY0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIGV1aTY0LmggLSBFVUk2NCByb3V0aW5lcyBmb3IgSVB2NkNQLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBUb21taSBLb211bGFpbmVuLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgbmFtZShzKSBvZiB0aGUgYXV0aG9ycyBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogNC4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBUb21taSBLb211bGFpbmVuCi0gKiAgICAgPFRvbW1pLktvbXVsYWluZW5AaWtpLmZpPiIuCi0gKgotICogVEhFIEFVVEhPUlMgT0YgVEhJUyBTT0ZUV0FSRSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotICogVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi0gKiBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi0gKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi0gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqCi0gKiAkSWQ6IGV1aTY0LmgsdiAxLjYgMjAwMi8xMi8wNCAyMzowMzozMiBwYXVsdXMgRXhwICQKLSovCi0KLSNpZm5kZWYgX19FVUk2NF9IX18KLSNkZWZpbmUgX19FVUk2NF9IX18KLQotI2lmICFkZWZpbmVkKElORVQ2KQotI2Vycm9yCSJ0aGlzIGZpbGUgc2hvdWxkIG9ubHkgYmUgaW5jbHVkZWQgd2hlbiBJTkVUNiBpcyBkZWZpbmVkIgotI2VuZGlmIC8qIG5vdCBkZWZpbmVkKElORVQ2KSAqLwotCi0jaWYgZGVmaW5lZChTT0wyKQotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLQotdHlwZWRlZiB1bmlvbiB7Ci0gICAgdWludDhfdAllOFs4XTsJCS8qIGxvd2VyIDY0LWJpdCBJUHY2IGFkZHJlc3MgKi8KLSAgICB1aW50MzJfdAllMzJbMl07CQkvKiBsb3dlciA2NC1iaXQgSVB2NiBhZGRyZXNzICovCi19IGV1aTY0X3Q7Ci0KLS8qCi0gKiBEZWNsYXJlIHRoZSB0d28gYmVsb3csIHNpbmNlIGluLmggb25seSBkZWZpbmVzIHRoZW0gd2hlbiBfS0VSTkVMCi0gKiBpcyBkZWNsYXJlZCAtIHdoaWNoIHNob3VsZG4ndCBiZSB0cnVlIHdoZW4gZGVhbGluZyB3aXRoIHVzZXItbGFuZCBwcm9ncmFtcwotICovCi0jZGVmaW5lCXM2X2FkZHI4CV9TNl91bi5fUzZfdTgKLSNkZWZpbmUJczZfYWRkcjMyCV9TNl91bi5fUzZfdTMyCi0KLSNlbHNlIC8qIGVsc2UgaWYgbm90IGRlZmluZWQoU09MMikgKi8KLQotLyoKLSAqIFRPRE86Ci0gKgotICogTWF5YmUgdGhpcyBzaG91bGQgYmUgZG9uZSBieSBwcm9jZXNzaW5nIHN0cnVjdCBpbjZfYWRkciBkaXJlY3RseS4uLgotICovCi10eXBlZGVmIHVuaW9uCi17Ci0gICAgdV9pbnQ4X3QgZThbOF07Ci0gICAgdV9pbnQxNl90IGUxNls0XTsKLSAgICB1X2ludDMyX3QgZTMyWzJdOwotfSBldWk2NF90OwotCi0jZW5kaWYgLyogZGVmaW5lZChTT0wyKSAqLwotCi0jZGVmaW5lIGV1aTY0X2lzemVybyhlKQkJKCgoZSkuZTMyWzBdIHwgKGUpLmUzMlsxXSkgPT0gMCkKLSNkZWZpbmUgZXVpNjRfZXF1YWxzKGUsIG8pCSgoKGUpLmUzMlswXSA9PSAobykuZTMyWzBdKSAmJiBcCi0JCQkJKChlKS5lMzJbMV0gPT0gKG8pLmUzMlsxXSkpCi0jZGVmaW5lIGV1aTY0X3plcm8oZSkJCShlKS5lMzJbMF0gPSAoZSkuZTMyWzFdID0gMDsKLQotI2RlZmluZSBldWk2NF9jb3B5KHMsIGQpCW1lbWNweSgmKGQpLCAmKHMpLCBzaXplb2YoZXVpNjRfdCkpCi0KLSNkZWZpbmUgZXVpNjRfbWFnaWMoZSkJCWRvIHsJCQlcCi0JCQkJKGUpLmUzMlswXSA9IG1hZ2ljKCk7CVwKLQkJCQkoZSkuZTMyWzFdID0gbWFnaWMoKTsJXAotCQkJCShlKS5lOFswXSAmPSB+MjsJXAotCQkJCX0gd2hpbGUgKDApCi0jZGVmaW5lIGV1aTY0X21hZ2ljX256KHgpCWRvIHsJCQkJXAotCQkJCWV1aTY0X21hZ2ljKHgpOwkJCVwKLQkJCQl9IHdoaWxlIChldWk2NF9pc3plcm8oeCkpCi0jZGVmaW5lIGV1aTY0X21hZ2ljX25lKHgsIHkpCWRvIHsJCQkJXAotCQkJCWV1aTY0X21hZ2ljKHgpOwkJCVwKLQkJCQl9IHdoaWxlIChldWk2NF9lcXVhbHMoeCwgeSkpCi0KLSNkZWZpbmUgZXVpNjRfZ2V0KGxsLCBjcCkJZG8gewkJCQlcCi0JCQkJZXVpNjRfY29weSgoKmNwKSwgKGxsKSk7CVwKLQkJCQkoY3ApICs9IHNpemVvZihldWk2NF90KTsJXAotCQkJCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgZXVpNjRfcHV0KGxsLCBjcCkJZG8gewkJCQlcCi0JCQkJZXVpNjRfY29weSgobGwpLCAoKmNwKSk7CVwKLQkJCQkoY3ApICs9IHNpemVvZihldWk2NF90KTsJXAotCQkJCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgZXVpNjRfc2V0MzIoZSwgbCkJZG8gewkJCVwKLQkJCQkoZSkuZTMyWzBdID0gMDsJCVwKLQkJCQkoZSkuZTMyWzFdID0gaHRvbmwobCk7CVwKLQkJCQl9IHdoaWxlICgwKQotI2RlZmluZSBldWk2NF9zZXRsbzMyKGUsIGwpCWV1aTY0X3NldDMyKGUsIGwpCi0KLWNoYXIgKmV1aTY0X250b2EgX19QKChldWk2NF90KSk7CS8qIFJldHVybnMgYXNjaWkgcmVwcmVzZW50YXRpb24gb2YgaWQgKi8KLQotI2VuZGlmIC8qIF9fRVVJNjRfSF9fICovCi0KZGlmZiAtLWdpdCBhL3BwcGQvZnNtLmMgYi9wcHBkL2ZzbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjAwY2MzLi4wMDAwMDAwCi0tLSBhL3BwcGQvZnNtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MTcgKzAsMCBAQAotLyoKLSAqIGZzbS5jIC0ge0xpbmssIElQfSBDb250cm9sIFByb3RvY29sIEZpbml0ZSBTdGF0ZSBNYWNoaW5lLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk4NC0yMDAwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBuYW1lICJDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHBlcm1pc3Npb24gb3IgYW55IGxlZ2FsCi0gKiAgICBkZXRhaWxzLCBwbGVhc2UgY29udGFjdAotICogICAgICBPZmZpY2Ugb2YgVGVjaG5vbG9neSBUcmFuc2ZlcgotICogICAgICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQotICogICAgICA1MDAwIEZvcmJlcyBBdmVudWUKLSAqICAgICAgUGl0dHNidXJnaCwgUEEgIDE1MjEzLTM4OTAKLSAqICAgICAgKDQxMikgMjY4LTQzODcsIGZheDogKDQxMikgMjY4LTczOTUKLSAqICAgICAgdGVjaC10cmFuc2ZlckBhbmRyZXcuY211LmVkdQotICoKLSAqIDQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQ29tcHV0aW5nIFNlcnZpY2VzCi0gKiAgICAgYXQgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkgKGh0dHA6Ly93d3cuY211LmVkdS9jb21wdXRpbmcvKS4iCi0gKgotICogQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi0gKiBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLSAqIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLSAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLSAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNkZWZpbmUgUkNTSUQJIiRJZDogZnNtLmMsdiAxLjIzIDIwMDQvMTEvMTMgMDI6Mjg6MTUgcGF1bHVzIEV4cCAkIgotCi0vKgotICogVE9ETzoKLSAqIFJhbmRvbWl6ZSBmc20gaWQgb24gbGluay9pbml0LgotICogRGVhbCB3aXRoIHZhcmlhYmxlIG91dGdvaW5nIE1UVS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgInBwcGQuaCIKLSNpbmNsdWRlICJmc20uaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSA9IFJDU0lEOwotCi1zdGF0aWMgdm9pZCBmc21fdGltZW91dCBfX1AoKHZvaWQgKikpOwotc3RhdGljIHZvaWQgZnNtX3Jjb25mcmVxIF9fUCgoZnNtICosIGludCwgdV9jaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgZnNtX3Jjb25mYWNrIF9fUCgoZnNtICosIGludCwgdV9jaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgZnNtX3Jjb25mbmFrcmVqIF9fUCgoZnNtICosIGludCwgaW50LCB1X2NoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBmc21fcnRlcm1yZXEgX19QKChmc20gKiwgaW50LCB1X2NoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBmc21fcnRlcm1hY2sgX19QKChmc20gKikpOwotc3RhdGljIHZvaWQgZnNtX3Jjb2RlcmVqIF9fUCgoZnNtICosIHVfY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGZzbV9zY29uZnJlcSBfX1AoKGZzbSAqLCBpbnQpKTsKLQotI2RlZmluZSBQUk9UT19OQU1FKGYpCSgoZiktPmNhbGxiYWNrcy0+cHJvdG9fbmFtZSkKLQotaW50IHBlZXJfbXJ1W05VTV9QUFBdOwotCi0KLS8qCi0gKiBmc21faW5pdCAtIEluaXRpYWxpemUgZnNtLgotICoKLSAqIEluaXRpYWxpemUgZnNtIHN0YXRlLgotICovCi12b2lkCi1mc21faW5pdChmKQotICAgIGZzbSAqZjsKLXsKLSAgICBmLT5zdGF0ZSA9IElOSVRJQUw7Ci0gICAgZi0+ZmxhZ3MgPSAwOwotICAgIGYtPmlkID0gMDsJCQkJLyogWFhYIFN0YXJ0IHdpdGggcmFuZG9tIGlkPyAqLwotICAgIGYtPnRpbWVvdXR0aW1lID0gREVGVElNRU9VVDsKLSAgICBmLT5tYXhjb25mcmVxdHJhbnNtaXRzID0gREVGTUFYQ09ORlJFUVM7Ci0gICAgZi0+bWF4dGVybXRyYW5zbWl0cyA9IERFRk1BWFRFUk1SRVFTOwotICAgIGYtPm1heG5ha2xvb3BzID0gREVGTUFYTkFLTE9PUFM7Ci0gICAgZi0+dGVybV9yZWFzb25fbGVuID0gMDsKLX0KLQotCi0vKgotICogZnNtX2xvd2VydXAgLSBUaGUgbG93ZXIgbGF5ZXIgaXMgdXAuCi0gKi8KLXZvaWQKLWZzbV9sb3dlcnVwKGYpCi0gICAgZnNtICpmOwotewotICAgIHN3aXRjaCggZi0+c3RhdGUgKXsKLSAgICBjYXNlIElOSVRJQUw6Ci0JZi0+c3RhdGUgPSBDTE9TRUQ7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIFNUQVJUSU5HOgotCWlmKCBmLT5mbGFncyAmIE9QVF9TSUxFTlQgKQotCSAgICBmLT5zdGF0ZSA9IFNUT1BQRUQ7Ci0JZWxzZSB7Ci0JICAgIC8qIFNlbmQgYW4gaW5pdGlhbCBjb25maWd1cmUtcmVxdWVzdCAqLwotCSAgICBmc21fc2NvbmZyZXEoZiwgMCk7Ci0JICAgIGYtPnN0YXRlID0gUkVRU0VOVDsKLQl9Ci0JYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotCUZTTURFQlVHKCgiJXM6IFVwIGV2ZW50IGluIHN0YXRlICVkISIsIFBST1RPX05BTUUoZiksIGYtPnN0YXRlKSk7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBmc21fbG93ZXJkb3duIC0gVGhlIGxvd2VyIGxheWVyIGlzIGRvd24uCi0gKgotICogQ2FuY2VsIGFsbCB0aW1lb3V0cyBhbmQgaW5mb3JtIHVwcGVyIGxheWVycy4KLSAqLwotdm9pZAotZnNtX2xvd2VyZG93bihmKQotICAgIGZzbSAqZjsKLXsKLSAgICBzd2l0Y2goIGYtPnN0YXRlICl7Ci0gICAgY2FzZSBDTE9TRUQ6Ci0JZi0+c3RhdGUgPSBJTklUSUFMOwotCWJyZWFrOwotCi0gICAgY2FzZSBTVE9QUEVEOgotCWYtPnN0YXRlID0gU1RBUlRJTkc7Ci0JaWYoIGYtPmNhbGxiYWNrcy0+c3RhcnRpbmcgKQotCSAgICAoKmYtPmNhbGxiYWNrcy0+c3RhcnRpbmcpKGYpOwotCWJyZWFrOwotCi0gICAgY2FzZSBDTE9TSU5HOgotCWYtPnN0YXRlID0gSU5JVElBTDsKLQlVTlRJTUVPVVQoZnNtX3RpbWVvdXQsIGYpOwkvKiBDYW5jZWwgdGltZW91dCAqLwotCWJyZWFrOwotCi0gICAgY2FzZSBTVE9QUElORzoKLSAgICBjYXNlIFJFUVNFTlQ6Ci0gICAgY2FzZSBBQ0tSQ1ZEOgotICAgIGNhc2UgQUNLU0VOVDoKLQlmLT5zdGF0ZSA9IFNUQVJUSU5HOwotCVVOVElNRU9VVChmc21fdGltZW91dCwgZik7CS8qIENhbmNlbCB0aW1lb3V0ICovCi0JYnJlYWs7Ci0KLSAgICBjYXNlIE9QRU5FRDoKLQlpZiggZi0+Y2FsbGJhY2tzLT5kb3duICkKLQkgICAgKCpmLT5jYWxsYmFja3MtPmRvd24pKGYpOwotCWYtPnN0YXRlID0gU1RBUlRJTkc7Ci0JYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotCUZTTURFQlVHKCgiJXM6IERvd24gZXZlbnQgaW4gc3RhdGUgJWQhIiwgUFJPVE9fTkFNRShmKSwgZi0+c3RhdGUpKTsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIGZzbV9vcGVuIC0gTGluayBpcyBhbGxvd2VkIHRvIGNvbWUgdXAuCi0gKi8KLXZvaWQKLWZzbV9vcGVuKGYpCi0gICAgZnNtICpmOwotewotICAgIHN3aXRjaCggZi0+c3RhdGUgKXsKLSAgICBjYXNlIElOSVRJQUw6Ci0JZi0+c3RhdGUgPSBTVEFSVElORzsKLQlpZiggZi0+Y2FsbGJhY2tzLT5zdGFydGluZyApCi0JICAgICgqZi0+Y2FsbGJhY2tzLT5zdGFydGluZykoZik7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIENMT1NFRDoKLQlpZiggZi0+ZmxhZ3MgJiBPUFRfU0lMRU5UICkKLQkgICAgZi0+c3RhdGUgPSBTVE9QUEVEOwotCWVsc2UgewotCSAgICAvKiBTZW5kIGFuIGluaXRpYWwgY29uZmlndXJlLXJlcXVlc3QgKi8KLQkgICAgZnNtX3Njb25mcmVxKGYsIDApOwotCSAgICBmLT5zdGF0ZSA9IFJFUVNFTlQ7Ci0JfQotCWJyZWFrOwotCi0gICAgY2FzZSBDTE9TSU5HOgotCWYtPnN0YXRlID0gU1RPUFBJTkc7Ci0JLyogZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSBTVE9QUEVEOgotICAgIGNhc2UgT1BFTkVEOgotCWlmKCBmLT5mbGFncyAmIE9QVF9SRVNUQVJUICl7Ci0JICAgIGZzbV9sb3dlcmRvd24oZik7Ci0JICAgIGZzbV9sb3dlcnVwKGYpOwotCX0KLQlicmVhazsKLSAgICB9Ci19Ci0KLS8qCi0gKiB0ZXJtaW5hdGVfbGF5ZXIgLSBTdGFydCBwcm9jZXNzIG9mIHNodXR0aW5nIGRvd24gdGhlIEZTTQotICoKLSAqIENhbmNlbCBhbnkgdGltZW91dCBydW5uaW5nLCBub3RpZnkgdXBwZXIgbGF5ZXJzIHdlJ3JlIGRvbmUsIGFuZAotICogc2VuZCBhIHRlcm1pbmF0ZS1yZXF1ZXN0IG1lc3NhZ2UgYXMgY29uZmlndXJlZC4KLSAqLwotc3RhdGljIHZvaWQKLXRlcm1pbmF0ZV9sYXllcihmLCBuZXh0c3RhdGUpCi0gICAgZnNtICpmOwotICAgIGludCBuZXh0c3RhdGU7Ci17Ci0gICAgaWYoIGYtPnN0YXRlICE9IE9QRU5FRCApCi0JVU5USU1FT1VUKGZzbV90aW1lb3V0LCBmKTsJLyogQ2FuY2VsIHRpbWVvdXQgKi8KLSAgICBlbHNlIGlmKCBmLT5jYWxsYmFja3MtPmRvd24gKQotCSgqZi0+Y2FsbGJhY2tzLT5kb3duKShmKTsJLyogSW5mb3JtIHVwcGVyIGxheWVycyB3ZSdyZSBkb3duICovCi0KLSAgICAvKiBJbml0IHJlc3RhcnQgY291bnRlciBhbmQgc2VuZCBUZXJtaW5hdGUtUmVxdWVzdCAqLwotICAgIGYtPnJldHJhbnNtaXRzID0gZi0+bWF4dGVybXRyYW5zbWl0czsKLSAgICBmc21fc2RhdGEoZiwgVEVSTVJFUSwgZi0+cmVxaWQgPSArK2YtPmlkLAotCSAgICAgICh1X2NoYXIgKikgZi0+dGVybV9yZWFzb24sIGYtPnRlcm1fcmVhc29uX2xlbik7Ci0KLSAgICBpZiAoZi0+cmV0cmFuc21pdHMgPT0gMCkgewotCS8qCi0JICogVXNlciBhc2tlZCBmb3Igbm8gdGVybWluYXRlIHJlcXVlc3RzIGF0IGFsbDsganVzdCBjbG9zZSBpdC4KLQkgKiBXZSd2ZSBhbHJlYWR5IGZpcmVkIG9mZiBvbmUgVGVybWluYXRlLVJlcXVlc3QganVzdCB0byBiZSBuaWNlCi0JICogdG8gdGhlIHBlZXIsIGJ1dCB3ZSdyZSBub3QgZ29pbmcgdG8gd2FpdCBmb3IgYSByZXBseS4KLQkgKi8KLQlmLT5zdGF0ZSA9IG5leHRzdGF0ZSA9PSBDTE9TSU5HID8gQ0xPU0VEIDogU1RPUFBFRDsKLQlpZiggZi0+Y2FsbGJhY2tzLT5maW5pc2hlZCApCi0JICAgICgqZi0+Y2FsbGJhY2tzLT5maW5pc2hlZCkoZik7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIFRJTUVPVVQoZnNtX3RpbWVvdXQsIGYsIGYtPnRpbWVvdXR0aW1lKTsKLSAgICAtLWYtPnJldHJhbnNtaXRzOwotCi0gICAgZi0+c3RhdGUgPSBuZXh0c3RhdGU7Ci19Ci0KLS8qCi0gKiBmc21fY2xvc2UgLSBTdGFydCBjbG9zaW5nIGNvbm5lY3Rpb24uCi0gKgotICogQ2FuY2VsIHRpbWVvdXRzIGFuZCBlaXRoZXIgaW5pdGlhdGUgY2xvc2Ugb3IgcG9zc2libHkgZ28gZGlyZWN0bHkgdG8KLSAqIHRoZSBDTE9TRUQgc3RhdGUuCi0gKi8KLXZvaWQKLWZzbV9jbG9zZShmLCByZWFzb24pCi0gICAgZnNtICpmOwotICAgIGNoYXIgKnJlYXNvbjsKLXsKLSAgICBmLT50ZXJtX3JlYXNvbiA9IHJlYXNvbjsKLSAgICBmLT50ZXJtX3JlYXNvbl9sZW4gPSAocmVhc29uID09IE5VTEw/IDA6IHN0cmxlbihyZWFzb24pKTsKLSAgICBzd2l0Y2goIGYtPnN0YXRlICl7Ci0gICAgY2FzZSBTVEFSVElORzoKLQlmLT5zdGF0ZSA9IElOSVRJQUw7Ci0JYnJlYWs7Ci0gICAgY2FzZSBTVE9QUEVEOgotCWYtPnN0YXRlID0gQ0xPU0VEOwotCWJyZWFrOwotICAgIGNhc2UgU1RPUFBJTkc6Ci0JZi0+c3RhdGUgPSBDTE9TSU5HOwotCWJyZWFrOwotCi0gICAgY2FzZSBSRVFTRU5UOgotICAgIGNhc2UgQUNLUkNWRDoKLSAgICBjYXNlIEFDS1NFTlQ6Ci0gICAgY2FzZSBPUEVORUQ6Ci0JdGVybWluYXRlX2xheWVyKGYsIENMT1NJTkcpOwotCWJyZWFrOwotICAgIH0KLX0KLQotCi0vKgotICogZnNtX3RpbWVvdXQgLSBUaW1lb3V0IGV4cGlyZWQuCi0gKi8KLXN0YXRpYyB2b2lkCi1mc21fdGltZW91dChhcmcpCi0gICAgdm9pZCAqYXJnOwotewotICAgIGZzbSAqZiA9IChmc20gKikgYXJnOwotCi0gICAgc3dpdGNoIChmLT5zdGF0ZSkgewotICAgIGNhc2UgQ0xPU0lORzoKLSAgICBjYXNlIFNUT1BQSU5HOgotCWlmKCBmLT5yZXRyYW5zbWl0cyA8PSAwICl7Ci0JICAgIC8qCi0JICAgICAqIFdlJ3ZlIHdhaXRlZCBmb3IgYW4gYWNrIGxvbmcgZW5vdWdoLiAgUGVlciBwcm9iYWJseSBoZWFyZCB1cy4KLQkgICAgICovCi0JICAgIGYtPnN0YXRlID0gKGYtPnN0YXRlID09IENMT1NJTkcpPyBDTE9TRUQ6IFNUT1BQRUQ7Ci0JICAgIGlmKCBmLT5jYWxsYmFja3MtPmZpbmlzaGVkICkKLQkJKCpmLT5jYWxsYmFja3MtPmZpbmlzaGVkKShmKTsKLQl9IGVsc2UgewotCSAgICAvKiBTZW5kIFRlcm1pbmF0ZS1SZXF1ZXN0ICovCi0JICAgIGZzbV9zZGF0YShmLCBURVJNUkVRLCBmLT5yZXFpZCA9ICsrZi0+aWQsCi0JCSAgICAgICh1X2NoYXIgKikgZi0+dGVybV9yZWFzb24sIGYtPnRlcm1fcmVhc29uX2xlbik7Ci0JICAgIFRJTUVPVVQoZnNtX3RpbWVvdXQsIGYsIGYtPnRpbWVvdXR0aW1lKTsKLQkgICAgLS1mLT5yZXRyYW5zbWl0czsKLQl9Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIFJFUVNFTlQ6Ci0gICAgY2FzZSBBQ0tSQ1ZEOgotICAgIGNhc2UgQUNLU0VOVDoKLQlpZiAoZi0+cmV0cmFuc21pdHMgPD0gMCkgewotCSAgICB3YXJuKCIlczogdGltZW91dCBzZW5kaW5nIENvbmZpZy1SZXF1ZXN0c1xuIiwgUFJPVE9fTkFNRShmKSk7Ci0JICAgIGYtPnN0YXRlID0gU1RPUFBFRDsKLQkgICAgaWYoIChmLT5mbGFncyAmIE9QVF9QQVNTSVZFKSA9PSAwICYmIGYtPmNhbGxiYWNrcy0+ZmluaXNoZWQgKQotCQkoKmYtPmNhbGxiYWNrcy0+ZmluaXNoZWQpKGYpOwotCi0JfSBlbHNlIHsKLQkgICAgLyogUmV0cmFuc21pdCB0aGUgY29uZmlndXJlLXJlcXVlc3QgKi8KLQkgICAgaWYgKGYtPmNhbGxiYWNrcy0+cmV0cmFuc21pdCkKLQkJKCpmLT5jYWxsYmFja3MtPnJldHJhbnNtaXQpKGYpOwotCSAgICBmc21fc2NvbmZyZXEoZiwgMSk7CQkvKiBSZS1zZW5kIENvbmZpZ3VyZS1SZXF1ZXN0ICovCi0JICAgIGlmKCBmLT5zdGF0ZSA9PSBBQ0tSQ1ZEICkKLQkJZi0+c3RhdGUgPSBSRVFTRU5UOwotCX0KLQlicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0JRlNNREVCVUcoKCIlczogVGltZW91dCBldmVudCBpbiBzdGF0ZSAlZCEiLCBQUk9UT19OQU1FKGYpLCBmLT5zdGF0ZSkpOwotICAgIH0KLX0KLQotCi0vKgotICogZnNtX2lucHV0IC0gSW5wdXQgcGFja2V0LgotICovCi12b2lkCi1mc21faW5wdXQoZiwgaW5wYWNrZXQsIGwpCi0gICAgZnNtICpmOwotICAgIHVfY2hhciAqaW5wYWNrZXQ7Ci0gICAgaW50IGw7Ci17Ci0gICAgdV9jaGFyICppbnA7Ci0gICAgdV9jaGFyIGNvZGUsIGlkOwotICAgIGludCBsZW47Ci0KLSAgICAvKgotICAgICAqIFBhcnNlIGhlYWRlciAoY29kZSwgaWQgYW5kIGxlbmd0aCkuCi0gICAgICogSWYgcGFja2V0IHRvbyBzaG9ydCwgZHJvcCBpdC4KLSAgICAgKi8KLSAgICBpbnAgPSBpbnBhY2tldDsKLSAgICBpZiAobCA8IEhFQURFUkxFTikgewotCUZTTURFQlVHKCgiZnNtX2lucHV0KCV4KTogUmN2ZCBzaG9ydCBoZWFkZXIuIiwgZi0+cHJvdG9jb2wpKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIEdFVENIQVIoY29kZSwgaW5wKTsKLSAgICBHRVRDSEFSKGlkLCBpbnApOwotICAgIEdFVFNIT1JUKGxlbiwgaW5wKTsKLSAgICBpZiAobGVuIDwgSEVBREVSTEVOKSB7Ci0JRlNNREVCVUcoKCJmc21faW5wdXQoJXgpOiBSY3ZkIGlsbGVnYWwgbGVuZ3RoLiIsIGYtPnByb3RvY29sKSk7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBpZiAobGVuID4gbCkgewotCUZTTURFQlVHKCgiZnNtX2lucHV0KCV4KTogUmN2ZCBzaG9ydCBwYWNrZXQuIiwgZi0+cHJvdG9jb2wpKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIGxlbiAtPSBIRUFERVJMRU47CQkvKiBzdWJ0cmFjdCBoZWFkZXIgbGVuZ3RoICovCi0KLSAgICBpZiggZi0+c3RhdGUgPT0gSU5JVElBTCB8fCBmLT5zdGF0ZSA9PSBTVEFSVElORyApewotCUZTTURFQlVHKCgiZnNtX2lucHV0KCV4KTogUmN2ZCBwYWNrZXQgaW4gc3RhdGUgJWQuIiwKLQkJICBmLT5wcm90b2NvbCwgZi0+c3RhdGUpKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBBY3Rpb24gZGVwZW5kcyBvbiBjb2RlLgotICAgICAqLwotICAgIHN3aXRjaCAoY29kZSkgewotICAgIGNhc2UgQ09ORlJFUToKLQlmc21fcmNvbmZyZXEoZiwgaWQsIGlucCwgbGVuKTsKLQlicmVhazsKLSAgICAKLSAgICBjYXNlIENPTkZBQ0s6Ci0JZnNtX3Jjb25mYWNrKGYsIGlkLCBpbnAsIGxlbik7Ci0JYnJlYWs7Ci0gICAgCi0gICAgY2FzZSBDT05GTkFLOgotICAgIGNhc2UgQ09ORlJFSjoKLQlmc21fcmNvbmZuYWtyZWooZiwgY29kZSwgaWQsIGlucCwgbGVuKTsKLQlicmVhazsKLSAgICAKLSAgICBjYXNlIFRFUk1SRVE6Ci0JZnNtX3J0ZXJtcmVxKGYsIGlkLCBpbnAsIGxlbik7Ci0JYnJlYWs7Ci0gICAgCi0gICAgY2FzZSBURVJNQUNLOgotCWZzbV9ydGVybWFjayhmKTsKLQlicmVhazsKLSAgICAKLSAgICBjYXNlIENPREVSRUo6Ci0JZnNtX3Jjb2RlcmVqKGYsIGlucCwgbGVuKTsKLQlicmVhazsKLSAgICAKLSAgICBkZWZhdWx0OgotCWlmKCAhZi0+Y2FsbGJhY2tzLT5leHRjb2RlCi0JICAgfHwgISgqZi0+Y2FsbGJhY2tzLT5leHRjb2RlKShmLCBjb2RlLCBpZCwgaW5wLCBsZW4pICkKLQkgICAgZnNtX3NkYXRhKGYsIENPREVSRUosICsrZi0+aWQsIGlucGFja2V0LCBsZW4gKyBIRUFERVJMRU4pOwotCWJyZWFrOwotICAgIH0KLX0KLQotCi0vKgotICogZnNtX3Jjb25mcmVxIC0gUmVjZWl2ZSBDb25maWd1cmUtUmVxdWVzdC4KLSAqLwotc3RhdGljIHZvaWQKLWZzbV9yY29uZnJlcShmLCBpZCwgaW5wLCBsZW4pCi0gICAgZnNtICpmOwotICAgIHVfY2hhciBpZDsKLSAgICB1X2NoYXIgKmlucDsKLSAgICBpbnQgbGVuOwotewotICAgIGludCBjb2RlLCByZWplY3RfaWZfZGlzYWdyZWU7Ci0KLSAgICBzd2l0Y2goIGYtPnN0YXRlICl7Ci0gICAgY2FzZSBDTE9TRUQ6Ci0JLyogR28gYXdheSwgd2UncmUgY2xvc2VkICovCi0JZnNtX3NkYXRhKGYsIFRFUk1BQ0ssIGlkLCBOVUxMLCAwKTsKLQlyZXR1cm47Ci0gICAgY2FzZSBDTE9TSU5HOgotICAgIGNhc2UgU1RPUFBJTkc6Ci0JcmV0dXJuOwotCi0gICAgY2FzZSBPUEVORUQ6Ci0JLyogR28gZG93biBhbmQgcmVzdGFydCBuZWdvdGlhdGlvbiAqLwotCWlmKCBmLT5jYWxsYmFja3MtPmRvd24gKQotCSAgICAoKmYtPmNhbGxiYWNrcy0+ZG93bikoZik7CS8qIEluZm9ybSB1cHBlciBsYXllcnMgKi8KLQlmc21fc2NvbmZyZXEoZiwgMCk7CQkvKiBTZW5kIGluaXRpYWwgQ29uZmlndXJlLVJlcXVlc3QgKi8KLQlmLT5zdGF0ZSA9IFJFUVNFTlQ7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIFNUT1BQRUQ6Ci0JLyogTmVnb3RpYXRpb24gc3RhcnRlZCBieSBvdXIgcGVlciAqLwotCWZzbV9zY29uZnJlcShmLCAwKTsJCS8qIFNlbmQgaW5pdGlhbCBDb25maWd1cmUtUmVxdWVzdCAqLwotCWYtPnN0YXRlID0gUkVRU0VOVDsKLQlicmVhazsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFBhc3MgdGhlIHJlcXVlc3RlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKLSAgICAgKiB0byBwcm90b2NvbC1zcGVjaWZpYyBjb2RlIGZvciBjaGVja2luZy4KLSAgICAgKi8KLSAgICBpZiAoZi0+Y2FsbGJhY2tzLT5yZXFjaSl7CQkvKiBDaGVjayBDSSAqLwotCXJlamVjdF9pZl9kaXNhZ3JlZSA9IChmLT5uYWtsb29wcyA+PSBmLT5tYXhuYWtsb29wcyk7Ci0JY29kZSA9ICgqZi0+Y2FsbGJhY2tzLT5yZXFjaSkoZiwgaW5wLCAmbGVuLCByZWplY3RfaWZfZGlzYWdyZWUpOwotICAgIH0gZWxzZSBpZiAobGVuKQotCWNvZGUgPSBDT05GUkVKOwkJCS8qIFJlamVjdCBhbGwgQ0kgKi8KLSAgICBlbHNlCi0JY29kZSA9IENPTkZBQ0s7Ci0KLSAgICAvKiBzZW5kIHRoZSBBY2ssIE5hayBvciBSZWogdG8gdGhlIHBlZXIgKi8KLSAgICBmc21fc2RhdGEoZiwgY29kZSwgaWQsIGlucCwgbGVuKTsKLQotICAgIGlmIChjb2RlID09IENPTkZBQ0spIHsKLQlpZiAoZi0+c3RhdGUgPT0gQUNLUkNWRCkgewotCSAgICBVTlRJTUVPVVQoZnNtX3RpbWVvdXQsIGYpOwkvKiBDYW5jZWwgdGltZW91dCAqLwotCSAgICBmLT5zdGF0ZSA9IE9QRU5FRDsKLQkgICAgaWYgKGYtPmNhbGxiYWNrcy0+dXApCi0JCSgqZi0+Y2FsbGJhY2tzLT51cCkoZik7CS8qIEluZm9ybSB1cHBlciBsYXllcnMgKi8KLQl9IGVsc2UKLQkgICAgZi0+c3RhdGUgPSBBQ0tTRU5UOwotCWYtPm5ha2xvb3BzID0gMDsKLQotICAgIH0gZWxzZSB7Ci0JLyogd2Ugc2VudCBDT05GQUNLIG9yIENPTkZSRUogKi8KLQlpZiAoZi0+c3RhdGUgIT0gQUNLUkNWRCkKLQkgICAgZi0+c3RhdGUgPSBSRVFTRU5UOwotCWlmKCBjb2RlID09IENPTkZOQUsgKQotCSAgICArK2YtPm5ha2xvb3BzOwotICAgIH0KLX0KLQotCi0vKgotICogZnNtX3Jjb25mYWNrIC0gUmVjZWl2ZSBDb25maWd1cmUtQWNrLgotICovCi1zdGF0aWMgdm9pZAotZnNtX3Jjb25mYWNrKGYsIGlkLCBpbnAsIGxlbikKLSAgICBmc20gKmY7Ci0gICAgaW50IGlkOwotICAgIHVfY2hhciAqaW5wOwotICAgIGludCBsZW47Ci17Ci0gICAgaWYgKGlkICE9IGYtPnJlcWlkIHx8IGYtPnNlZW5fYWNrKQkJLyogRXhwZWN0ZWQgaWQ/ICovCi0JcmV0dXJuOwkJCQkJLyogTm9wZSwgdG9zcy4uLiAqLwotICAgIGlmKCAhKGYtPmNhbGxiYWNrcy0+YWNrY2k/ICgqZi0+Y2FsbGJhY2tzLT5hY2tjaSkoZiwgaW5wLCBsZW4pOgotCSAgKGxlbiA9PSAwKSkgKXsKLQkvKiBBY2sgaXMgYmFkIC0gaWdub3JlIGl0ICovCi0JZXJyb3IoIlJlY2VpdmVkIGJhZCBjb25maWd1cmUtYWNrOiAlUCIsIGlucCwgbGVuKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIGYtPnNlZW5fYWNrID0gMTsKLSAgICBmLT5ybmFrbG9vcHMgPSAwOwotCi0gICAgc3dpdGNoIChmLT5zdGF0ZSkgewotICAgIGNhc2UgQ0xPU0VEOgotICAgIGNhc2UgU1RPUFBFRDoKLQlmc21fc2RhdGEoZiwgVEVSTUFDSywgaWQsIE5VTEwsIDApOwotCWJyZWFrOwotCi0gICAgY2FzZSBSRVFTRU5UOgotCWYtPnN0YXRlID0gQUNLUkNWRDsKLQlmLT5yZXRyYW5zbWl0cyA9IGYtPm1heGNvbmZyZXF0cmFuc21pdHM7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIEFDS1JDVkQ6Ci0JLyogSHVoPyBhbiBleHRyYSB2YWxpZCBBY2s/IG9oIHdlbGwuLi4gKi8KLQlVTlRJTUVPVVQoZnNtX3RpbWVvdXQsIGYpOwkvKiBDYW5jZWwgdGltZW91dCAqLwotCWZzbV9zY29uZnJlcShmLCAwKTsKLQlmLT5zdGF0ZSA9IFJFUVNFTlQ7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIEFDS1NFTlQ6Ci0JVU5USU1FT1VUKGZzbV90aW1lb3V0LCBmKTsJLyogQ2FuY2VsIHRpbWVvdXQgKi8KLQlmLT5zdGF0ZSA9IE9QRU5FRDsKLQlmLT5yZXRyYW5zbWl0cyA9IGYtPm1heGNvbmZyZXF0cmFuc21pdHM7Ci0JaWYgKGYtPmNhbGxiYWNrcy0+dXApCi0JICAgICgqZi0+Y2FsbGJhY2tzLT51cCkoZik7CS8qIEluZm9ybSB1cHBlciBsYXllcnMgKi8KLQlicmVhazsKLQotICAgIGNhc2UgT1BFTkVEOgotCS8qIEdvIGRvd24gYW5kIHJlc3RhcnQgbmVnb3RpYXRpb24gKi8KLQlpZiAoZi0+Y2FsbGJhY2tzLT5kb3duKQotCSAgICAoKmYtPmNhbGxiYWNrcy0+ZG93bikoZik7CS8qIEluZm9ybSB1cHBlciBsYXllcnMgKi8KLQlmc21fc2NvbmZyZXEoZiwgMCk7CQkvKiBTZW5kIGluaXRpYWwgQ29uZmlndXJlLVJlcXVlc3QgKi8KLQlmLT5zdGF0ZSA9IFJFUVNFTlQ7Ci0JYnJlYWs7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBmc21fcmNvbmZuYWtyZWogLSBSZWNlaXZlIENvbmZpZ3VyZS1OYWsgb3IgQ29uZmlndXJlLVJlamVjdC4KLSAqLwotc3RhdGljIHZvaWQKLWZzbV9yY29uZm5ha3JlaihmLCBjb2RlLCBpZCwgaW5wLCBsZW4pCi0gICAgZnNtICpmOwotICAgIGludCBjb2RlLCBpZDsKLSAgICB1X2NoYXIgKmlucDsKLSAgICBpbnQgbGVuOwotewotICAgIGludCByZXQ7Ci0gICAgaW50IHRyZWF0X2FzX3JlamVjdDsKLQotICAgIGlmIChpZCAhPSBmLT5yZXFpZCB8fCBmLT5zZWVuX2FjaykJLyogRXhwZWN0ZWQgaWQ/ICovCi0JcmV0dXJuOwkJCQkvKiBOb3BlLCB0b3NzLi4uICovCi0KLSAgICBpZiAoY29kZSA9PSBDT05GTkFLKSB7Ci0JKytmLT5ybmFrbG9vcHM7Ci0JdHJlYXRfYXNfcmVqZWN0ID0gKGYtPnJuYWtsb29wcyA+PSBmLT5tYXhuYWtsb29wcyk7Ci0JaWYgKGYtPmNhbGxiYWNrcy0+bmFrY2kgPT0gTlVMTAotCSAgICB8fCAhKHJldCA9IGYtPmNhbGxiYWNrcy0+bmFrY2koZiwgaW5wLCBsZW4sIHRyZWF0X2FzX3JlamVjdCkpKSB7Ci0JICAgIGVycm9yKCJSZWNlaXZlZCBiYWQgY29uZmlndXJlLW5hazogJVAiLCBpbnAsIGxlbik7Ci0JICAgIHJldHVybjsKLQl9Ci0gICAgfSBlbHNlIHsKLQlmLT5ybmFrbG9vcHMgPSAwOwotCWlmIChmLT5jYWxsYmFja3MtPnJlamNpID09IE5VTEwKLQkgICAgfHwgIShyZXQgPSBmLT5jYWxsYmFja3MtPnJlamNpKGYsIGlucCwgbGVuKSkpIHsKLQkgICAgZXJyb3IoIlJlY2VpdmVkIGJhZCBjb25maWd1cmUtcmVqOiAlUCIsIGlucCwgbGVuKTsKLQkgICAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgICBmLT5zZWVuX2FjayA9IDE7Ci0KLSAgICBzd2l0Y2ggKGYtPnN0YXRlKSB7Ci0gICAgY2FzZSBDTE9TRUQ6Ci0gICAgY2FzZSBTVE9QUEVEOgotCWZzbV9zZGF0YShmLCBURVJNQUNLLCBpZCwgTlVMTCwgMCk7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIFJFUVNFTlQ6Ci0gICAgY2FzZSBBQ0tTRU5UOgotCS8qIFRoZXkgZGlkbid0IGFncmVlIHRvIHdoYXQgd2Ugd2FudGVkIC0gdHJ5IGFub3RoZXIgcmVxdWVzdCAqLwotCVVOVElNRU9VVChmc21fdGltZW91dCwgZik7CS8qIENhbmNlbCB0aW1lb3V0ICovCi0JaWYgKHJldCA8IDApCi0JICAgIGYtPnN0YXRlID0gU1RPUFBFRDsJCS8qIGtsdWRnZSBmb3Igc3RvcHBpbmcgQ0NQICovCi0JZWxzZQotCSAgICBmc21fc2NvbmZyZXEoZiwgMCk7CQkvKiBTZW5kIENvbmZpZ3VyZS1SZXF1ZXN0ICovCi0JYnJlYWs7Ci0KLSAgICBjYXNlIEFDS1JDVkQ6Ci0JLyogR290IGEgTmFrL3JlamVjdCB3aGVuIHdlIGhhZCBhbHJlYWR5IGhhZCBhbiBBY2s/PyBvaCB3ZWxsLi4uICovCi0JVU5USU1FT1VUKGZzbV90aW1lb3V0LCBmKTsJLyogQ2FuY2VsIHRpbWVvdXQgKi8KLQlmc21fc2NvbmZyZXEoZiwgMCk7Ci0JZi0+c3RhdGUgPSBSRVFTRU5UOwotCWJyZWFrOwotCi0gICAgY2FzZSBPUEVORUQ6Ci0JLyogR28gZG93biBhbmQgcmVzdGFydCBuZWdvdGlhdGlvbiAqLwotCWlmIChmLT5jYWxsYmFja3MtPmRvd24pCi0JICAgICgqZi0+Y2FsbGJhY2tzLT5kb3duKShmKTsJLyogSW5mb3JtIHVwcGVyIGxheWVycyAqLwotCWZzbV9zY29uZnJlcShmLCAwKTsJCS8qIFNlbmQgaW5pdGlhbCBDb25maWd1cmUtUmVxdWVzdCAqLwotCWYtPnN0YXRlID0gUkVRU0VOVDsKLQlicmVhazsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIGZzbV9ydGVybXJlcSAtIFJlY2VpdmUgVGVybWluYXRlLVJlcS4KLSAqLwotc3RhdGljIHZvaWQKLWZzbV9ydGVybXJlcShmLCBpZCwgcCwgbGVuKQotICAgIGZzbSAqZjsKLSAgICBpbnQgaWQ7Ci0gICAgdV9jaGFyICpwOwotICAgIGludCBsZW47Ci17Ci0gICAgc3dpdGNoIChmLT5zdGF0ZSkgewotICAgIGNhc2UgQUNLUkNWRDoKLSAgICBjYXNlIEFDS1NFTlQ6Ci0JZi0+c3RhdGUgPSBSRVFTRU5UOwkJLyogU3RhcnQgb3ZlciBidXQga2VlcCB0cnlpbmcgKi8KLQlicmVhazsKLQotICAgIGNhc2UgT1BFTkVEOgotCWlmIChsZW4gPiAwKSB7Ci0JICAgIGluZm8oIiVzIHRlcm1pbmF0ZWQgYnkgcGVlciAoJTAuKnYpIiwgUFJPVE9fTkFNRShmKSwgbGVuLCBwKTsKLQl9IGVsc2UKLQkgICAgaW5mbygiJXMgdGVybWluYXRlZCBieSBwZWVyIiwgUFJPVE9fTkFNRShmKSk7Ci0JZi0+cmV0cmFuc21pdHMgPSAwOwotCWYtPnN0YXRlID0gU1RPUFBJTkc7Ci0JaWYgKGYtPmNhbGxiYWNrcy0+ZG93bikKLQkgICAgKCpmLT5jYWxsYmFja3MtPmRvd24pKGYpOwkvKiBJbmZvcm0gdXBwZXIgbGF5ZXJzICovCi0JVElNRU9VVChmc21fdGltZW91dCwgZiwgZi0+dGltZW91dHRpbWUpOwotCWJyZWFrOwotICAgIH0KLQotICAgIGZzbV9zZGF0YShmLCBURVJNQUNLLCBpZCwgTlVMTCwgMCk7Ci19Ci0KLQotLyoKLSAqIGZzbV9ydGVybWFjayAtIFJlY2VpdmUgVGVybWluYXRlLUFjay4KLSAqLwotc3RhdGljIHZvaWQKLWZzbV9ydGVybWFjayhmKQotICAgIGZzbSAqZjsKLXsKLSAgICBzd2l0Y2ggKGYtPnN0YXRlKSB7Ci0gICAgY2FzZSBDTE9TSU5HOgotCVVOVElNRU9VVChmc21fdGltZW91dCwgZik7Ci0JZi0+c3RhdGUgPSBDTE9TRUQ7Ci0JaWYoIGYtPmNhbGxiYWNrcy0+ZmluaXNoZWQgKQotCSAgICAoKmYtPmNhbGxiYWNrcy0+ZmluaXNoZWQpKGYpOwotCWJyZWFrOwotICAgIGNhc2UgU1RPUFBJTkc6Ci0JVU5USU1FT1VUKGZzbV90aW1lb3V0LCBmKTsKLQlmLT5zdGF0ZSA9IFNUT1BQRUQ7Ci0JaWYoIGYtPmNhbGxiYWNrcy0+ZmluaXNoZWQgKQotCSAgICAoKmYtPmNhbGxiYWNrcy0+ZmluaXNoZWQpKGYpOwotCWJyZWFrOwotCi0gICAgY2FzZSBBQ0tSQ1ZEOgotCWYtPnN0YXRlID0gUkVRU0VOVDsKLQlicmVhazsKLQotICAgIGNhc2UgT1BFTkVEOgotCWlmIChmLT5jYWxsYmFja3MtPmRvd24pCi0JICAgICgqZi0+Y2FsbGJhY2tzLT5kb3duKShmKTsJLyogSW5mb3JtIHVwcGVyIGxheWVycyAqLwotCWZzbV9zY29uZnJlcShmLCAwKTsKLQlmLT5zdGF0ZSA9IFJFUVNFTlQ7Ci0JYnJlYWs7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBmc21fcmNvZGVyZWogLSBSZWNlaXZlIGFuIENvZGUtUmVqZWN0LgotICovCi1zdGF0aWMgdm9pZAotZnNtX3Jjb2RlcmVqKGYsIGlucCwgbGVuKQotICAgIGZzbSAqZjsKLSAgICB1X2NoYXIgKmlucDsKLSAgICBpbnQgbGVuOwotewotICAgIHVfY2hhciBjb2RlLCBpZDsKLQotICAgIGlmIChsZW4gPCBIRUFERVJMRU4pIHsKLQlGU01ERUJVRygoImZzbV9yY29kZXJlajogUmN2ZCBzaG9ydCBDb2RlLVJlamVjdCBwYWNrZXQhIikpOwotCXJldHVybjsKLSAgICB9Ci0gICAgR0VUQ0hBUihjb2RlLCBpbnApOwotICAgIEdFVENIQVIoaWQsIGlucCk7Ci0gICAgd2FybigiJXM6IFJjdmQgQ29kZS1SZWplY3QgZm9yIGNvZGUgJWQsIGlkICVkIiwgUFJPVE9fTkFNRShmKSwgY29kZSwgaWQpOwotCi0gICAgaWYoIGYtPnN0YXRlID09IEFDS1JDVkQgKQotCWYtPnN0YXRlID0gUkVRU0VOVDsKLX0KLQotCi0vKgotICogZnNtX3Byb3RyZWplY3QgLSBQZWVyIGRvZXNuJ3Qgc3BlYWsgdGhpcyBwcm90b2NvbC4KLSAqCi0gKiBUcmVhdCB0aGlzIGFzIGEgY2F0YXN0cm9waGljIGVycm9yIChSWEotKS4KLSAqLwotdm9pZAotZnNtX3Byb3RyZWplY3QoZikKLSAgICBmc20gKmY7Ci17Ci0gICAgc3dpdGNoKCBmLT5zdGF0ZSApewotICAgIGNhc2UgQ0xPU0lORzoKLQlVTlRJTUVPVVQoZnNtX3RpbWVvdXQsIGYpOwkvKiBDYW5jZWwgdGltZW91dCAqLwotCS8qIGZhbGwgdGhyb3VnaCAqLwotICAgIGNhc2UgQ0xPU0VEOgotCWYtPnN0YXRlID0gQ0xPU0VEOwotCWlmKCBmLT5jYWxsYmFja3MtPmZpbmlzaGVkICkKLQkgICAgKCpmLT5jYWxsYmFja3MtPmZpbmlzaGVkKShmKTsKLQlicmVhazsKLQotICAgIGNhc2UgU1RPUFBJTkc6Ci0gICAgY2FzZSBSRVFTRU5UOgotICAgIGNhc2UgQUNLUkNWRDoKLSAgICBjYXNlIEFDS1NFTlQ6Ci0JVU5USU1FT1VUKGZzbV90aW1lb3V0LCBmKTsJLyogQ2FuY2VsIHRpbWVvdXQgKi8KLQkvKiBmYWxsIHRocm91Z2ggKi8KLSAgICBjYXNlIFNUT1BQRUQ6Ci0JZi0+c3RhdGUgPSBTVE9QUEVEOwotCWlmKCBmLT5jYWxsYmFja3MtPmZpbmlzaGVkICkKLQkgICAgKCpmLT5jYWxsYmFja3MtPmZpbmlzaGVkKShmKTsKLQlicmVhazsKLQotICAgIGNhc2UgT1BFTkVEOgotCXRlcm1pbmF0ZV9sYXllcihmLCBTVE9QUElORyk7Ci0JYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotCUZTTURFQlVHKCgiJXM6IFByb3RvY29sLXJlamVjdCBldmVudCBpbiBzdGF0ZSAlZCEiLAotCQkgIFBST1RPX05BTUUoZiksIGYtPnN0YXRlKSk7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBmc21fc2NvbmZyZXEgLSBTZW5kIGEgQ29uZmlndXJlLVJlcXVlc3QuCi0gKi8KLXN0YXRpYyB2b2lkCi1mc21fc2NvbmZyZXEoZiwgcmV0cmFuc21pdCkKLSAgICBmc20gKmY7Ci0gICAgaW50IHJldHJhbnNtaXQ7Ci17Ci0gICAgdV9jaGFyICpvdXRwOwotICAgIGludCBjaWxlbjsKLQotICAgIGlmKCBmLT5zdGF0ZSAhPSBSRVFTRU5UICYmIGYtPnN0YXRlICE9IEFDS1JDVkQgJiYgZi0+c3RhdGUgIT0gQUNLU0VOVCApewotCS8qIE5vdCBjdXJyZW50bHkgbmVnb3RpYXRpbmcgLSByZXNldCBvcHRpb25zICovCi0JaWYoIGYtPmNhbGxiYWNrcy0+cmVzZXRjaSApCi0JICAgICgqZi0+Y2FsbGJhY2tzLT5yZXNldGNpKShmKTsKLQlmLT5uYWtsb29wcyA9IDA7Ci0JZi0+cm5ha2xvb3BzID0gMDsKLSAgICB9Ci0KLSAgICBpZiggIXJldHJhbnNtaXQgKXsKLQkvKiBOZXcgcmVxdWVzdCAtIHJlc2V0IHJldHJhbnNtaXNzaW9uIGNvdW50ZXIsIHVzZSBuZXcgSUQgKi8KLQlmLT5yZXRyYW5zbWl0cyA9IGYtPm1heGNvbmZyZXF0cmFuc21pdHM7Ci0JZi0+cmVxaWQgPSArK2YtPmlkOwotICAgIH0KLQotICAgIGYtPnNlZW5fYWNrID0gMDsKLQotICAgIC8qCi0gICAgICogTWFrZSB1cCB0aGUgcmVxdWVzdCBwYWNrZXQKLSAgICAgKi8KLSAgICBvdXRwID0gb3V0cGFja2V0X2J1ZiArIFBQUF9IRFJMRU4gKyBIRUFERVJMRU47Ci0gICAgaWYoIGYtPmNhbGxiYWNrcy0+Y2lsZW4gJiYgZi0+Y2FsbGJhY2tzLT5hZGRjaSApewotCWNpbGVuID0gKCpmLT5jYWxsYmFja3MtPmNpbGVuKShmKTsKLQlpZiggY2lsZW4gPiBwZWVyX21ydVtmLT51bml0XSAtIEhFQURFUkxFTiApCi0JICAgIGNpbGVuID0gcGVlcl9tcnVbZi0+dW5pdF0gLSBIRUFERVJMRU47Ci0JaWYgKGYtPmNhbGxiYWNrcy0+YWRkY2kpCi0JICAgICgqZi0+Y2FsbGJhY2tzLT5hZGRjaSkoZiwgb3V0cCwgJmNpbGVuKTsKLSAgICB9IGVsc2UKLQljaWxlbiA9IDA7Ci0KLSAgICAvKiBzZW5kIHRoZSByZXF1ZXN0IHRvIG91ciBwZWVyICovCi0gICAgZnNtX3NkYXRhKGYsIENPTkZSRVEsIGYtPnJlcWlkLCBvdXRwLCBjaWxlbik7Ci0KLSAgICAvKiBzdGFydCB0aGUgcmV0cmFuc21pdCB0aW1lciAqLwotICAgIC0tZi0+cmV0cmFuc21pdHM7Ci0gICAgVElNRU9VVChmc21fdGltZW91dCwgZiwgZi0+dGltZW91dHRpbWUpOwotfQotCi0KLS8qCi0gKiBmc21fc2RhdGEgLSBTZW5kIHNvbWUgZGF0YS4KLSAqCi0gKiBVc2VkIGZvciBhbGwgcGFja2V0cyBzZW50IHRvIG91ciBwZWVyIGJ5IHRoaXMgbW9kdWxlLgotICovCi12b2lkCi1mc21fc2RhdGEoZiwgY29kZSwgaWQsIGRhdGEsIGRhdGFsZW4pCi0gICAgZnNtICpmOwotICAgIHVfY2hhciBjb2RlLCBpZDsKLSAgICB1X2NoYXIgKmRhdGE7Ci0gICAgaW50IGRhdGFsZW47Ci17Ci0gICAgdV9jaGFyICpvdXRwOwotICAgIGludCBvdXRsZW47Ci0KLSAgICAvKiBBZGp1c3QgbGVuZ3RoIHRvIGJlIHNtYWxsZXIgdGhhbiBNVFUgKi8KLSAgICBvdXRwID0gb3V0cGFja2V0X2J1ZjsKLSAgICBpZiAoZGF0YWxlbiA+IHBlZXJfbXJ1W2YtPnVuaXRdIC0gSEVBREVSTEVOKQotCWRhdGFsZW4gPSBwZWVyX21ydVtmLT51bml0XSAtIEhFQURFUkxFTjsKLSAgICBpZiAoZGF0YWxlbiAmJiBkYXRhICE9IG91dHAgKyBQUFBfSERSTEVOICsgSEVBREVSTEVOKQotCUJDT1BZKGRhdGEsIG91dHAgKyBQUFBfSERSTEVOICsgSEVBREVSTEVOLCBkYXRhbGVuKTsKLSAgICBvdXRsZW4gPSBkYXRhbGVuICsgSEVBREVSTEVOOwotICAgIE1BS0VIRUFERVIob3V0cCwgZi0+cHJvdG9jb2wpOwotICAgIFBVVENIQVIoY29kZSwgb3V0cCk7Ci0gICAgUFVUQ0hBUihpZCwgb3V0cCk7Ci0gICAgUFVUU0hPUlQob3V0bGVuLCBvdXRwKTsKLSAgICBvdXRwdXQoZi0+dW5pdCwgb3V0cGFja2V0X2J1Ziwgb3V0bGVuICsgUFBQX0hEUkxFTik7Ci19CmRpZmYgLS1naXQgYS9wcHBkL2ZzbS5oIGIvcHBwZC9mc20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdhNzhkMy4uMDAwMDAwMAotLS0gYS9wcHBkL2ZzbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qCi0gKiBmc20uaCAtIHtMaW5rLCBJUH0gQ29udHJvbCBQcm90b2NvbCBGaW5pdGUgU3RhdGUgTWFjaGluZSBkZWZpbml0aW9ucy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODQtMjAwMCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgbmFtZSAiQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciBwZXJtaXNzaW9uIG9yIGFueSBsZWdhbAotICogICAgZGV0YWlscywgcGxlYXNlIGNvbnRhY3QKLSAqICAgICAgT2ZmaWNlIG9mIFRlY2hub2xvZ3kgVHJhbnNmZXIKLSAqICAgICAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAqICAgICAgNTAwMCBGb3JiZXMgQXZlbnVlCi0gKiAgICAgIFBpdHRzYnVyZ2gsIFBBICAxNTIxMy0zODkwCi0gKiAgICAgICg0MTIpIDI2OC00Mzg3LCBmYXg6ICg0MTIpIDI2OC03Mzk1Ci0gKiAgICAgIHRlY2gtdHJhbnNmZXJAYW5kcmV3LmNtdS5lZHUKLSAqCi0gKiA0LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IENvbXB1dGluZyBTZXJ2aWNlcwotICogICAgIGF0IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IChodHRwOi8vd3d3LmNtdS5lZHUvY29tcHV0aW5nLykuIgotICoKLSAqIENBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotICogVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi0gKiBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi0gKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi0gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqCi0gKiAkSWQ6IGZzbS5oLHYgMS4xMCAyMDA0LzExLzEzIDAyOjI4OjE1IHBhdWx1cyBFeHAgJAotICovCi0KLS8qCi0gKiBQYWNrZXQgaGVhZGVyID0gQ29kZSwgaWQsIGxlbmd0aC4KLSAqLwotI2RlZmluZSBIRUFERVJMRU4JNAotCi0KLS8qCi0gKiAgQ1AgKExDUCwgSVBDUCwgZXRjLikgY29kZXMuCi0gKi8KLSNkZWZpbmUgQ09ORlJFUQkJMQkvKiBDb25maWd1cmF0aW9uIFJlcXVlc3QgKi8KLSNkZWZpbmUgQ09ORkFDSwkJMgkvKiBDb25maWd1cmF0aW9uIEFjayAqLwotI2RlZmluZSBDT05GTkFLCQkzCS8qIENvbmZpZ3VyYXRpb24gTmFrICovCi0jZGVmaW5lIENPTkZSRUoJCTQJLyogQ29uZmlndXJhdGlvbiBSZWplY3QgKi8KLSNkZWZpbmUgVEVSTVJFUQkJNQkvKiBUZXJtaW5hdGlvbiBSZXF1ZXN0ICovCi0jZGVmaW5lIFRFUk1BQ0sJCTYJLyogVGVybWluYXRpb24gQWNrICovCi0jZGVmaW5lIENPREVSRUoJCTcJLyogQ29kZSBSZWplY3QgKi8KLQotCi0vKgotICogRWFjaCBGU00gaXMgZGVzY3JpYmVkIGJ5IGFuIGZzbSBzdHJ1Y3R1cmUgYW5kIGZzbSBjYWxsYmFja3MuCi0gKi8KLXR5cGVkZWYgc3RydWN0IGZzbSB7Ci0gICAgaW50IHVuaXQ7CQkJLyogSW50ZXJmYWNlIHVuaXQgbnVtYmVyICovCi0gICAgaW50IHByb3RvY29sOwkJLyogRGF0YSBMaW5rIExheWVyIFByb3RvY29sIGZpZWxkIHZhbHVlICovCi0gICAgaW50IHN0YXRlOwkJCS8qIFN0YXRlICovCi0gICAgaW50IGZsYWdzOwkJCS8qIENvbnRhaW5zIG9wdGlvbiBiaXRzICovCi0gICAgdV9jaGFyIGlkOwkJCS8qIEN1cnJlbnQgaWQgKi8KLSAgICB1X2NoYXIgcmVxaWQ7CQkvKiBDdXJyZW50IHJlcXVlc3QgaWQgKi8KLSAgICB1X2NoYXIgc2Vlbl9hY2s7CQkvKiBIYXZlIHJlY2VpdmVkIHZhbGlkIEFjay9OYWsvUmVqIHRvIFJlcSAqLwotICAgIGludCB0aW1lb3V0dGltZTsJCS8qIFRpbWVvdXQgdGltZSBpbiBtaWxsaXNlY29uZHMgKi8KLSAgICBpbnQgbWF4Y29uZnJlcXRyYW5zbWl0czsJLyogTWF4aW11bSBDb25maWd1cmUtUmVxdWVzdCB0cmFuc21pc3Npb25zICovCi0gICAgaW50IHJldHJhbnNtaXRzOwkJLyogTnVtYmVyIG9mIHJldHJhbnNtaXNzaW9ucyBsZWZ0ICovCi0gICAgaW50IG1heHRlcm10cmFuc21pdHM7CS8qIE1heGltdW0gVGVybWluYXRlLVJlcXVlc3QgdHJhbnNtaXNzaW9ucyAqLwotICAgIGludCBuYWtsb29wczsJCS8qIE51bWJlciBvZiBuYWsgbG9vcHMgc2luY2UgbGFzdCBhY2sgKi8KLSAgICBpbnQgcm5ha2xvb3BzOwkJLyogTnVtYmVyIG9mIG5ha3MgcmVjZWl2ZWQgKi8KLSAgICBpbnQgbWF4bmFrbG9vcHM7CQkvKiBNYXhpbXVtIG51bWJlciBvZiBuYWsgbG9vcHMgdG9sZXJhdGVkICovCi0gICAgc3RydWN0IGZzbV9jYWxsYmFja3MgKmNhbGxiYWNrczsJLyogQ2FsbGJhY2sgcm91dGluZXMgKi8KLSAgICBjaGFyICp0ZXJtX3JlYXNvbjsJCS8qIFJlYXNvbiBmb3IgY2xvc2luZyBwcm90b2NvbCAqLwotICAgIGludCB0ZXJtX3JlYXNvbl9sZW47CS8qIExlbmd0aCBvZiB0ZXJtX3JlYXNvbiAqLwotfSBmc207Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgZnNtX2NhbGxiYWNrcyB7Ci0gICAgdm9pZCAoKnJlc2V0Y2kpCQkvKiBSZXNldCBvdXIgQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbiAqLwotCQlfX1AoKGZzbSAqKSk7Ci0gICAgaW50ICAoKmNpbGVuKQkJLyogTGVuZ3RoIG9mIG91ciBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uICovCi0JCV9fUCgoZnNtICopKTsKLSAgICB2b2lkICgqYWRkY2kpIAkJLyogQWRkIG91ciBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uICovCi0JCV9fUCgoZnNtICosIHVfY2hhciAqLCBpbnQgKikpOwotICAgIGludCAgKCphY2tjaSkJCS8qIEFDSyBvdXIgQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbiAqLwotCQlfX1AoKGZzbSAqLCB1X2NoYXIgKiwgaW50KSk7Ci0gICAgaW50ICAoKm5ha2NpKQkJLyogTkFLIG91ciBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uICovCi0JCV9fUCgoZnNtICosIHVfY2hhciAqLCBpbnQsIGludCkpOwotICAgIGludCAgKCpyZWpjaSkJCS8qIFJlamVjdCBvdXIgQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbiAqLwotCQlfX1AoKGZzbSAqLCB1X2NoYXIgKiwgaW50KSk7Ci0gICAgaW50ICAoKnJlcWNpKQkJLyogUmVxdWVzdCBwZWVyJ3MgQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbiAqLwotCQlfX1AoKGZzbSAqLCB1X2NoYXIgKiwgaW50ICosIGludCkpOwotICAgIHZvaWQgKCp1cCkJCQkvKiBDYWxsZWQgd2hlbiBmc20gcmVhY2hlcyBPUEVORUQgc3RhdGUgKi8KLQkJX19QKChmc20gKikpOwotICAgIHZvaWQgKCpkb3duKQkJLyogQ2FsbGVkIHdoZW4gZnNtIGxlYXZlcyBPUEVORUQgc3RhdGUgKi8KLQkJX19QKChmc20gKikpOwotICAgIHZvaWQgKCpzdGFydGluZykJCS8qIENhbGxlZCB3aGVuIHdlIHdhbnQgdGhlIGxvd2VyIGxheWVyICovCi0JCV9fUCgoZnNtICopKTsKLSAgICB2b2lkICgqZmluaXNoZWQpCQkvKiBDYWxsZWQgd2hlbiB3ZSBkb24ndCB3YW50IHRoZSBsb3dlciBsYXllciAqLwotCQlfX1AoKGZzbSAqKSk7Ci0gICAgdm9pZCAoKnByb3RyZWplY3QpCQkvKiBDYWxsZWQgd2hlbiBQcm90b2NvbC1SZWplY3QgcmVjZWl2ZWQgKi8KLQkJX19QKChpbnQpKTsKLSAgICB2b2lkICgqcmV0cmFuc21pdCkJCS8qIFJldHJhbnNtaXNzaW9uIGlzIG5lY2Vzc2FyeSAqLwotCQlfX1AoKGZzbSAqKSk7Ci0gICAgaW50ICAoKmV4dGNvZGUpCQkvKiBDYWxsZWQgd2hlbiB1bmtub3duIGNvZGUgcmVjZWl2ZWQgKi8KLQkJX19QKChmc20gKiwgaW50LCBpbnQsIHVfY2hhciAqLCBpbnQpKTsKLSAgICBjaGFyICpwcm90b19uYW1lOwkJLyogU3RyaW5nIG5hbWUgZm9yIHByb3RvY29sIChmb3IgbWVzc2FnZXMpICovCi19IGZzbV9jYWxsYmFja3M7Ci0KLQotLyoKLSAqIExpbmsgc3RhdGVzLgotICovCi0jZGVmaW5lIElOSVRJQUwJCTAJLyogRG93biwgaGFzbid0IGJlZW4gb3BlbmVkICovCi0jZGVmaW5lIFNUQVJUSU5HCTEJLyogRG93biwgYmVlbiBvcGVuZWQgKi8KLSNkZWZpbmUgQ0xPU0VECQkyCS8qIFVwLCBoYXNuJ3QgYmVlbiBvcGVuZWQgKi8KLSNkZWZpbmUgU1RPUFBFRAkJMwkvKiBPcGVuLCB3YWl0aW5nIGZvciBkb3duIGV2ZW50ICovCi0jZGVmaW5lIENMT1NJTkcJCTQJLyogVGVybWluYXRpbmcgdGhlIGNvbm5lY3Rpb24sIG5vdCBvcGVuICovCi0jZGVmaW5lIFNUT1BQSU5HCTUJLyogVGVybWluYXRpbmcsIGJ1dCBvcGVuICovCi0jZGVmaW5lIFJFUVNFTlQJCTYJLyogV2UndmUgc2VudCBhIENvbmZpZyBSZXF1ZXN0ICovCi0jZGVmaW5lIEFDS1JDVkQJCTcJLyogV2UndmUgcmVjZWl2ZWQgYSBDb25maWcgQWNrICovCi0jZGVmaW5lIEFDS1NFTlQJCTgJLyogV2UndmUgc2VudCBhIENvbmZpZyBBY2sgKi8KLSNkZWZpbmUgT1BFTkVECQk5CS8qIENvbm5lY3Rpb24gYXZhaWxhYmxlICovCi0KLQotLyoKLSAqIEZsYWdzIC0gaW5kaWNhdGUgb3B0aW9ucyBjb250cm9sbGluZyBGU00gb3BlcmF0aW9uCi0gKi8KLSNkZWZpbmUgT1BUX1BBU1NJVkUJMQkvKiBEb24ndCBkaWUgaWYgd2UgZG9uJ3QgZ2V0IGEgcmVzcG9uc2UgKi8KLSNkZWZpbmUgT1BUX1JFU1RBUlQJMgkvKiBUcmVhdCAybmQgT1BFTiBhcyBET1dOLCBVUCAqLwotI2RlZmluZSBPUFRfU0lMRU5UCTQJLyogV2FpdCBmb3IgcGVlciB0byBzcGVhayBmaXJzdCAqLwotCi0KLS8qCi0gKiBUaW1lb3V0cy4KLSAqLwotI2RlZmluZSBERUZUSU1FT1VUCTMJLyogVGltZW91dCB0aW1lIGluIHNlY29uZHMgKi8KLSNkZWZpbmUgREVGTUFYVEVSTVJFUVMJMgkvKiBNYXhpbXVtIFRlcm1pbmF0ZS1SZXF1ZXN0IHRyYW5zbWlzc2lvbnMgKi8KLSNkZWZpbmUgREVGTUFYQ09ORlJFUVMJMTAJLyogTWF4aW11bSBDb25maWd1cmUtUmVxdWVzdCB0cmFuc21pc3Npb25zICovCi0jZGVmaW5lIERFRk1BWE5BS0xPT1BTCTUJLyogTWF4aW11bSBudW1iZXIgb2YgbmFrIGxvb3BzICovCi0KLQotLyoKLSAqIFByb3RvdHlwZXMKLSAqLwotdm9pZCBmc21faW5pdCBfX1AoKGZzbSAqKSk7Ci12b2lkIGZzbV9sb3dlcnVwIF9fUCgoZnNtICopKTsKLXZvaWQgZnNtX2xvd2VyZG93biBfX1AoKGZzbSAqKSk7Ci12b2lkIGZzbV9vcGVuIF9fUCgoZnNtICopKTsKLXZvaWQgZnNtX2Nsb3NlIF9fUCgoZnNtICosIGNoYXIgKikpOwotdm9pZCBmc21faW5wdXQgX19QKChmc20gKiwgdV9jaGFyICosIGludCkpOwotdm9pZCBmc21fcHJvdHJlamVjdCBfX1AoKGZzbSAqKSk7Ci12b2lkIGZzbV9zZGF0YSBfX1AoKGZzbSAqLCBpbnQsIGludCwgdV9jaGFyICosIGludCkpOwotCi0KLS8qCi0gKiBWYXJpYWJsZXMKLSAqLwotZXh0ZXJuIGludCBwZWVyX21ydVtdOwkJLyogY3VycmVudGx5IG5lZ290aWF0ZWQgcGVlciBNUlUgKHBlciB1bml0KSAqLwpkaWZmIC0tZ2l0IGEvcHBwZC9pbmNsdWRlL25ldC9pZl9wcHAuaCBiL3BwcGQvaW5jbHVkZS9uZXQvaWZfcHBwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZWM2MDYuLjAwMDAwMDAKLS0tIGEvcHBwZC9pbmNsdWRlL25ldC9pZl9wcHAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKgkkSWQ6IGlmX3BwcC5oLHYgMS4xOSAyMDAyLzEyLzA2IDA5OjQ5OjE1IHBhdWx1cyBFeHAgJAkqLwotCi0vKgotICogaWZfcHBwLmggLSBQb2ludC10by1Qb2ludCBQcm90b2NvbCBkZWZpbml0aW9ucy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODQtMjAwMCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgbmFtZSAiQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciBwZXJtaXNzaW9uIG9yIGFueSBsZWdhbAotICogICAgZGV0YWlscywgcGxlYXNlIGNvbnRhY3QKLSAqICAgICAgT2ZmaWNlIG9mIFRlY2hub2xvZ3kgVHJhbnNmZXIKLSAqICAgICAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAqICAgICAgNTAwMCBGb3JiZXMgQXZlbnVlCi0gKiAgICAgIFBpdHRzYnVyZ2gsIFBBICAxNTIxMy0zODkwCi0gKiAgICAgICg0MTIpIDI2OC00Mzg3LCBmYXg6ICg0MTIpIDI2OC03Mzk1Ci0gKiAgICAgIHRlY2gtdHJhbnNmZXJAYW5kcmV3LmNtdS5lZHUKLSAqCi0gKiA0LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IENvbXB1dGluZyBTZXJ2aWNlcwotICogICAgIGF0IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IChodHRwOi8vd3d3LmNtdS5lZHUvY29tcHV0aW5nLykuIgotICoKLSAqIENBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotICogVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi0gKiBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi0gKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi0gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaWZuZGVmIF9JRl9QUFBfSF8KLSNkZWZpbmUgX0lGX1BQUF9IXwotCi0vKgotICogQml0IGRlZmluaXRpb25zIGZvciBmbGFncy4KLSAqLwotI2RlZmluZSBTQ19DT01QX1BST1QJMHgwMDAwMDAwMQkvKiBwcm90b2NvbCBjb21wcmVzc2lvbiAob3V0cHV0KSAqLwotI2RlZmluZSBTQ19DT01QX0FDCTB4MDAwMDAwMDIJLyogaGVhZGVyIGNvbXByZXNzaW9uIChvdXRwdXQpICovCi0jZGVmaW5lCVNDX0NPTVBfVENQCTB4MDAwMDAwMDQJLyogVENQIChWSikgY29tcHJlc3Npb24gKG91dHB1dCkgKi8KLSNkZWZpbmUgU0NfTk9fVENQX0NDSUQJMHgwMDAwMDAwOAkvKiBkaXNhYmxlIFZKIGNvbm5lY3Rpb24taWQgY29tcC4gKi8KLSNkZWZpbmUgU0NfUkVKX0NPTVBfQUMJMHgwMDAwMDAxMAkvKiByZWplY3QgYWRycy9jdHJsIGNvbXAuIG9uIGlucHV0ICovCi0jZGVmaW5lIFNDX1JFSl9DT01QX1RDUAkweDAwMDAwMDIwCS8qIHJlamVjdCBUQ1AgKFZKKSBjb21wLiBvbiBpbnB1dCAqLwotI2RlZmluZSBTQ19DQ1BfT1BFTgkweDAwMDAwMDQwCS8qIExvb2sgYXQgQ0NQIHBhY2tldHMgKi8KLSNkZWZpbmUgU0NfQ0NQX1VQCTB4MDAwMDAwODAJLyogTWF5IHNlbmQvcmVjdiBjb21wcmVzc2VkIHBhY2tldHMgKi8KLSNkZWZpbmUgU0NfREVCVUcJMHgwMDAxMDAwMAkvKiBlbmFibGUgZGVidWcgbWVzc2FnZXMgKi8KLSNkZWZpbmUgU0NfTE9HX0lOUEtUCTB4MDAwMjAwMDAJLyogbG9nIGNvbnRlbnRzIG9mIGdvb2QgcGt0cyByZWN2ZCAqLwotI2RlZmluZSBTQ19MT0dfT1VUUEtUCTB4MDAwNDAwMDAJLyogbG9nIGNvbnRlbnRzIG9mIHBrdHMgc2VudCAqLwotI2RlZmluZSBTQ19MT0dfUkFXSU4JMHgwMDA4MDAwMAkvKiBsb2cgYWxsIGNoYXJzIHJlY2VpdmVkICovCi0jZGVmaW5lIFNDX0xPR19GTFVTSAkweDAwMTAwMDAwCS8qIGxvZyBhbGwgY2hhcnMgZmx1c2hlZCAqLwotI2RlZmluZSBTQ19SQ1ZfQjdfMAkweDAxMDAwMDAwCS8qIGhhdmUgcmN2ZCBjaGFyIHdpdGggYml0IDcgPSAwICovCi0jZGVmaW5lIFNDX1JDVl9CN18xCTB4MDIwMDAwMDAJLyogaGF2ZSByY3ZkIGNoYXIgd2l0aCBiaXQgNyA9IDEgKi8KLSNkZWZpbmUgU0NfUkNWX0VWTlAJMHgwNDAwMDAwMAkvKiBoYXZlIHJjdmQgY2hhciB3aXRoIGV2ZW4gcGFyaXR5ICovCi0jZGVmaW5lIFNDX1JDVl9PRERQCTB4MDgwMDAwMDAJLyogaGF2ZSByY3ZkIGNoYXIgd2l0aCBvZGQgcGFyaXR5ICovCi0jZGVmaW5lIFNDX1NZTkMJCTB4MDAyMDAwMDAJLyogdXNlIHN5bmNocm9ub3VzIEhETEMgZnJhbWluZyAqLwotI2RlZmluZQlTQ19NQVNLCQkweDBmZmYwMGZmCS8qIGJpdHMgdGhhdCB1c2VyIGNhbiBjaGFuZ2UgKi8KLQotLyoKLSAqIFN0YXRlIGJpdHMgaW4gc2NfZmxhZ3MsIG5vdCBjaGFuZ2VhYmxlIGJ5IHVzZXIuCi0gKi8KLSNkZWZpbmUgU0NfVElNRU9VVAkweDAwMDAwNDAwCS8qIHRpbWVvdXQgaXMgY3VycmVudGx5IHBlbmRpbmcgKi8KLSNkZWZpbmUgU0NfVkpfUkVTRVQJMHgwMDAwMDgwMAkvKiBuZWVkIHRvIHJlc2V0IFZKIGRlY29tcCAqLwotI2RlZmluZSBTQ19DT01QX1JVTgkweDAwMDAxMDAwCS8qIGNvbXByZXNzb3IgaGFzIGJlZW4gaW5pdGVkICovCi0jZGVmaW5lIFNDX0RFQ09NUF9SVU4JMHgwMDAwMjAwMAkvKiBkZWNvbXByZXNzb3IgaGFzIGJlZW4gaW5pdGVkICovCi0jZGVmaW5lIFNDX0RDX0VSUk9SCTB4MDAwMDQwMDAJLyogbm9uLWZhdGFsIGRlY29tcCBlcnJvciBkZXRlY3RlZCAqLwotI2RlZmluZSBTQ19EQ19GRVJST1IJMHgwMDAwODAwMAkvKiBmYXRhbCBkZWNvbXAgZXJyb3IgZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgU0NfVEJVU1kJMHgxMDAwMDAwMAkvKiB4bWl0dGVyIGRvZXNuJ3QgbmVlZCBhIHBhY2tldCB5ZXQgKi8KLSNkZWZpbmUgU0NfUEtUTE9TVAkweDIwMDAwMDAwCS8qIGhhdmUgbG9zdCBvciBkcm9wcGVkIGEgcGFja2V0ICovCi0jZGVmaW5lCVNDX0ZMVVNICTB4NDAwMDAwMDAJLyogZmx1c2ggaW5wdXQgdW50aWwgbmV4dCBQUFBfRkxBRyAqLwotI2RlZmluZQlTQ19FU0NBUEVECTB4ODAwMDAwMDAJLyogc2F3IGEgUFBQX0VTQ0FQRSAqLwotCi0vKgotICogSW9jdGwgZGVmaW5pdGlvbnMuCi0gKi8KLQotc3RydWN0IG5waW9jdGwgewotICAgIGludAkJcHJvdG9jb2w7CS8qIFBQUCBwcm9jb3RvbCwgZS5nLiBQUFBfSVAgKi8KLSAgICBlbnVtIE5QbW9kZQltb2RlOwotfTsKLQotLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgYSBDQ1AgY29uZmlndXJhdGlvbiBvcHRpb24sIGZvciBQUFBJT0NTQ09NUFJFU1MgKi8KLXN0cnVjdCBwcHBfb3B0aW9uX2RhdGEgewotCXVfY2hhcgkqcHRyOwotCXVfaW50CWxlbmd0aDsKLQlpbnQJdHJhbnNtaXQ7Ci19OwotCi1zdHJ1Y3QgaWZwcHBzdGF0c3JlcSB7Ci0gICAgY2hhciBpZnJfbmFtZVtJRk5BTVNJWl07Ci0gICAgc3RydWN0IHBwcF9zdGF0cyBzdGF0czsKLX07Ci0KLXN0cnVjdCBpZnBwcGNzdGF0c3JlcSB7Ci0gICAgY2hhciBpZnJfbmFtZVtJRk5BTVNJWl07Ci0gICAgc3RydWN0IHBwcF9jb21wX3N0YXRzIHN0YXRzOwotfTsKLQotLyoKLSAqIElvY3RsIGRlZmluaXRpb25zLgotICovCi0KLSNkZWZpbmUJUFBQSU9DR0ZMQUdTCV9JT1IoJ3QnLCA5MCwgaW50KQkvKiBnZXQgY29uZmlndXJhdGlvbiBmbGFncyAqLwotI2RlZmluZQlQUFBJT0NTRkxBR1MJX0lPVygndCcsIDg5LCBpbnQpCS8qIHNldCBjb25maWd1cmF0aW9uIGZsYWdzICovCi0jZGVmaW5lCVBQUElPQ0dBU1lOQ01BUAlfSU9SKCd0JywgODgsIGludCkJLyogZ2V0IGFzeW5jIG1hcCAqLwotI2RlZmluZQlQUFBJT0NTQVNZTkNNQVAJX0lPVygndCcsIDg3LCBpbnQpCS8qIHNldCBhc3luYyBtYXAgKi8KLSNkZWZpbmUJUFBQSU9DR1VOSVQJX0lPUigndCcsIDg2LCBpbnQpCS8qIGdldCBwcHAgdW5pdCBudW1iZXIgKi8KLSNkZWZpbmUJUFBQSU9DR1JBU1lOQ01BUCBfSU9SKCd0JywgODUsIGludCkJLyogZ2V0IHJlY2VpdmUgYXN5bmMgbWFwICovCi0jZGVmaW5lCVBQUElPQ1NSQVNZTkNNQVAgX0lPVygndCcsIDg0LCBpbnQpCS8qIHNldCByZWNlaXZlIGFzeW5jIG1hcCAqLwotI2RlZmluZQlQUFBJT0NHTVJVCV9JT1IoJ3QnLCA4MywgaW50KQkvKiBnZXQgbWF4IHJlY2VpdmUgdW5pdCAqLwotI2RlZmluZQlQUFBJT0NTTVJVCV9JT1coJ3QnLCA4MiwgaW50KQkvKiBzZXQgbWF4IHJlY2VpdmUgdW5pdCAqLwotI2RlZmluZQlQUFBJT0NTTUFYQ0lECV9JT1coJ3QnLCA4MSwgaW50KQkvKiBzZXQgVkogbWF4IHNsb3QgSUQgKi8KLSNkZWZpbmUgUFBQSU9DR1hBU1lOQ01BUCBfSU9SKCd0JywgODAsIGV4dF9hY2NtKSAvKiBnZXQgZXh0ZW5kZWQgQUNDTSAqLwotI2RlZmluZSBQUFBJT0NTWEFTWU5DTUFQIF9JT1coJ3QnLCA3OSwgZXh0X2FjY20pIC8qIHNldCBleHRlbmRlZCBBQ0NNICovCi0jZGVmaW5lIFBQUElPQ1hGRVJVTklUCV9JTygndCcsIDc4KQkJLyogdHJhbnNmZXIgUFBQIHVuaXQgKi8KLSNkZWZpbmUgUFBQSU9DU0NPTVBSRVNTCV9JT1coJ3QnLCA3Nywgc3RydWN0IHBwcF9vcHRpb25fZGF0YSkKLSNkZWZpbmUgUFBQSU9DR05QTU9ERQlfSU9XUigndCcsIDc2LCBzdHJ1Y3QgbnBpb2N0bCkgLyogZ2V0IE5QIG1vZGUgKi8KLSNkZWZpbmUgUFBQSU9DU05QTU9ERQlfSU9XKCd0JywgNzUsIHN0cnVjdCBucGlvY3RsKSAgLyogc2V0IE5QIG1vZGUgKi8KLSNkZWZpbmUgUFBQSU9DR0lETEUJX0lPUigndCcsIDc0LCBzdHJ1Y3QgcHBwX2lkbGUpIC8qIGdldCBpZGxlIHRpbWUgKi8KLSNpZmRlZiBQUFBfRklMVEVSCi0jZGVmaW5lIFBQUElPQ1NQQVNTCV9JT1coJ3QnLCA3MSwgc3RydWN0IGJwZl9wcm9ncmFtKSAvKiBzZXQgcGFzcyBmaWx0ZXIgKi8KLSNkZWZpbmUgUFBQSU9DU0FDVElWRQlfSU9XKCd0JywgNzAsIHN0cnVjdCBicGZfcHJvZ3JhbSkgLyogc2V0IGFjdGl2ZSBmaWx0ICovCi0jZW5kaWYgLyogUFBQX0ZJTFRFUiAqLwotCi0vKiBQUFBJT0NbR1NdTVRVIGFyZSBhbHRlcm5hdGl2ZXMgdG8gU0lPQ1tHU11JRk1UVSwgdXNlZCB1bmRlciBVbHRyaXggKi8KLSNkZWZpbmUgUFBQSU9DR01UVQlfSU9SKCd0JywgNzMsIGludCkJLyogZ2V0IGludGVyZmFjZSBNVFUgKi8KLSNkZWZpbmUgUFBQSU9DU01UVQlfSU9XKCd0JywgNzIsIGludCkJLyogc2V0IGludGVyZmFjZSBNVFUgKi8KLQotLyoKLSAqIFRoZXNlIHR3byBhcmUgaW50ZXJmYWNlIGlvY3RscyBzbyB0aGF0IHBwcHN0YXRzIGNhbiBkbyB0aGVtIG9uCi0gKiBhIHNvY2tldCB3aXRob3V0IGhhdmluZyB0byBvcGVuIHRoZSBzZXJpYWwgZGV2aWNlLgotICovCi0jZGVmaW5lIFNJT0NHUFBQU1RBVFMJX0lPV1IoJ2knLCAxMjMsIHN0cnVjdCBpZnBwcHN0YXRzcmVxKQotI2RlZmluZSBTSU9DR1BQUENTVEFUUwlfSU9XUignaScsIDEyMiwgc3RydWN0IGlmcHBwY3N0YXRzcmVxKQotCi0jaWYgIWRlZmluZWQoaWZyX210dSkKLSNkZWZpbmUgaWZyX210dQlpZnJfaWZydS5pZnJ1X21ldHJpYwotI2VuZGlmCi0KLSNpZiAoZGVmaW5lZChfS0VSTkVMKSB8fCBkZWZpbmVkKEtFUk5FTCkpICYmICFkZWZpbmVkKE5lWFQpCi12b2lkIHBwcGF0dGFjaCBfX1AoKHZvaWQpKTsKLXZvaWQgcHBwaW50ciBfX1AoKHZvaWQpKTsKLSNlbmRpZgotI2VuZGlmIC8qIF9JRl9QUFBfSF8gKi8KZGlmZiAtLWdpdCBhL3BwcGQvaW5jbHVkZS9uZXQvcHBwLWNvbXAuaCBiL3BwcGQvaW5jbHVkZS9uZXQvcHBwLWNvbXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg4YzczZS4uMDAwMDAwMAotLS0gYS9wcHBkL2luY2x1ZGUvbmV0L3BwcC1jb21wLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoKLSAqIHBwcC1jb21wLmggLSBEZWZpbml0aW9ucyBmb3IgZG9pbmcgUFBQIHBhY2tldCBjb21wcmVzc2lvbi4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODQgUGF1bCBNYWNrZXJyYXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIDQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgUGF1bCBNYWNrZXJyYXMKLSAqICAgICA8cGF1bHVzQHNhbWJhLm9yZz4iLgotICoKLSAqIFRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLSAqIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotICogQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKgotICogJElkOiBwcHAtY29tcC5oLHYgMS4xMyAyMDAyLzEyLzA2IDA5OjQ5OjE1IHBhdWx1cyBFeHAgJAotICovCi0KLSNpZm5kZWYgX05FVF9QUFBfQ09NUF9ICi0jZGVmaW5lIF9ORVRfUFBQX0NPTVBfSAotCi0vKgotICogVGhlIGZvbGxvd2luZyBzeW1ib2xzIGNvbnRyb2wgd2hldGhlciB3ZSBpbmNsdWRlIGNvZGUgZm9yCi0gKiB2YXJpb3VzIGNvbXByZXNzaW9uIG1ldGhvZHMuCi0gKi8KLSNpZm5kZWYgRE9fQlNEX0NPTVBSRVNTCi0jZGVmaW5lIERPX0JTRF9DT01QUkVTUwkxCS8qIGJ5IGRlZmF1bHQsIGluY2x1ZGUgQlNELUNvbXByZXNzICovCi0jZW5kaWYKLSNpZm5kZWYgRE9fREVGTEFURQotI2RlZmluZSBET19ERUZMQVRFCTEJLyogYnkgZGVmYXVsdCwgaW5jbHVkZSBEZWZsYXRlICovCi0jZW5kaWYKLSNkZWZpbmUgRE9fUFJFRElDVE9SXzEJMAotI2RlZmluZSBET19QUkVESUNUT1JfMgkwCi0KLS8qCi0gKiBTdHJ1Y3R1cmUgZ2l2aW5nIG1ldGhvZHMgZm9yIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24uCi0gKi8KLSNpZmRlZiBQQUNLRVRQVFIKLXN0cnVjdCBjb21wcmVzc29yIHsKLQlpbnQJY29tcHJlc3NfcHJvdG87CS8qIENDUCBjb21wcmVzc2lvbiBwcm90b2NvbCBudW1iZXIgKi8KLQotCS8qIEFsbG9jYXRlIHNwYWNlIGZvciBhIGNvbXByZXNzb3IgKHRyYW5zbWl0IHNpZGUpICovCi0Jdm9pZAkqKCpjb21wX2FsbG9jKSBfX1AoKHVfY2hhciAqb3B0aW9ucywgaW50IG9wdF9sZW4pKTsKLQkvKiBGcmVlIHNwYWNlIHVzZWQgYnkgYSBjb21wcmVzc29yICovCi0Jdm9pZAkoKmNvbXBfZnJlZSkgX19QKCh2b2lkICpzdGF0ZSkpOwotCS8qIEluaXRpYWxpemUgYSBjb21wcmVzc29yICovCi0JaW50CSgqY29tcF9pbml0KSBfX1AoKHZvaWQgKnN0YXRlLCB1X2NoYXIgKm9wdGlvbnMsIGludCBvcHRfbGVuLAotCQkJCSAgaW50IHVuaXQsIGludCBoZHJsZW4sIGludCBkZWJ1ZykpOwotCS8qIFJlc2V0IGEgY29tcHJlc3NvciAqLwotCXZvaWQJKCpjb21wX3Jlc2V0KSBfX1AoKHZvaWQgKnN0YXRlKSk7Ci0JLyogQ29tcHJlc3MgYSBwYWNrZXQgKi8KLQlpbnQJKCpjb21wcmVzcykgX19QKCh2b2lkICpzdGF0ZSwgUEFDS0VUUFRSICptcmV0LAotCQkJCSBQQUNLRVRQVFIgbXAsIGludCBvcmlnX2xlbiwgaW50IG1heF9sZW4pKTsKLQkvKiBSZXR1cm4gY29tcHJlc3Npb24gc3RhdGlzdGljcyAqLwotCXZvaWQJKCpjb21wX3N0YXQpIF9fUCgodm9pZCAqc3RhdGUsIHN0cnVjdCBjb21wc3RhdCAqc3RhdHMpKTsKLQotCS8qIEFsbG9jYXRlIHNwYWNlIGZvciBhIGRlY29tcHJlc3NvciAocmVjZWl2ZSBzaWRlKSAqLwotCXZvaWQJKigqZGVjb21wX2FsbG9jKSBfX1AoKHVfY2hhciAqb3B0aW9ucywgaW50IG9wdF9sZW4pKTsKLQkvKiBGcmVlIHNwYWNlIHVzZWQgYnkgYSBkZWNvbXByZXNzb3IgKi8KLQl2b2lkCSgqZGVjb21wX2ZyZWUpIF9fUCgodm9pZCAqc3RhdGUpKTsKLQkvKiBJbml0aWFsaXplIGEgZGVjb21wcmVzc29yICovCi0JaW50CSgqZGVjb21wX2luaXQpIF9fUCgodm9pZCAqc3RhdGUsIHVfY2hhciAqb3B0aW9ucywgaW50IG9wdF9sZW4sCi0JCQkJICAgIGludCB1bml0LCBpbnQgaGRybGVuLCBpbnQgbXJ1LCBpbnQgZGVidWcpKTsKLQkvKiBSZXNldCBhIGRlY29tcHJlc3NvciAqLwotCXZvaWQJKCpkZWNvbXBfcmVzZXQpIF9fUCgodm9pZCAqc3RhdGUpKTsKLQkvKiBEZWNvbXByZXNzIGEgcGFja2V0LiAqLwotCWludAkoKmRlY29tcHJlc3MpIF9fUCgodm9pZCAqc3RhdGUsIFBBQ0tFVFBUUiBtcCwKLQkJCQkgICBQQUNLRVRQVFIgKmRtcHApKTsKLQkvKiBVcGRhdGUgc3RhdGUgZm9yIGFuIGluY29tcHJlc3NpYmxlIHBhY2tldCByZWNlaXZlZCAqLwotCXZvaWQJKCppbmNvbXApIF9fUCgodm9pZCAqc3RhdGUsIFBBQ0tFVFBUUiBtcCkpOwotCS8qIFJldHVybiBkZWNvbXByZXNzaW9uIHN0YXRpc3RpY3MgKi8KLQl2b2lkCSgqZGVjb21wX3N0YXQpIF9fUCgodm9pZCAqc3RhdGUsIHN0cnVjdCBjb21wc3RhdCAqc3RhdHMpKTsKLX07Ci0jZW5kaWYgLyogUEFDS0VUUFRSICovCi0KLS8qCi0gKiBSZXR1cm4gdmFsdWVzIGZvciBkZWNvbXByZXNzIHJvdXRpbmUuCi0gKiBXZSBuZWVkIHRvIG1ha2UgdGhlc2UgZGlzdGluY3Rpb25zIHNvIHRoYXQgd2UgY2FuIGRpc2FibGUgY2VydGFpbgotICogdXNlZnVsIGZ1bmN0aW9uYWxpdHksIG5hbWVseSBzZW5kaW5nIGEgQ0NQIHJlc2V0LXJlcXVlc3QgYXMgYSByZXN1bHQKLSAqIG9mIGFuIGVycm9yIGRldGVjdGVkIGFmdGVyIGRlY29tcHJlc3Npb24uICBUaGlzIGlzIHRvIGF2b2lkIGluZnJpbmdpbmcKLSAqIGEgcGF0ZW50IGhlbGQgYnkgTW90b3JvbGEuCi0gKiBEb24ndCB5b3UganVzdCBsdXJ2ZSBzb2Z0d2FyZSBwYXRlbnRzLgotICovCi0jZGVmaW5lIERFQ09NUF9PSwkJMAkvKiBldmVyeXRoaW5nIHdlbnQgT0sgKi8KLSNkZWZpbmUgREVDT01QX0VSUk9SCQkxCS8qIGVycm9yIGRldGVjdGVkIGJlZm9yZSBkZWNvbXAuICovCi0jZGVmaW5lIERFQ09NUF9GQVRBTEVSUk9SCTIJLyogZXJyb3IgZGV0ZWN0ZWQgYWZ0ZXIgZGVjb21wLiAqLwotCi0vKgotICogQ0NQIGNvZGVzLgotICovCi0jZGVmaW5lIENDUF9DT05GUkVRCTEKLSNkZWZpbmUgQ0NQX0NPTkZBQ0sJMgotI2RlZmluZSBDQ1BfVEVSTVJFUQk1Ci0jZGVmaW5lIENDUF9URVJNQUNLCTYKLSNkZWZpbmUgQ0NQX1JFU0VUUkVRCTE0Ci0jZGVmaW5lIENDUF9SRVNFVEFDSwkxNQotCi0vKgotICogTWF4ICMgYnl0ZXMgZm9yIGEgQ0NQIG9wdGlvbgotICovCi0jZGVmaW5lIENDUF9NQVhfT1BUSU9OX0xFTkdUSAkzMgotCi0vKgotICogUGFydHMgb2YgYSBDQ1AgcGFja2V0LgotICovCi0jZGVmaW5lIENDUF9DT0RFKGRwKQkJKChkcClbMF0pCi0jZGVmaW5lIENDUF9JRChkcCkJCSgoZHApWzFdKQotI2RlZmluZSBDQ1BfTEVOR1RIKGRwKQkJKCgoZHApWzJdIDw8IDgpICsgKGRwKVszXSkKLSNkZWZpbmUgQ0NQX0hEUkxFTgkJNAotCi0jZGVmaW5lIENDUF9PUFRfQ09ERShkcCkJKChkcClbMF0pCi0jZGVmaW5lIENDUF9PUFRfTEVOR1RIKGRwKQkoKGRwKVsxXSkKLSNkZWZpbmUgQ0NQX09QVF9NSU5MRU4JCTIKLQotLyoKLSAqIERlZmluaXRpb25zIGZvciBCU0QtQ29tcHJlc3MuCi0gKi8KLSNkZWZpbmUgQ0lfQlNEX0NPTVBSRVNTCQkyMQkvKiBjb25maWcuIG9wdGlvbiBmb3IgQlNELUNvbXByZXNzICovCi0jZGVmaW5lIENJTEVOX0JTRF9DT01QUkVTUwkzCS8qIGxlbmd0aCBvZiBjb25maWcuIG9wdGlvbiAqLwotCi0vKiBNYWNyb3MgZm9yIGhhbmRsaW5nIHRoZSAzcmQgYnl0ZSBvZiB0aGUgQlNELUNvbXByZXNzIGNvbmZpZyBvcHRpb24uICovCi0jZGVmaW5lIEJTRF9OQklUUyh4KQkJKCh4KSAmIDB4MUYpCS8qIG51bWJlciBvZiBiaXRzIHJlcXVlc3RlZCAqLwotI2RlZmluZSBCU0RfVkVSU0lPTih4KQkJKCh4KSA+PiA1KQkvKiB2ZXJzaW9uIG9mIG9wdGlvbiBmb3JtYXQgKi8KLSNkZWZpbmUgQlNEX0NVUlJFTlRfVkVSU0lPTgkxCQkvKiBjdXJyZW50IHZlcnNpb24gbnVtYmVyICovCi0jZGVmaW5lIEJTRF9NQUtFX09QVCh2LCBuKQkoKCh2KSA8PCA1KSB8IChuKSkKLQotI2RlZmluZSBCU0RfTUlOX0JJVFMJCTkJLyogc21hbGxlc3QgY29kZSBzaXplIHN1cHBvcnRlZCAqLwotI2RlZmluZSBCU0RfTUFYX0JJVFMJCTE1CS8qIGxhcmdlc3QgY29kZSBzaXplIHN1cHBvcnRlZCAqLwotCi0vKgotICogRGVmaW5pdGlvbnMgZm9yIERlZmxhdGUuCi0gKi8KLSNkZWZpbmUgQ0lfREVGTEFURQkJMjYJLyogY29uZmlnIG9wdGlvbiBmb3IgRGVmbGF0ZSAqLwotI2RlZmluZSBDSV9ERUZMQVRFX0RSQUZUCTI0CS8qIHZhbHVlIHVzZWQgaW4gb3JpZ2luYWwgZHJhZnQgUkZDICovCi0jZGVmaW5lIENJTEVOX0RFRkxBVEUJCTQJLyogbGVuZ3RoIG9mIGl0cyBjb25maWcgb3B0aW9uICovCi0KLSNkZWZpbmUgREVGTEFURV9NSU5fU0laRQk4Ci0jZGVmaW5lIERFRkxBVEVfTUFYX1NJWkUJMTUKLSNkZWZpbmUgREVGTEFURV9NRVRIT0RfVkFMCTgKLSNkZWZpbmUgREVGTEFURV9TSVpFKHgpCQkoKCh4KSA+PiA0KSArIERFRkxBVEVfTUlOX1NJWkUpCi0jZGVmaW5lIERFRkxBVEVfTUVUSE9EKHgpCSgoeCkgJiAweDBGKQotI2RlZmluZSBERUZMQVRFX01BS0VfT1BUKHcpCSgoKCh3KSAtIERFRkxBVEVfTUlOX1NJWkUpIDw8IDQpIFwKLQkJCQkgKyBERUZMQVRFX01FVEhPRF9WQUwpCi0jZGVmaW5lIERFRkxBVEVfQ0hLX1NFUVVFTkNFCTAKLQotLyoKLSAqIERlZmluaXRpb25zIGZvciBNUFBFLgotICovCi0jZGVmaW5lIENJX01QUEUJCQkxOAkvKiBjb25maWcgb3B0aW9uIGZvciBNUFBFICovCi0jZGVmaW5lIENJTEVOX01QUEUJCTYJLyogbGVuZ3RoIG9mIGNvbmZpZyBvcHRpb24gKi8KLQotLyoKLSAqIERlZmluaXRpb25zIGZvciBvdGhlciwgYXMgeWV0IHVuc3VwcG9ydGVkLCBjb21wcmVzc2lvbiBtZXRob2RzLgotICovCi0jZGVmaW5lIENJX1BSRURJQ1RPUl8xCQkxCS8qIGNvbmZpZyBvcHRpb24gZm9yIFByZWRpY3Rvci0xICovCi0jZGVmaW5lIENJTEVOX1BSRURJQ1RPUl8xCTIJLyogbGVuZ3RoIG9mIGl0cyBjb25maWcgb3B0aW9uICovCi0jZGVmaW5lIENJX1BSRURJQ1RPUl8yCQkyCS8qIGNvbmZpZyBvcHRpb24gZm9yIFByZWRpY3Rvci0yICovCi0jZGVmaW5lIENJTEVOX1BSRURJQ1RPUl8yCTIJLyogbGVuZ3RoIG9mIGl0cyBjb25maWcgb3B0aW9uICovCi0KLSNlbmRpZiAvKiBfTkVUX1BQUF9DT01QX0ggKi8KZGlmZiAtLWdpdCBhL3BwcGQvaW5jbHVkZS9uZXQvcHBwX2RlZnMuaCBiL3BwcGQvaW5jbHVkZS9uZXQvcHBwX2RlZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUyMjI5MC4uMDAwMDAwMAotLS0gYS9wcHBkL2luY2x1ZGUvbmV0L3BwcF9kZWZzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoJJElkOiBwcHBfZGVmcy5oLHYgMS4xNyAyMDAyLzEyLzA2IDA5OjQ5OjE1IHBhdWx1cyBFeHAgJAkqLwotCi0vKgotICogcHBwX2RlZnMuaCAtIFBQUCBkZWZpbml0aW9ucy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODQgUGF1bCBNYWNrZXJyYXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIDQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgUGF1bCBNYWNrZXJyYXMKLSAqICAgICA8cGF1bHVzQHNhbWJhLm9yZz4iLgotICoKLSAqIFRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLSAqIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotICogQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfUFBQX0RFRlNfSF8KLSNkZWZpbmUgX1BQUF9ERUZTX0hfCi0KLSNpZiBkZWZpbmVkKF9fbGludXhfXykKLSNpbmNsdWRlIDxsaW51eC9wcHBfZGVmcy5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBQUF9BRERSRVNTKQotI2RlZmluZSBVU0lOR19VQVBJCi0jZW5kaWYKLQotLyoKLSAqIFRoZSBiYXNpYyBQUFAgZnJhbWUuCi0gKi8KLSNkZWZpbmUgUFBQX0hEUkxFTgk0CS8qIG9jdGV0cyBmb3Igc3RhbmRhcmQgcHBwIGhlYWRlciAqLwotI2RlZmluZSBQUFBfRkNTTEVOCTIJLyogb2N0ZXRzIGZvciBGQ1MgKi8KLQotLyoKLSAqIFBhY2tldCBzaXplcwotICoKLSAqIE5vdGUgLSBsY3Agc2hvdWxkbid0IGJlIGFsbG93ZWQgdG8gbmVnb3RpYXRlIHN0dWZmIG91dHNpZGUgdGhlc2UKLSAqCSAgbGltaXRzLiAgU2VlIGxjcC5oIGluIHRoZSBwcHBkIGRpcmVjdG9yeS4KLSAqIChYWFggLSB0aGVzZSBjb25zdGFudHMgc2hvdWxkIHNpbXBseSBiZSBzaGFyZWQgYnkgbGNwLmMgaW5zdGVhZAotICoJICBvZiBsaXZpbmcgaW4gbGNwLmgpCi0gKi8KLSNkZWZpbmUJUFBQX01UVQkJMTUwMAkvKiBEZWZhdWx0IE1UVSAoc2l6ZSBvZiBJbmZvIGZpZWxkKSAqLwotI2RlZmluZSBQUFBfTUFYTVRVCTY1NTM1IC0gKFBQUF9IRFJMRU4gKyBQUFBfRkNTTEVOKQotI2RlZmluZSBQUFBfTUlOTVRVCTY0Ci0jZGVmaW5lIFBQUF9NUlUJCTE1MDAJLyogZGVmYXVsdCBNUlUgPSBtYXggbGVuZ3RoIG9mIGluZm8gZmllbGQgKi8KLSNkZWZpbmUgUFBQX01BWE1SVQk2NTAwMAkvKiBMYXJnZXN0IE1SVSB3ZSBhbGxvdyAqLwotI2RlZmluZSBQUFBfTUlOTVJVCTEyOAotCi0jaWYgIWRlZmluZWQoVVNJTkdfVUFQSSkKLSNkZWZpbmUgUFBQX0FERFJFU1MocCkJKCgodV9jaGFyICopKHApKVswXSkKLSNkZWZpbmUgUFBQX0NPTlRST0wocCkJKCgodV9jaGFyICopKHApKVsxXSkKLSNkZWZpbmUgUFBQX1BST1RPQ09MKHApCSgoKCh1X2NoYXIgKikocCkpWzJdIDw8IDgpICsgKCh1X2NoYXIgKikocCkpWzNdKQotI2VuZGlmCi0KLS8qCi0gKiBTaWduaWZpY2FudCBvY3RldCB2YWx1ZXMuCi0gKi8KLSNkZWZpbmUJUFBQX0FMTFNUQVRJT05TCTB4ZmYJLyogQWxsLVN0YXRpb25zIGJyb2FkY2FzdCBhZGRyZXNzICovCi0jZGVmaW5lCVBQUF9VSQkJMHgwMwkvKiBVbm51bWJlcmVkIEluZm9ybWF0aW9uICovCi0jZGVmaW5lCVBQUF9GTEFHCTB4N2UJLyogRmxhZyBTZXF1ZW5jZSAqLwotI2RlZmluZQlQUFBfRVNDQVBFCTB4N2QJLyogQXN5bmNocm9ub3VzIENvbnRyb2wgRXNjYXBlICovCi0jZGVmaW5lCVBQUF9UUkFOUwkweDIwCS8qIEFzeW5jaHJvbm91cyB0cmFuc3BhcmVuY3kgbW9kaWZpZXIgKi8KLQotLyoKLSAqIFByb3RvY29sIGZpZWxkIHZhbHVlcy4KLSAqLwotI2RlZmluZSBQUFBfSVAJCTB4MjEJLyogSW50ZXJuZXQgUHJvdG9jb2wgKi8KLSNkZWZpbmUgUFBQX0FUCQkweDI5CS8qIEFwcGxlVGFsayBQcm90b2NvbCAqLwotI2RlZmluZSBQUFBfSVBYCQkweDJiCS8qIElQWCBwcm90b2NvbCAqLwotI2RlZmluZQlQUFBfVkpDX0NPTVAJMHgyZAkvKiBWSiBjb21wcmVzc2VkIFRDUCAqLwotI2RlZmluZQlQUFBfVkpDX1VOQ09NUAkweDJmCS8qIFZKIHVuY29tcHJlc3NlZCBUQ1AgKi8KLSNkZWZpbmUgUFBQX0lQVjYJMHg1NwkvKiBJbnRlcm5ldCBQcm90b2NvbCBWZXJzaW9uIDYgKi8KLSNkZWZpbmUgUFBQX0NPTVAJMHhmZAkvKiBjb21wcmVzc2VkIHBhY2tldCAqLwotI2RlZmluZSBQUFBfSVBDUAkweDgwMjEJLyogSVAgQ29udHJvbCBQcm90b2NvbCAqLwotI2RlZmluZSBQUFBfQVRDUAkweDgwMjkJLyogQXBwbGVUYWxrIENvbnRyb2wgUHJvdG9jb2wgKi8KLSNkZWZpbmUgUFBQX0lQWENQCTB4ODAyYgkvKiBJUFggQ29udHJvbCBQcm90b2NvbCAqLwotI2RlZmluZSBQUFBfSVBWNkNQCTB4ODA1NwkvKiBJUHY2IENvbnRyb2wgUHJvdG9jb2wgKi8KLSNkZWZpbmUgUFBQX0NDUAkJMHg4MGZkCS8qIENvbXByZXNzaW9uIENvbnRyb2wgUHJvdG9jb2wgKi8KLSNkZWZpbmUgUFBQX0VDUAkJMHg4MDUzCS8qIEVuY3J5cHRpb24gQ29udHJvbCBQcm90b2NvbCAqLwotI2RlZmluZSBQUFBfTENQCQkweGMwMjEJLyogTGluayBDb250cm9sIFByb3RvY29sICovCi0jZGVmaW5lIFBQUF9QQVAJCTB4YzAyMwkvKiBQYXNzd29yZCBBdXRoZW50aWNhdGlvbiBQcm90b2NvbCAqLwotI2RlZmluZSBQUFBfTFFSCQkweGMwMjUJLyogTGluayBRdWFsaXR5IFJlcG9ydCBwcm90b2NvbCAqLwotI2RlZmluZSBQUFBfQ0hBUAkweGMyMjMJLyogQ3J5cHRvZ3JhcGhpYyBIYW5kc2hha2UgQXV0aC4gUHJvdG9jb2wgKi8KLSNkZWZpbmUgUFBQX0NCQ1AJMHhjMDI5CS8qIENhbGxiYWNrIENvbnRyb2wgUHJvdG9jb2wgKi8KLSNkZWZpbmUgUFBQX0VBUAkJMHhjMjI3CS8qIEV4dGVuc2libGUgQXV0aGVudGljYXRpb24gUHJvdG9jb2wgKi8KLQotLyoKLSAqIFZhbHVlcyBmb3IgRkNTIGNhbGN1bGF0aW9ucy4KLSAqLwotI2RlZmluZSBQUFBfSU5JVEZDUwkweGZmZmYJLyogSW5pdGlhbCBGQ1MgdmFsdWUgKi8KLSNkZWZpbmUgUFBQX0dPT0RGQ1MJMHhmMGI4CS8qIEdvb2QgZmluYWwgRkNTIHZhbHVlICovCi0jZGVmaW5lIFBQUF9GQ1MoZmNzLCBjKQkoKChmY3MpID4+IDgpIF4gZmNzdGFiWygoZmNzKSBeIChjKSkgJiAweGZmXSkKLQotLyoKLSAqIEEgMzItYml0IHVuc2lnbmVkIGludGVncmFsIHR5cGUuCi0gKi8KLQotI2lmICFkZWZpbmVkKF9fQklUX1RZUEVTX0RFRklORURfXykgJiYgIWRlZmluZWQoX0JJVFlQRVMpIFwKLSAmJiAhZGVmaW5lZChfX0ZyZWVCU0RfXykgJiYgKE5TX1RBUkdFVCA8IDQwKQotI2lmZGVmCVVJTlQzMl9UCi10eXBlZGVmIFVJTlQzMl9UCXVfaW50MzJfdDsKLSNlbHNlCi10eXBlZGVmIHVuc2lnbmVkIGludAl1X2ludDMyX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1X2ludDE2X3Q7Ci0jZW5kaWYKLSNlbmRpZgotCi0vKgotICogRXh0ZW5kZWQgYXN5bmNtYXAgLSBhbGxvd3MgYW55IGNoYXJhY3RlciB0byBiZSBlc2NhcGVkLgotICovCi10eXBlZGVmIHVfaW50MzJfdAlleHRfYWNjbVs4XTsKLQotLyoKLSAqIFdoYXQgdG8gZG8gd2l0aCBuZXR3b3JrIHByb3RvY29sIChOUCkgcGFja2V0cy4KLSAqLwotI2lmIGRlZmluZWQoVVNJTkdfVUFQSSkKLQotLyogRm9yIHN0cnVjdCBpZnJlcSAqLwotI2luY2x1ZGUgPG5ldC9pZi5oPgotCi0vKiBUaGlzIHN0dWZmIGlzbid0IGluIHVhcGkuIFRPRE86IGlzIHRoZXJlIGEgbmV3ZXIgcHBwZCB0aGF0IGRvZXNuJ3QgdXNlIHRoaXM/ICovCi0jZGVmaW5lIGlmcl9fbmFtZSBiLmlmcl9pZnJuLmlmcm5fbmFtZQotI2RlZmluZSBzdGF0c19wdHIgYi5pZnJfaWZydS5pZnJ1X2RhdGEKLXN0cnVjdCBpZnBwcHN0YXRzcmVxIHsKLSAgIHN0cnVjdCBpZnJlcSBiOwotICAgc3RydWN0IHBwcF9zdGF0cyBzdGF0czsKLX07Ci0jZWxzZQotZW51bSBOUG1vZGUgewotICAgIE5QTU9ERV9QQVNTLAkJLyogcGFzcyB0aGUgcGFja2V0IHRocm91Z2ggKi8KLSAgICBOUE1PREVfRFJPUCwJCS8qIHNpbGVudGx5IGRyb3AgdGhlIHBhY2tldCAqLwotICAgIE5QTU9ERV9FUlJPUiwJCS8qIHJldHVybiBhbiBlcnJvciAqLwotICAgIE5QTU9ERV9RVUVVRQkJLyogc2F2ZSBpdCB1cCBmb3IgbGF0ZXIuICovCi19OwotCi0vKgotICogU3RhdGlzdGljcy4KLSAqLwotc3RydWN0IHBwcHN0YXQJewotICAgIHVuc2lnbmVkIGludCBwcHBfaWJ5dGVzOwkvKiBieXRlcyByZWNlaXZlZCAqLwotICAgIHVuc2lnbmVkIGludCBwcHBfaXBhY2tldHM7CS8qIHBhY2tldHMgcmVjZWl2ZWQgKi8KLSAgICB1bnNpZ25lZCBpbnQgcHBwX2llcnJvcnM7CS8qIHJlY2VpdmUgZXJyb3JzICovCi0gICAgdW5zaWduZWQgaW50IHBwcF9vYnl0ZXM7CS8qIGJ5dGVzIHNlbnQgKi8KLSAgICB1bnNpZ25lZCBpbnQgcHBwX29wYWNrZXRzOwkvKiBwYWNrZXRzIHNlbnQgKi8KLSAgICB1bnNpZ25lZCBpbnQgcHBwX29lcnJvcnM7CS8qIHRyYW5zbWl0IGVycm9ycyAqLwotfTsKLQotc3RydWN0IHZqc3RhdCB7Ci0gICAgdW5zaWduZWQgaW50IHZqc19wYWNrZXRzOwkvKiBvdXRib3VuZCBwYWNrZXRzICovCi0gICAgdW5zaWduZWQgaW50IHZqc19jb21wcmVzc2VkOyAvKiBvdXRib3VuZCBjb21wcmVzc2VkIHBhY2tldHMgKi8KLSAgICB1bnNpZ25lZCBpbnQgdmpzX3NlYXJjaGVzOwkvKiBzZWFyY2hlcyBmb3IgY29ubmVjdGlvbiBzdGF0ZSAqLwotICAgIHVuc2lnbmVkIGludCB2anNfbWlzc2VzOwkvKiB0aW1lcyBjb3VsZG4ndCBmaW5kIGNvbm4uIHN0YXRlICovCi0gICAgdW5zaWduZWQgaW50IHZqc191bmNvbXByZXNzZWRpbjsgLyogaW5ib3VuZCB1bmNvbXByZXNzZWQgcGFja2V0cyAqLwotICAgIHVuc2lnbmVkIGludCB2anNfY29tcHJlc3NlZGluOyAvKiBpbmJvdW5kIGNvbXByZXNzZWQgcGFja2V0cyAqLwotICAgIHVuc2lnbmVkIGludCB2anNfZXJyb3JpbjsJLyogaW5ib3VuZCB1bmtub3duIHR5cGUgcGFja2V0cyAqLwotICAgIHVuc2lnbmVkIGludCB2anNfdG9zc2VkOwkvKiBpbmJvdW5kIHBhY2tldHMgdG9zc2VkIGJlY2F1c2Ugb2YgZXJyb3IgKi8KLX07Ci0KLXN0cnVjdCBwcHBfc3RhdHMgewotICAgIHN0cnVjdCBwcHBzdGF0IHA7CQkvKiBiYXNpYyBQUFAgc3RhdGlzdGljcyAqLwotICAgIHN0cnVjdCB2anN0YXQgdmo7CQkvKiBWSiBoZWFkZXIgY29tcHJlc3Npb24gc3RhdGlzdGljcyAqLwotfTsKLQotc3RydWN0IGNvbXBzdGF0IHsKLSAgICB1bnNpZ25lZCBpbnQgdW5jX2J5dGVzOwkvKiB0b3RhbCB1bmNvbXByZXNzZWQgYnl0ZXMgKi8KLSAgICB1bnNpZ25lZCBpbnQgdW5jX3BhY2tldHM7CS8qIHRvdGFsIHVuY29tcHJlc3NlZCBwYWNrZXRzICovCi0gICAgdW5zaWduZWQgaW50IGNvbXBfYnl0ZXM7CS8qIGNvbXByZXNzZWQgYnl0ZXMgKi8KLSAgICB1bnNpZ25lZCBpbnQgY29tcF9wYWNrZXRzOwkvKiBjb21wcmVzc2VkIHBhY2tldHMgKi8KLSAgICB1bnNpZ25lZCBpbnQgaW5jX2J5dGVzOwkvKiBpbmNvbXByZXNzaWJsZSBieXRlcyAqLwotICAgIHVuc2lnbmVkIGludCBpbmNfcGFja2V0czsJLyogaW5jb21wcmVzc2libGUgcGFja2V0cyAqLwotICAgIHVuc2lnbmVkIGludCByYXRpbzsJCS8qIHJlY2VudCBjb21wcmVzc2lvbiByYXRpbyA8PCA4ICovCi19OwotCi1zdHJ1Y3QgcHBwX2NvbXBfc3RhdHMgewotICAgIHN0cnVjdCBjb21wc3RhdCBjOwkJLyogcGFja2V0IGNvbXByZXNzaW9uIHN0YXRpc3RpY3MgKi8KLSAgICBzdHJ1Y3QgY29tcHN0YXQgZDsJCS8qIHBhY2tldCBkZWNvbXByZXNzaW9uIHN0YXRpc3RpY3MgKi8KLX07Ci0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSByZWNvcmRzIHRoZSB0aW1lIGluIHNlY29uZHMgc2luY2UKLSAqIHRoZSBsYXN0IE5QIHBhY2tldCB3YXMgc2VudCBvciByZWNlaXZlZC4KLSAqLwotc3RydWN0IHBwcF9pZGxlIHsKLSAgICB0aW1lX3QgeG1pdF9pZGxlOwkJLyogdGltZSBzaW5jZSBsYXN0IE5QIHBhY2tldCBzZW50ICovCi0gICAgdGltZV90IHJlY3ZfaWRsZTsJCS8qIHRpbWUgc2luY2UgbGFzdCBOUCBwYWNrZXQgcmVjZWl2ZWQgKi8KLX07Ci0KLSNlbmRpZgotCi0jaWZuZGVmIF9fUAotI2lmZGVmIF9fU1REQ19fCi0jZGVmaW5lIF9fUCh4KQl4Ci0jZWxzZQotI2RlZmluZSBfX1AoeCkJKCkKLSNlbmRpZgotI2VuZGlmCi0KLSNlbmRpZiAvKiBfUFBQX0RFRlNfSF8gKi8KZGlmZiAtLWdpdCBhL3BwcGQvaW5jbHVkZS9uZXQvcHBwaW8uaCBiL3BwcGQvaW5jbHVkZS9uZXQvcHBwaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRjZmU0NC4uMDAwMDAwMAotLS0gYS9wcHBkL2luY2x1ZGUvbmV0L3BwcGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIHBwcGlvLmggLSBpb2N0bCBhbmQgb3RoZXIgbWlzYy4gZGVmaW5pdGlvbnMgZm9yIFNUUkVBTVMgbW9kdWxlcy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTQgUGF1bCBNYWNrZXJyYXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIDQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgUGF1bCBNYWNrZXJyYXMKLSAqICAgICA8cGF1bHVzQHNhbWJhLm9yZz4iLgotICoKLSAqIFRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLSAqIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotICogQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKgotICogJElkOiBwcHBpby5oLHYgMS45IDIwMDIvMTIvMDYgMDk6NDk6MTUgcGF1bHVzIEV4cCAkCi0gKi8KLQotI2RlZmluZSBfUFBQSU8obikJKCgncCcgPDwgOCkgKyAobikpCi0KLSNkZWZpbmUgUFBQSU9fTkVXUFBBCV9QUFBJTygxMzApCS8qIGFsbG9jYXRlIGEgbmV3IFBQUCB1bml0ICovCi0jZGVmaW5lIFBQUElPX0dFVFNUQVQJX1BQUElPKDEzMSkJLyogZ2V0IFBQUCBzdGF0aXN0aWNzICovCi0jZGVmaW5lIFBQUElPX0dFVENTVEFUCV9QUFBJTygxMzIpCS8qIGdldCBQUFAgY29tcHJlc3Npb24gc3RhdHMgKi8KLSNkZWZpbmUgUFBQSU9fTVRVCV9QUFBJTygxMzMpCS8qIHNldCBtYXggdHJhbnNtaXNzaW9uIHVuaXQgKi8KLSNkZWZpbmUgUFBQSU9fTVJVCV9QUFBJTygxMzQpCS8qIHNldCBtYXggcmVjZWl2ZSB1bml0ICovCi0jZGVmaW5lIFBQUElPX0NGTEFHUwlfUFBQSU8oMTM1KQkvKiBzZXQvY2xlYXIvZ2V0IGNvbXByZXNzaW9uIGZsYWdzICovCi0jZGVmaW5lIFBQUElPX1hDT01QCV9QUFBJTygxMzYpCS8qIGFsbG9jIHRyYW5zbWl0IGNvbXByZXNzb3IgKi8KLSNkZWZpbmUgUFBQSU9fUkNPTVAJX1BQUElPKDEzNykJLyogYWxsb2MgcmVjZWl2ZSBkZWNvbXByZXNzb3IgKi8KLSNkZWZpbmUgUFBQSU9fWEFDQ00JX1BQUElPKDEzOCkJLyogc2V0IHRyYW5zbWl0IGFzeW5jbWFwICovCi0jZGVmaW5lIFBQUElPX1JBQ0NNCV9QUFBJTygxMzkpCS8qIHNldCByZWNlaXZlIGFzeW5jbWFwICovCi0jZGVmaW5lIFBQUElPX1ZKSU5JVAlfUFBQSU8oMTQwKQkvKiBpbml0aWFsaXplIFZKIGNvbXAvZGVjb21wICovCi0jZGVmaW5lIFBQUElPX0FUVEFDSAlfUFBQSU8oMTQxKQkvKiBhdHRhY2ggdG8gYSBwcGEgKHdpdGhvdXQgcHV0bXNnKSAqLwotI2RlZmluZSBQUFBJT19MQVNUTU9ECV9QUFBJTygxNDIpCS8qIG1hcmsgbGFzdCBwcHAgbW9kdWxlICovCi0jZGVmaW5lIFBQUElPX0dDTEVBTglfUFBQSU8oMTQzKQkvKiBnZXQgOC1iaXQtY2xlYW4gZmxhZ3MgKi8KLSNkZWZpbmUgUFBQSU9fREVCVUcJX1BQUElPKDE0NCkJLyogcmVxdWVzdCBkZWJ1ZyBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBQUFBJT19CSU5ECV9QUFBJTygxNDUpCS8qIGJpbmQgdG8gU0FQICovCi0jZGVmaW5lIFBQUElPX05QTU9ERQlfUFBQSU8oMTQ2KQkvKiBzZXQgbW9kZSBmb3IgaGFuZGxpbmcgZGF0YSBwa3RzICovCi0jZGVmaW5lIFBQUElPX0dJRExFCV9QUFBJTygxNDcpCS8qIGdldCB0aW1lIHNpbmNlIGxhc3QgZGF0YSBwa3QgKi8KLSNkZWZpbmUgUFBQSU9fUEFTU0ZJTFQJX1BQUElPKDE0OCkJLyogc2V0IGZpbHRlciBmb3IgcGFja2V0cyB0byBwYXNzICovCi0jZGVmaW5lIFBQUElPX0FDVElWRUZJTFQgX1BQUElPKDE0OSkJLyogc2V0IGZpbHRlciBmb3IgImxpbmsgYWN0aXZlIiBwa3RzICovCi0KLS8qCi0gKiBWYWx1ZXMgZm9yIFBQUElPX0NGTEFHUwotICovCi0jZGVmaW5lIENPTVBfQUMJCTB4MQkJLyogY29tcHJlc3MgYWRkcmVzcy9jb250cm9sICovCi0jZGVmaW5lIERFQ09NUF9BQwkweDIJCS8qIGRlY29tcHJlc3MgYWRkcmVzcy9jb250cm9sICovCi0jZGVmaW5lIENPTVBfUFJPVAkweDQJCS8qIGNvbXByZXNzIFBQUCBwcm90b2NvbCAqLwotI2RlZmluZSBERUNPTVBfUFJPVAkweDgJCS8qIGRlY29tcHJlc3MgUFBQIHByb3RvY29sICovCi0KLSNkZWZpbmUgQ09NUF9WSkMJMHgxMAkJLyogY29tcHJlc3MgVENQL0lQIGhlYWRlcnMgKi8KLSNkZWZpbmUgQ09NUF9WSkNDSUQJMHgyMAkJLyogY29tcHJlc3MgY29ubmVjdGlvbiBJRCBhcyB3ZWxsICovCi0jZGVmaW5lIERFQ09NUF9WSkMJMHg0MAkJLyogZGVjb21wcmVzcyBUQ1AvSVAgaGVhZGVycyAqLwotI2RlZmluZSBERUNPTVBfVkpDQ0lECTB4ODAJCS8qIGFjY2VwdCBjb21wcmVzc2VkIGNvbm5lY3Rpb24gSUQgKi8KLQotI2RlZmluZSBDQ1BfSVNPUEVOCTB4MTAwCQkvKiBsb29rIGF0IENDUCBwYWNrZXRzICovCi0jZGVmaW5lIENDUF9JU1VQCTB4MjAwCQkvKiBkbyBwYWNrZXQgY29tcC9kZWNvbXAgKi8KLSNkZWZpbmUgQ0NQX0VSUk9SCTB4NDAwCQkvKiAoc3RhdHVzKSBlcnJvciBpbiBwYWNrZXQgZGVjb21wICovCi0jZGVmaW5lIENDUF9GQVRBTEVSUk9SCTB4ODAwCQkvKiAoc3RhdHVzKSBmYXRhbCBlcnJvciBkaXR0byAqLwotI2RlZmluZSBDQ1BfQ09NUF9SVU4JMHgxMDAwCQkvKiAoc3RhdHVzKSBzZWVuIENDUCBhY2sgc2VudCAqLwotI2RlZmluZSBDQ1BfREVDT01QX1JVTgkweDIwMDAJCS8qIChzdGF0dXMpIHNlZW4gQ0NQIGFjayByY3ZkICovCi0KLS8qCi0gKiBWYWx1ZXMgZm9yIDgtYml0LWNsZWFuIGZsYWdzLgotICovCi0jZGVmaW5lIFJDVl9CN18wCTEJCS8qIGhhdmUgcmN2ZCBjaGFyIHdpdGggYml0IDcgPSAwICovCi0jZGVmaW5lIFJDVl9CN18xCTIJCS8qIGhhdmUgcmN2ZCBjaGFyIHdpdGggYml0IDcgPSAxICovCi0jZGVmaW5lIFJDVl9FVk5QCTQJCS8qIGhhdmUgcmN2ZCBjaGFyIHdpdGggZXZlbiBwYXJpdHkgKi8KLSNkZWZpbmUgUkNWX09ERFAJOAkJLyogaGF2ZSByY3ZkIGNoYXIgd2l0aCBvZGQgcGFyaXR5ICovCi0KLS8qCi0gKiBWYWx1ZXMgZm9yIHRoZSBmaXJzdCBieXRlIG9mIE1fQ1RMIG1lc3NhZ2VzIHBhc3NlZCBiZXR3ZWVuCi0gKiBQUFAgbW9kdWxlcy4KLSAqLwotI2RlZmluZSBQUFBDVExfT0VSUk9SCTB4ZTAJCS8qIG91dHB1dCBlcnJvciBbdXBdICovCi0jZGVmaW5lIFBQUENUTF9JRVJST1IJMHhlMQkJLyogaW5wdXQgZXJyb3IgKGUuZy4gRkNTKSBbdXBdICovCi0jZGVmaW5lIFBQUENUTF9NVFUJMHhlMgkJLyogc2V0IE1UVSBbZG93bl0gKi8KLSNkZWZpbmUgUFBQQ1RMX01SVQkweGUzCQkvKiBzZXQgTVJVIFtkb3duXSAqLwotI2RlZmluZSBQUFBDVExfVU5JVAkweGU0CQkvKiBub3RlIFBQUCB1bml0IG51bWJlciBbZG93bl0gKi8KLQotLyoKLSAqIFZhbHVlcyBmb3IgdGhlIGludGVnZXIgYXJndW1lbnQgdG8gUFBQSU9fREVCVUcuCi0gKi8KLSNkZWZpbmUgUFBQREJHX0RVTVAJMHgxMDAwMAkJLyogcHJpbnQgb3V0IGRlYnVnIGluZm8gbm93ICovCi0jZGVmaW5lIFBQUERCR19MT0cJMHgxMDAJCS8qIGxvZyB2YXJpb3VzIHRoaW5ncyAqLwotI2RlZmluZSBQUFBEQkdfRFJJVkVSCTAJCS8qIGlkZW50aWZpZXMgcHBwIGRyaXZlciBhcyB0YXJnZXQgKi8KLSNkZWZpbmUgUFBQREJHX0lGCTEJCS8qIGlkZW50aWZpZXMgcHBwIG5ldHdvcmsgaS9mIHRhcmdldCAqLwotI2RlZmluZSBQUFBEQkdfQ09NUAkyCQkvKiBpZGVudGlmaWVzIHBwcCBjb21wcmVzc2lvbiB0YXJnZXQgKi8KLSNkZWZpbmUgUFBQREJHX0FIRExDCTMJCS8qIGlkZW50aWZpZXMgcHBwIGFzeW5jIGhkbGMgdGFyZ2V0ICovCmRpZmYgLS1naXQgYS9wcHBkL2luY2x1ZGUvbmV0L3NsY29tcHJlc3MuaCBiL3BwcGQvaW5jbHVkZS9uZXQvc2xjb21wcmVzcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODg3ZGZjLi4wMDAwMDAwCi0tLSBhL3BwcGQvaW5jbHVkZS9uZXQvc2xjb21wcmVzcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qCi0gKiBEZWZpbml0aW9ucyBmb3IgdGNwIGNvbXByZXNzaW9uIHJvdXRpbmVzLgotICoKLSAqICRJZDogc2xjb21wcmVzcy5oLHYgMS40IDE5OTQvMDkvMjEgMDY6NTA6MDggcGF1bHVzIEV4cCAkCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTg5IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcmUKLSAqIGR1cGxpY2F0ZWQgaW4gYWxsIHN1Y2ggZm9ybXMgYW5kIHRoYXQgYW55IGRvY3VtZW50YXRpb24sCi0gKiBhZHZlcnRpc2luZyBtYXRlcmlhbHMsIGFuZCBvdGhlciBtYXRlcmlhbHMgcmVsYXRlZCB0byBzdWNoCi0gKiBkaXN0cmlidXRpb24gYW5kIHVzZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkCi0gKiBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleS4gIFRoZSBuYW1lIG9mIHRoZQotICogVW5pdmVyc2l0eSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqCVZhbiBKYWNvYnNvbiAodmFuQGhlbGlvcy5lZS5sYmwuZ292KSwgRGVjIDMxLCAxOTg5OgotICoJLSBJbml0aWFsIGRpc3RyaWJ1dGlvbi4KLSAqLwotCi0jaWZuZGVmIF9TTENPTVBSRVNTX0hfCi0jZGVmaW5lIF9TTENPTVBSRVNTX0hfCi0KLSNkZWZpbmUgTUFYX1NUQVRFUyAxNgkJLyogbXVzdCBiZSA+IDIgYW5kIDwgMjU2ICovCi0jZGVmaW5lIE1BWF9IRFIgTUxFTgkJLyogWFhYIDRic2QtaXNtOiBzaG91bGQgcmVhbGx5IGJlIDEyOCAqLwotCi0vKgotICogQ29tcHJlc3NlZCBwYWNrZXQgZm9ybWF0OgotICoKLSAqIFRoZSBmaXJzdCBvY3RldCBjb250YWlucyB0aGUgcGFja2V0IHR5cGUgKHRvcCAzIGJpdHMpLCBUQ1AKLSAqICdwdXNoJyBiaXQsIGFuZCBmbGFncyB0aGF0IGluZGljYXRlIHdoaWNoIG9mIHRoZSA0IFRDUCBzZXF1ZW5jZQotICogbnVtYmVycyBoYXZlIGNoYW5nZWQgKGJvdHRvbSA1IGJpdHMpLiAgVGhlIG5leHQgb2N0ZXQgaXMgYQotICogY29udmVyc2F0aW9uIG51bWJlciB0aGF0IGFzc29jaWF0ZXMgYSBzYXZlZCBJUC9UQ1AgaGVhZGVyIHdpdGgKLSAqIHRoZSBjb21wcmVzc2VkIHBhY2tldC4gIFRoZSBuZXh0IHR3byBvY3RldHMgYXJlIHRoZSBUQ1AgY2hlY2tzdW0KLSAqIGZyb20gdGhlIG9yaWdpbmFsIGRhdGFncmFtLiAgVGhlIG5leHQgMCB0byAxNSBvY3RldHMgYXJlCi0gKiBzZXF1ZW5jZSBudW1iZXIgY2hhbmdlcywgb25lIGNoYW5nZSBwZXIgYml0IHNldCBpbiB0aGUgaGVhZGVyCi0gKiAodGhlcmUgbWF5IGJlIG5vIGNoYW5nZXMgYW5kIHRoZXJlIGFyZSB0d28gc3BlY2lhbCBjYXNlcyB3aGVyZQotICogdGhlIHJlY2VpdmVyIGltcGxpY2l0bHkga25vd3Mgd2hhdCBjaGFuZ2VkIC0tIHNlZSBiZWxvdykuCi0gKiAKLSAqIFRoZXJlIGFyZSA1IG51bWJlcnMgd2hpY2ggY2FuIGNoYW5nZSAodGhleSBhcmUgYWx3YXlzIGluc2VydGVkCi0gKiBpbiB0aGUgZm9sbG93aW5nIG9yZGVyKTogVENQIHVyZ2VudCBwb2ludGVyLCB3aW5kb3csCi0gKiBhY2tub3dsZWdlbWVudCwgc2VxdWVuY2UgbnVtYmVyIGFuZCBJUCBJRC4gIChUaGUgdXJnZW50IHBvaW50ZXIKLSAqIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvdGhlcnMgaW4gdGhhdCBpdHMgdmFsdWUgaXMgc2VudCwgbm90IHRoZQotICogY2hhbmdlIGluIHZhbHVlLikgIFNpbmNlIHR5cGljYWwgdXNlIG9mIFNMSVAgbGlua3MgaXMgYmlhc2VkCi0gKiB0b3dhcmQgc21hbGwgcGFja2V0cyAoc2VlIGNvbW1lbnRzIG9uIE1UVS9NU1MgYmVsb3cpLCBjaGFuZ2VzCi0gKiB1c2UgYSB2YXJpYWJsZSBsZW5ndGggY29kaW5nIHdpdGggb25lIG9jdGV0IGZvciBudW1iZXJzIGluIHRoZQotICogcmFuZ2UgMSAtIDI1NSBhbmQgMyBvY3RldHMgKDAsIE1TQiwgTFNCKSBmb3IgbnVtYmVycyBpbiB0aGUKLSAqIHJhbmdlIDI1NiAtIDY1NTM1IG9yIDAuICAoSWYgdGhlIGNoYW5nZSBpbiBzZXF1ZW5jZSBudW1iZXIgb3IKLSAqIGFjayBpcyBtb3JlIHRoYW4gNjU1MzUsIGFuIHVuY29tcHJlc3NlZCBwYWNrZXQgaXMgc2VudC4pCi0gKi8KLQotLyoKLSAqIFBhY2tldCB0eXBlcyAobXVzdCBub3QgY29uZmxpY3Qgd2l0aCBJUCBwcm90b2NvbCB2ZXJzaW9uKQotICoKLSAqIFRoZSB0b3AgbmliYmxlIG9mIHRoZSBmaXJzdCBvY3RldCBpcyB0aGUgcGFja2V0IHR5cGUuICBUaGVyZSBhcmUKLSAqIHRocmVlIHBvc3NpYmxlIHR5cGVzOiBJUCAobm90IHByb3RvIFRDUCBvciB0Y3Agd2l0aCBvbmUgb2YgdGhlCi0gKiBjb250cm9sIGZsYWdzIHNldCk7IHVuY29tcHJlc3NlZCBUQ1AgKGEgbm9ybWFsIElQL1RDUCBwYWNrZXQgYnV0Ci0gKiB3aXRoIHRoZSA4LWJpdCBwcm90b2NvbCBmaWVsZCByZXBsYWNlZCBieSBhbiA4LWJpdCBjb25uZWN0aW9uIGlkIC0tCi0gKiB0aGlzIHR5cGUgb2YgcGFja2V0IHN5bmNzIHRoZSBzZW5kZXIgJiByZWNlaXZlcik7IGFuZCBjb21wcmVzc2VkCi0gKiBUQ1AgKGRlc2NyaWJlZCBhYm92ZSkuCi0gKgotICogTFNCIG9mIDQtYml0IGZpZWxkIGlzIFRDUCAiUFVTSCIgYml0IChhIHdvcnRobGVzcyBhbmFjaHJvbmlzbSkgYW5kCi0gKiBpcyBsb2dpY2FsbHkgcGFydCBvZiB0aGUgNC1iaXQgImNoYW5nZXMiIGZpZWxkIHRoYXQgZm9sbG93cy4gIFRvcAotICogdGhyZWUgYml0cyBhcmUgYWN0dWFsIHBhY2tldCB0eXBlLiAgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLSAqIGFuZCBpbiB0aGUgaW50ZXJlc3Qgb2YgY29uc2VydmluZyBiaXRzLCBudW1iZXJzIGFyZSBjaG9zZW4gc28gdGhlCi0gKiBJUCBwcm90b2NvbCB2ZXJzaW9uIG51bWJlciAoNCkgd2hpY2ggbm9ybWFsbHkgYXBwZWFycyBpbiB0aGlzIG5pYmJsZQotICogbWVhbnMgIklQIHBhY2tldCIuCi0gKi8KLQotLyogcGFja2V0IHR5cGVzICovCi0jZGVmaW5lIFRZUEVfSVAgMHg0MAotI2RlZmluZSBUWVBFX1VOQ09NUFJFU1NFRF9UQ1AgMHg3MAotI2RlZmluZSBUWVBFX0NPTVBSRVNTRURfVENQIDB4ODAKLSNkZWZpbmUgVFlQRV9FUlJPUiAweDAwCi0KLS8qIEJpdHMgaW4gZmlyc3Qgb2N0ZXQgb2YgY29tcHJlc3NlZCBwYWNrZXQgKi8KLSNkZWZpbmUgTkVXX0MJMHg0MAkvKiBmbGFnIGJpdHMgZm9yIHdoYXQgY2hhbmdlZCBpbiBhIHBhY2tldCAqLwotI2RlZmluZSBORVdfSQkweDIwCi0jZGVmaW5lIE5FV19TCTB4MDgKLSNkZWZpbmUgTkVXX0EJMHgwNAotI2RlZmluZSBORVdfVwkweDAyCi0jZGVmaW5lIE5FV19VCTB4MDEKLQotLyogcmVzZXJ2ZWQsIHNwZWNpYWwtY2FzZSB2YWx1ZXMgb2YgYWJvdmUgKi8KLSNkZWZpbmUgU1BFQ0lBTF9JIChORVdfU3xORVdfV3xORVdfVSkJCS8qIGVjaG9lZCBpbnRlcmFjdGl2ZSB0cmFmZmljICovCi0jZGVmaW5lIFNQRUNJQUxfRCAoTkVXX1N8TkVXX0F8TkVXX1d8TkVXX1UpCS8qIHVuaWRpcmVjdGlvbmFsIGRhdGEgKi8KLSNkZWZpbmUgU1BFQ0lBTFNfTUFTSyAoTkVXX1N8TkVXX0F8TkVXX1d8TkVXX1UpCi0KLSNkZWZpbmUgVENQX1BVU0hfQklUIDB4MTAKLQotCi0vKgotICogInN0YXRlIiBkYXRhIGZvciBlYWNoIGFjdGl2ZSB0Y3AgY29udmVyc2F0aW9uIG9uIHRoZSB3aXJlLiAgVGhpcyBpcwotICogYmFzaWNhbGx5IGEgY29weSBvZiB0aGUgZW50aXJlIElQL1RDUCBoZWFkZXIgZnJvbSB0aGUgbGFzdCBwYWNrZXQKLSAqIHdlIHNhdyBmcm9tIHRoZSBjb252ZXJzYXRpb24gdG9nZXRoZXIgd2l0aCBhIHNtYWxsIGlkZW50aWZpZXIKLSAqIHRoZSB0cmFuc21pdCAmIHJlY2VpdmUgZW5kcyBvZiB0aGUgbGluZSB1c2UgdG8gbG9jYXRlIHNhdmVkIGhlYWRlci4KLSAqLwotc3RydWN0IGNzdGF0ZSB7Ci0Jc3RydWN0IGNzdGF0ZSAqY3NfbmV4dDsJLyogbmV4dCBtb3N0IHJlY2VudGx5IHVzZWQgY3N0YXRlICh4bWl0IG9ubHkpICovCi0JdV9zaG9ydCBjc19obGVuOwkvKiBzaXplIG9mIGhkciAocmVjZWl2ZSBvbmx5KSAqLwotCXVfY2hhciBjc19pZDsJCS8qIGNvbm5lY3Rpb24gIyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdGF0ZSAqLwotCXVfY2hhciBjc19maWxsZXI7Ci0JdW5pb24gewotCQljaGFyIGNzdV9oZHJbTUFYX0hEUl07Ci0JCXN0cnVjdCBpcCBjc3VfaXA7CS8qIGlwL3RjcCBoZHIgZnJvbSBtb3N0IHJlY2VudCBwYWNrZXQgKi8KLQl9IHNsY3NfdTsKLX07Ci0jZGVmaW5lIGNzX2lwIHNsY3NfdS5jc3VfaXAKLSNkZWZpbmUgY3NfaGRyIHNsY3NfdS5jc3VfaGRyCi0KLS8qCi0gKiBhbGwgdGhlIHN0YXRlIGRhdGEgZm9yIG9uZSBzZXJpYWwgbGluZSAod2UgbmVlZCBvbmUgb2YgdGhlc2UKLSAqIHBlciBsaW5lKS4KLSAqLwotc3RydWN0IHNsY29tcHJlc3MgewotCXN0cnVjdCBjc3RhdGUgKmxhc3RfY3M7CS8qIG1vc3QgcmVjZW50bHkgdXNlZCB0c3RhdGUgKi8KLQl1X2NoYXIgbGFzdF9yZWN2OwkvKiBsYXN0IHJjdmQgY29ubi4gaWQgKi8KLQl1X2NoYXIgbGFzdF94bWl0OwkvKiBsYXN0IHNlbnQgY29ubi4gaWQgKi8KLQl1X3Nob3J0IGZsYWdzOwotI2lmbmRlZiBTTF9OT19TVEFUUwotCWludCBzbHNfcGFja2V0czsJLyogb3V0Ym91bmQgcGFja2V0cyAqLwotCWludCBzbHNfY29tcHJlc3NlZDsJLyogb3V0Ym91bmQgY29tcHJlc3NlZCBwYWNrZXRzICovCi0JaW50IHNsc19zZWFyY2hlczsJLyogc2VhcmNoZXMgZm9yIGNvbm5lY3Rpb24gc3RhdGUgKi8KLQlpbnQgc2xzX21pc3NlczsJCS8qIHRpbWVzIGNvdWxkbid0IGZpbmQgY29ubi4gc3RhdGUgKi8KLQlpbnQgc2xzX3VuY29tcHJlc3NlZGluOwkvKiBpbmJvdW5kIHVuY29tcHJlc3NlZCBwYWNrZXRzICovCi0JaW50IHNsc19jb21wcmVzc2VkaW47CS8qIGluYm91bmQgY29tcHJlc3NlZCBwYWNrZXRzICovCi0JaW50IHNsc19lcnJvcmluOwkvKiBpbmJvdW5kIHVua25vd24gdHlwZSBwYWNrZXRzICovCi0JaW50IHNsc190b3NzZWQ7CQkvKiBpbmJvdW5kIHBhY2tldHMgdG9zc2VkIGJlY2F1c2Ugb2YgZXJyb3IgKi8KLSNlbmRpZgotCXN0cnVjdCBjc3RhdGUgdHN0YXRlW01BWF9TVEFURVNdOwkvKiB4bWl0IGNvbm5lY3Rpb24gc3RhdGVzICovCi0Jc3RydWN0IGNzdGF0ZSByc3RhdGVbTUFYX1NUQVRFU107CS8qIHJlY2VpdmUgY29ubmVjdGlvbiBzdGF0ZXMgKi8KLX07Ci0vKiBmbGFnIHZhbHVlcyAqLwotI2RlZmluZSBTTEZfVE9TUyAxCQkvKiB0b3NzaW5nIHJjdmQgZnJhbWVzIGJlY2F1c2Ugb2YgaW5wdXQgZXJyICovCi0KLXZvaWQJc2xfY29tcHJlc3NfaW5pdCBfX1AoKHN0cnVjdCBzbGNvbXByZXNzICopKTsKLXZvaWQJc2xfY29tcHJlc3Nfc2V0dXAgX19QKChzdHJ1Y3Qgc2xjb21wcmVzcyAqLCBpbnQpKTsKLXVfaW50CXNsX2NvbXByZXNzX3RjcCBfX1AoKHN0cnVjdCBtYnVmICosCi0JICAgIHN0cnVjdCBpcCAqLCBzdHJ1Y3Qgc2xjb21wcmVzcyAqLCBpbnQpKTsKLWludAlzbF91bmNvbXByZXNzX3RjcCBfX1AoKHVfY2hhciAqKiwgaW50LCB1X2ludCwgc3RydWN0IHNsY29tcHJlc3MgKikpOwotaW50CXNsX3VuY29tcHJlc3NfdGNwX2NvcmUgX19QKCh1X2NoYXIgKiwgaW50LCBpbnQsIHVfaW50LAotCSAgICBzdHJ1Y3Qgc2xjb21wcmVzcyAqLCB1X2NoYXIgKiosIHVfaW50ICopKTsKLQotI2VuZGlmIC8qIF9TTENPTVBSRVNTX0hfICovCmRpZmYgLS1naXQgYS9wcHBkL2luY2x1ZGUvbmV0L3ZqY29tcHJlc3MuaCBiL3BwcGQvaW5jbHVkZS9uZXQvdmpjb21wcmVzcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2EzM2JmLi4wMDAwMDAwCi0tLSBhL3BwcGQvaW5jbHVkZS9uZXQvdmpjb21wcmVzcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiBEZWZpbml0aW9ucyBmb3IgdGNwIGNvbXByZXNzaW9uIHJvdXRpbmVzLgotICoKLSAqICRJZDogdmpjb21wcmVzcy5oLHYgMS4zIDE5OTYvMDUvMjggMDA6NTU6MzMgcGF1bHVzIEV4cCAkCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTg5IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcmUKLSAqIGR1cGxpY2F0ZWQgaW4gYWxsIHN1Y2ggZm9ybXMgYW5kIHRoYXQgYW55IGRvY3VtZW50YXRpb24sCi0gKiBhZHZlcnRpc2luZyBtYXRlcmlhbHMsIGFuZCBvdGhlciBtYXRlcmlhbHMgcmVsYXRlZCB0byBzdWNoCi0gKiBkaXN0cmlidXRpb24gYW5kIHVzZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkCi0gKiBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleS4gIFRoZSBuYW1lIG9mIHRoZQotICogVW5pdmVyc2l0eSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqCVZhbiBKYWNvYnNvbiAodmFuQGhlbGlvcy5lZS5sYmwuZ292KSwgRGVjIDMxLCAxOTg5OgotICoJLSBJbml0aWFsIGRpc3RyaWJ1dGlvbi4KLSAqLwotCi0jaWZuZGVmIF9WSkNPTVBSRVNTX0hfCi0jZGVmaW5lIF9WSkNPTVBSRVNTX0hfCi0KLSNkZWZpbmUgTUFYX1NUQVRFUyAxNgkJLyogbXVzdCBiZSA+IDIgYW5kIDwgMjU2ICovCi0jZGVmaW5lIE1BWF9IRFIJICAgMTI4Ci0KLS8qCi0gKiBDb21wcmVzc2VkIHBhY2tldCBmb3JtYXQ6Ci0gKgotICogVGhlIGZpcnN0IG9jdGV0IGNvbnRhaW5zIHRoZSBwYWNrZXQgdHlwZSAodG9wIDMgYml0cyksIFRDUAotICogJ3B1c2gnIGJpdCwgYW5kIGZsYWdzIHRoYXQgaW5kaWNhdGUgd2hpY2ggb2YgdGhlIDQgVENQIHNlcXVlbmNlCi0gKiBudW1iZXJzIGhhdmUgY2hhbmdlZCAoYm90dG9tIDUgYml0cykuICBUaGUgbmV4dCBvY3RldCBpcyBhCi0gKiBjb252ZXJzYXRpb24gbnVtYmVyIHRoYXQgYXNzb2NpYXRlcyBhIHNhdmVkIElQL1RDUCBoZWFkZXIgd2l0aAotICogdGhlIGNvbXByZXNzZWQgcGFja2V0LiAgVGhlIG5leHQgdHdvIG9jdGV0cyBhcmUgdGhlIFRDUCBjaGVja3N1bQotICogZnJvbSB0aGUgb3JpZ2luYWwgZGF0YWdyYW0uICBUaGUgbmV4dCAwIHRvIDE1IG9jdGV0cyBhcmUKLSAqIHNlcXVlbmNlIG51bWJlciBjaGFuZ2VzLCBvbmUgY2hhbmdlIHBlciBiaXQgc2V0IGluIHRoZSBoZWFkZXIKLSAqICh0aGVyZSBtYXkgYmUgbm8gY2hhbmdlcyBhbmQgdGhlcmUgYXJlIHR3byBzcGVjaWFsIGNhc2VzIHdoZXJlCi0gKiB0aGUgcmVjZWl2ZXIgaW1wbGljaXRseSBrbm93cyB3aGF0IGNoYW5nZWQgLS0gc2VlIGJlbG93KS4KLSAqIAotICogVGhlcmUgYXJlIDUgbnVtYmVycyB3aGljaCBjYW4gY2hhbmdlICh0aGV5IGFyZSBhbHdheXMgaW5zZXJ0ZWQKLSAqIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIpOiBUQ1AgdXJnZW50IHBvaW50ZXIsIHdpbmRvdywKLSAqIGFja25vd2xlZ2VtZW50LCBzZXF1ZW5jZSBudW1iZXIgYW5kIElQIElELiAgKFRoZSB1cmdlbnQgcG9pbnRlcgotICogaXMgZGlmZmVyZW50IGZyb20gdGhlIG90aGVycyBpbiB0aGF0IGl0cyB2YWx1ZSBpcyBzZW50LCBub3QgdGhlCi0gKiBjaGFuZ2UgaW4gdmFsdWUuKSAgU2luY2UgdHlwaWNhbCB1c2Ugb2YgU0xJUCBsaW5rcyBpcyBiaWFzZWQKLSAqIHRvd2FyZCBzbWFsbCBwYWNrZXRzIChzZWUgY29tbWVudHMgb24gTVRVL01TUyBiZWxvdyksIGNoYW5nZXMKLSAqIHVzZSBhIHZhcmlhYmxlIGxlbmd0aCBjb2Rpbmcgd2l0aCBvbmUgb2N0ZXQgZm9yIG51bWJlcnMgaW4gdGhlCi0gKiByYW5nZSAxIC0gMjU1IGFuZCAzIG9jdGV0cyAoMCwgTVNCLCBMU0IpIGZvciBudW1iZXJzIGluIHRoZQotICogcmFuZ2UgMjU2IC0gNjU1MzUgb3IgMC4gIChJZiB0aGUgY2hhbmdlIGluIHNlcXVlbmNlIG51bWJlciBvcgotICogYWNrIGlzIG1vcmUgdGhhbiA2NTUzNSwgYW4gdW5jb21wcmVzc2VkIHBhY2tldCBpcyBzZW50LikKLSAqLwotCi0vKgotICogUGFja2V0IHR5cGVzIChtdXN0IG5vdCBjb25mbGljdCB3aXRoIElQIHByb3RvY29sIHZlcnNpb24pCi0gKgotICogVGhlIHRvcCBuaWJibGUgb2YgdGhlIGZpcnN0IG9jdGV0IGlzIHRoZSBwYWNrZXQgdHlwZS4gIFRoZXJlIGFyZQotICogdGhyZWUgcG9zc2libGUgdHlwZXM6IElQIChub3QgcHJvdG8gVENQIG9yIHRjcCB3aXRoIG9uZSBvZiB0aGUKLSAqIGNvbnRyb2wgZmxhZ3Mgc2V0KTsgdW5jb21wcmVzc2VkIFRDUCAoYSBub3JtYWwgSVAvVENQIHBhY2tldCBidXQKLSAqIHdpdGggdGhlIDgtYml0IHByb3RvY29sIGZpZWxkIHJlcGxhY2VkIGJ5IGFuIDgtYml0IGNvbm5lY3Rpb24gaWQgLS0KLSAqIHRoaXMgdHlwZSBvZiBwYWNrZXQgc3luY3MgdGhlIHNlbmRlciAmIHJlY2VpdmVyKTsgYW5kIGNvbXByZXNzZWQKLSAqIFRDUCAoZGVzY3JpYmVkIGFib3ZlKS4KLSAqCi0gKiBMU0Igb2YgNC1iaXQgZmllbGQgaXMgVENQICJQVVNIIiBiaXQgKGEgd29ydGhsZXNzIGFuYWNocm9uaXNtKSBhbmQKLSAqIGlzIGxvZ2ljYWxseSBwYXJ0IG9mIHRoZSA0LWJpdCAiY2hhbmdlcyIgZmllbGQgdGhhdCBmb2xsb3dzLiAgVG9wCi0gKiB0aHJlZSBiaXRzIGFyZSBhY3R1YWwgcGFja2V0IHR5cGUuICBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotICogYW5kIGluIHRoZSBpbnRlcmVzdCBvZiBjb25zZXJ2aW5nIGJpdHMsIG51bWJlcnMgYXJlIGNob3NlbiBzbyB0aGUKLSAqIElQIHByb3RvY29sIHZlcnNpb24gbnVtYmVyICg0KSB3aGljaCBub3JtYWxseSBhcHBlYXJzIGluIHRoaXMgbmliYmxlCi0gKiBtZWFucyAiSVAgcGFja2V0Ii4KLSAqLwotCi0vKiBwYWNrZXQgdHlwZXMgKi8KLSNkZWZpbmUgVFlQRV9JUCAweDQwCi0jZGVmaW5lIFRZUEVfVU5DT01QUkVTU0VEX1RDUCAweDcwCi0jZGVmaW5lIFRZUEVfQ09NUFJFU1NFRF9UQ1AgMHg4MAotI2RlZmluZSBUWVBFX0VSUk9SIDB4MDAKLQotLyogQml0cyBpbiBmaXJzdCBvY3RldCBvZiBjb21wcmVzc2VkIHBhY2tldCAqLwotI2RlZmluZSBORVdfQwkweDQwCS8qIGZsYWcgYml0cyBmb3Igd2hhdCBjaGFuZ2VkIGluIGEgcGFja2V0ICovCi0jZGVmaW5lIE5FV19JCTB4MjAKLSNkZWZpbmUgTkVXX1MJMHgwOAotI2RlZmluZSBORVdfQQkweDA0Ci0jZGVmaW5lIE5FV19XCTB4MDIKLSNkZWZpbmUgTkVXX1UJMHgwMQotCi0vKiByZXNlcnZlZCwgc3BlY2lhbC1jYXNlIHZhbHVlcyBvZiBhYm92ZSAqLwotI2RlZmluZSBTUEVDSUFMX0kgKE5FV19TfE5FV19XfE5FV19VKQkJLyogZWNob2VkIGludGVyYWN0aXZlIHRyYWZmaWMgKi8KLSNkZWZpbmUgU1BFQ0lBTF9EIChORVdfU3xORVdfQXxORVdfV3xORVdfVSkJLyogdW5pZGlyZWN0aW9uYWwgZGF0YSAqLwotI2RlZmluZSBTUEVDSUFMU19NQVNLIChORVdfU3xORVdfQXxORVdfV3xORVdfVSkKLQotI2RlZmluZSBUQ1BfUFVTSF9CSVQgMHgxMAotCi0KLS8qCi0gKiAic3RhdGUiIGRhdGEgZm9yIGVhY2ggYWN0aXZlIHRjcCBjb252ZXJzYXRpb24gb24gdGhlIHdpcmUuICBUaGlzIGlzCi0gKiBiYXNpY2FsbHkgYSBjb3B5IG9mIHRoZSBlbnRpcmUgSVAvVENQIGhlYWRlciBmcm9tIHRoZSBsYXN0IHBhY2tldAotICogd2Ugc2F3IGZyb20gdGhlIGNvbnZlcnNhdGlvbiB0b2dldGhlciB3aXRoIGEgc21hbGwgaWRlbnRpZmllcgotICogdGhlIHRyYW5zbWl0ICYgcmVjZWl2ZSBlbmRzIG9mIHRoZSBsaW5lIHVzZSB0byBsb2NhdGUgc2F2ZWQgaGVhZGVyLgotICovCi1zdHJ1Y3QgY3N0YXRlIHsKLSAgICBzdHJ1Y3QgY3N0YXRlICpjc19uZXh0OwkvKiBuZXh0IG1vc3QgcmVjZW50bHkgdXNlZCBzdGF0ZSAoeG1pdCBvbmx5KSAqLwotICAgIHVfc2hvcnQgY3NfaGxlbjsJCS8qIHNpemUgb2YgaGRyIChyZWNlaXZlIG9ubHkpICovCi0gICAgdV9jaGFyIGNzX2lkOwkJLyogY29ubmVjdGlvbiAjIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0YXRlICovCi0gICAgdV9jaGFyIGNzX2ZpbGxlcjsKLSAgICB1bmlvbiB7Ci0JY2hhciBjc3VfaGRyW01BWF9IRFJdOwotCXN0cnVjdCBpcCBjc3VfaXA7CS8qIGlwL3RjcCBoZHIgZnJvbSBtb3N0IHJlY2VudCBwYWNrZXQgKi8KLSAgICB9IHZqY3NfdTsKLX07Ci0jZGVmaW5lIGNzX2lwIHZqY3NfdS5jc3VfaXAKLSNkZWZpbmUgY3NfaGRyIHZqY3NfdS5jc3VfaGRyCi0KLS8qCi0gKiBhbGwgdGhlIHN0YXRlIGRhdGEgZm9yIG9uZSBzZXJpYWwgbGluZSAod2UgbmVlZCBvbmUgb2YgdGhlc2UgcGVyIGxpbmUpLgotICovCi1zdHJ1Y3Qgdmpjb21wcmVzcyB7Ci0gICAgc3RydWN0IGNzdGF0ZSAqbGFzdF9jczsJLyogbW9zdCByZWNlbnRseSB1c2VkIHRzdGF0ZSAqLwotICAgIHVfY2hhciBsYXN0X3JlY3Y7CQkvKiBsYXN0IHJjdmQgY29ubi4gaWQgKi8KLSAgICB1X2NoYXIgbGFzdF94bWl0OwkJLyogbGFzdCBzZW50IGNvbm4uIGlkICovCi0gICAgdV9zaG9ydCBmbGFnczsKLSNpZm5kZWYgVkpfTk9fU1RBVFMKLSAgICBzdHJ1Y3QgdmpzdGF0IHN0YXRzOwotI2VuZGlmCi0gICAgc3RydWN0IGNzdGF0ZSB0c3RhdGVbTUFYX1NUQVRFU107CS8qIHhtaXQgY29ubmVjdGlvbiBzdGF0ZXMgKi8KLSAgICBzdHJ1Y3QgY3N0YXRlIHJzdGF0ZVtNQVhfU1RBVEVTXTsJLyogcmVjZWl2ZSBjb25uZWN0aW9uIHN0YXRlcyAqLwotfTsKLQotLyogZmxhZyB2YWx1ZXMgKi8KLSNkZWZpbmUgVkpGX1RPU1MgMQkJLyogdG9zc2luZyByY3ZkIGZyYW1lcyBiZWNhdXNlIG9mIGlucHV0IGVyciAqLwotCi1leHRlcm4gdm9pZCAgdmpfY29tcHJlc3NfaW5pdCBfX1AoKHN0cnVjdCB2amNvbXByZXNzICpjb21wLCBpbnQgbWF4X3N0YXRlKSk7Ci1leHRlcm4gdV9pbnQgdmpfY29tcHJlc3NfdGNwIF9fUCgoc3RydWN0IGlwICppcCwgdV9pbnQgbWxlbiwKLQkJCQlzdHJ1Y3Qgdmpjb21wcmVzcyAqY29tcCwgaW50IGNvbXByZXNzX2NpZF9mbGFnLAotCQkJCXVfY2hhciAqKnZqaGRycCkpOwotZXh0ZXJuIHZvaWQgIHZqX3VuY29tcHJlc3NfZXJyIF9fUCgoc3RydWN0IHZqY29tcHJlc3MgKmNvbXApKTsKLWV4dGVybiBpbnQgICB2al91bmNvbXByZXNzX3VuY29tcCBfX1AoKHVfY2hhciAqYnVmLCBpbnQgYnVmbGVuLAotCQkJCXN0cnVjdCB2amNvbXByZXNzICpjb21wKSk7Ci1leHRlcm4gaW50ICAgdmpfdW5jb21wcmVzc190Y3AgX19QKCh1X2NoYXIgKmJ1ZiwgaW50IGJ1ZmxlbiwgaW50IHRvdGFsX2xlbiwKLQkJCQlzdHJ1Y3Qgdmpjb21wcmVzcyAqY29tcCwgdV9jaGFyICoqaGRycCwKLQkJCQl1X2ludCAqaGxlbnApKTsKLQotI2VuZGlmIC8qIF9WSkNPTVBSRVNTX0hfICovCmRpZmYgLS1naXQgYS9wcHBkL2luY2x1ZGUvcGNhcC1pbnQuaCBiL3BwcGQvaW5jbHVkZS9wY2FwLWludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTVmYjllLi4wMDAwMDAwCi0tLSBhL3BwcGQvaW5jbHVkZS9wY2FwLWludC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTUsIDE5OTYKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBDb21wdXRlciBTeXN0ZW1zCi0gKglFbmdpbmVlcmluZyBHcm91cCBhdCBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5LgotICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3Igb2YgdGhlIExhYm9yYXRvcnkgbWF5IGJlIHVzZWQKLSAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqCi0gKiBAKCMpICRIZWFkZXI6IC9kYXRhL2N2cy9wcHAvaW5jbHVkZS9wY2FwLWludC5oLHYgMS4xIDIwMDAvMDgvMDEgMDE6Mzc6MjQgcGF1bHVzIEV4cCAkIChMQkwpCi0gKi8KLQotI2lmbmRlZiBwY2FwX2ludF9oCi0jZGVmaW5lIHBjYXBfaW50X2gKLQotI2luY2x1ZGUgPHBjYXAuaD4KLQotLyoKLSAqIFNhdmVmaWxlCi0gKi8KLXN0cnVjdCBwY2FwX3NmIHsKLQlGSUxFICpyZmlsZTsKLQlpbnQgc3dhcHBlZDsKLQlpbnQgdmVyc2lvbl9tYWpvcjsKLQlpbnQgdmVyc2lvbl9taW5vcjsKLQl1X2NoYXIgKmJhc2U7Ci19OwotCi1zdHJ1Y3QgcGNhcF9tZCB7Ci0Jc3RydWN0IHBjYXBfc3RhdCBzdGF0OwotCS8qWFhYKi8KLQlpbnQgdXNlX2JwZjsKLQl1X2xvbmcJVG90UGt0czsJLyogY2FuJ3Qgb2Zsb3cgZm9yIDc5IGhycyBvbiBldGhlciAqLwotCXVfbG9uZwlUb3RBY2NlcHRlZDsJLyogY291bnQgYWNjZXB0ZWQgYnkgZmlsdGVyICovCi0JdV9sb25nCVRvdERyb3BzOwkvKiBjb3VudCBvZiBkcm9wcGVkIHBhY2tldHMgKi8KLQlsb25nCVRvdE1pc3NlZDsJLyogbWlzc2VkIGJ5IGkvZiBkdXJpbmcgdGhpcyBydW4gKi8KLQlsb25nCU9yaWdNaXNzZWQ7CS8qIG1pc3NlZCBieSBpL2YgYmVmb3JlIHRoaXMgcnVuICovCi0jaWZkZWYgbGludXgKLQlpbnQgcGFkOwotCWludCBza2lwOwotCWNoYXIgKmRldmljZTsKLSNlbmRpZgotfTsKLQotc3RydWN0IHBjYXAgewotCWludCBmZDsKLQlpbnQgc25hcHNob3Q7Ci0JaW50IGxpbmt0eXBlOwotCWludCB0em9mZjsJCS8qIHRpbWV6b25lIG9mZnNldCAqLwotCWludCBvZmZzZXQ7CQkvKiBvZmZzZXQgZm9yIHByb3BlciBhbGlnbm1lbnQgKi8KLQotCXN0cnVjdCBwY2FwX3NmIHNmOwotCXN0cnVjdCBwY2FwX21kIG1kOwotCi0JLyoKLQkgKiBSZWFkIGJ1ZmZlci4KLQkgKi8KLQlpbnQgYnVmc2l6ZTsKLQl1X2NoYXIgKmJ1ZmZlcjsKLQl1X2NoYXIgKmJwOwotCWludCBjYzsKLQotCS8qCi0JICogUGxhY2UgaG9sZGVyIGZvciBwY2FwX25leHQoKS4KLQkgKi8KLQl1X2NoYXIgKnBrdDsKLQotCQotCS8qCi0JICogUGxhY2Vob2xkZXIgZm9yIGZpbHRlciBjb2RlIGlmIGJwZiBub3QgaW4ga2VybmVsLgotCSAqLwotCXN0cnVjdCBicGZfcHJvZ3JhbSBmY29kZTsKLQotCWNoYXIgZXJyYnVmW1BDQVBfRVJSQlVGX1NJWkVdOwotfTsKLQotaW50CXl5bGV4KHZvaWQpOwotCi0jaWZuZGVmIG1pbgotI2RlZmluZSBtaW4oYSwgYikgKChhKSA+IChiKSA/IChiKSA6IChhKSkKLSNlbmRpZgotCi0vKiBYWFggc2hvdWxkIHRoZXNlIGJlIGluIHBjYXAuaD8gKi8KLWludAlwY2FwX29mZmxpbmVfcmVhZChwY2FwX3QgKiwgaW50LCBwY2FwX2hhbmRsZXIsIHVfY2hhciAqKTsKLWludAlwY2FwX3JlYWQocGNhcF90ICosIGludCBjbnQsIHBjYXBfaGFuZGxlciwgdV9jaGFyICopOwotCi0vKiBVbHRyaXggcGFkcyB0byBtYWtlIGV2ZXJ5dGhpbmcgbGluZSB1cCBvbiBhIG5pY2UgYm91bmRhcnkgKi8KLSNpZiBkZWZpbmVkKHVsdHJpeCkgfHwgZGVmaW5lZChfX2FscGhhKQotI2RlZmluZSAgICAgICBQQ0FQX0ZERElQQUQgMwotI2VuZGlmCi0KLS8qIFhYWCAqLwotZXh0ZXJuCWludCBwY2FwX2ZkZGlwYWQ7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3BwcGQvaXBjcC5jIGIvcHBwZC9pcGNwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMzczOTYuLjAwMDAwMDAKLS0tIGEvcHBwZC9pcGNwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEzICswLDAgQEAKLS8qCi0gKiBpcGNwLmMgLSBQUFAgSVAgQ29udHJvbCBQcm90b2NvbC4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODQtMjAwMCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgbmFtZSAiQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciBwZXJtaXNzaW9uIG9yIGFueSBsZWdhbAotICogICAgZGV0YWlscywgcGxlYXNlIGNvbnRhY3QKLSAqICAgICAgT2ZmaWNlIG9mIFRlY2hub2xvZ3kgVHJhbnNmZXIKLSAqICAgICAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAqICAgICAgNTAwMCBGb3JiZXMgQXZlbnVlCi0gKiAgICAgIFBpdHRzYnVyZ2gsIFBBICAxNTIxMy0zODkwCi0gKiAgICAgICg0MTIpIDI2OC00Mzg3LCBmYXg6ICg0MTIpIDI2OC03Mzk1Ci0gKiAgICAgIHRlY2gtdHJhbnNmZXJAYW5kcmV3LmNtdS5lZHUKLSAqCi0gKiA0LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IENvbXB1dGluZyBTZXJ2aWNlcwotICogICAgIGF0IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IChodHRwOi8vd3d3LmNtdS5lZHUvY29tcHV0aW5nLykuIgotICoKLSAqIENBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotICogVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi0gKiBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi0gKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi0gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jZGVmaW5lIFJDU0lECSIkSWQ6IGlwY3AuYyx2IDEuNzMgMjAwOC8wNS8yNiAwODozMzoyMiBwYXVsdXMgRXhwICQiCi0KLS8qCi0gKiBUT0RPOgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLQotI2luY2x1ZGUgInBwcGQuaCIKLSNpbmNsdWRlICJmc20uaCIKLSNpbmNsdWRlICJpcGNwLmgiCi0jaW5jbHVkZSAicGF0aG5hbWVzLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gPSBSQ1NJRDsKLQotLyogZ2xvYmFsIHZhcnMgKi8KLWlwY3Bfb3B0aW9ucyBpcGNwX3dhbnRvcHRpb25zW05VTV9QUFBdOwkvKiBPcHRpb25zIHRoYXQgd2Ugd2FudCB0byByZXF1ZXN0ICovCi1pcGNwX29wdGlvbnMgaXBjcF9nb3RvcHRpb25zW05VTV9QUFBdOwkvKiBPcHRpb25zIHRoYXQgcGVlciBhY2snZCAqLwotaXBjcF9vcHRpb25zIGlwY3BfYWxsb3dvcHRpb25zW05VTV9QUFBdOyAvKiBPcHRpb25zIHdlIGFsbG93IHBlZXIgdG8gcmVxdWVzdCAqLwotaXBjcF9vcHRpb25zIGlwY3BfaGlzb3B0aW9uc1tOVU1fUFBQXTsJLyogT3B0aW9ucyB0aGF0IHdlIGFjaydkICovCi0KLXVfaW50MzJfdCBuZXRtYXNrID0gMDsJCS8qIElQIG5ldG1hc2sgdG8gc2V0IG9uIGludGVyZmFjZSAqLwotCi1ib29sCWRpc2FibGVfZGVmYXVsdGlwID0gMDsJLyogRG9uJ3QgdXNlIGhvc3RuYW1lIGZvciBkZWZhdWx0IElQIGFkcnMgKi8KLWJvb2wJbm9yZW1vdGVpcCA9IDA7CQkvKiBMZXQgaGltIGhhdmUgbm8gSVAgYWRkcmVzcyAqLwotCi0vKiBIb29rIGZvciBhIHBsdWdpbiB0byBrbm93IHdoZW4gSVAgcHJvdG9jb2wgaGFzIGNvbWUgdXAgKi8KLXZvaWQgKCppcF91cF9ob29rKSBfX1AoKHZvaWQpKSA9IE5VTEw7Ci0KLS8qIEhvb2sgZm9yIGEgcGx1Z2luIHRvIGtub3cgd2hlbiBJUCBwcm90b2NvbCBoYXMgY29tZSBkb3duICovCi12b2lkICgqaXBfZG93bl9ob29rKSBfX1AoKHZvaWQpKSA9IE5VTEw7Ci0KLS8qIEhvb2sgZm9yIGEgcGx1Z2luIHRvIGNob29zZSB0aGUgcmVtb3RlIElQIGFkZHJlc3MgKi8KLXZvaWQgKCppcF9jaG9vc2VfaG9vaykgX19QKCh1X2ludDMyX3QgKikpID0gTlVMTDsKLQotLyogTm90aWZpZXJzIGZvciB3aGVuIElQQ1AgZ29lcyB1cCBhbmQgZG93biAqLwotc3RydWN0IG5vdGlmaWVyICppcF91cF9ub3RpZmllciA9IE5VTEw7Ci1zdHJ1Y3Qgbm90aWZpZXIgKmlwX2Rvd25fbm90aWZpZXIgPSBOVUxMOwotCi0vKiBsb2NhbCB2YXJzICovCi1zdGF0aWMgaW50IGRlZmF1bHRfcm91dGVfc2V0W05VTV9QUFBdOwkvKiBIYXZlIHNldCB1cCBhIGRlZmF1bHQgcm91dGUgKi8KLXN0YXRpYyBpbnQgcHJveHlfYXJwX3NldFtOVU1fUFBQXTsJLyogSGF2ZSBjcmVhdGVkIHByb3h5IGFycCBlbnRyeSAqLwotc3RhdGljIGJvb2wgdXNlcGVlcmRuczsJCQkvKiBBc2sgcGVlciBmb3IgRE5TIGFkZHJzICovCi1zdGF0aWMgaW50IGlwY3BfaXNfdXA7CQkJLyogaGF2ZSBjYWxsZWQgbnBfdXAoKSAqLwotc3RhdGljIGludCBpcGNwX2lzX29wZW47CQkvKiBoYXZlbid0IGNhbGxlZCBucF9maW5pc2hlZCgpICovCi1zdGF0aWMgYm9vbCBhc2tfZm9yX2xvY2FsOwkJLyogcmVxdWVzdCBvdXIgYWRkcmVzcyBmcm9tIHBlZXIgKi8KLXN0YXRpYyBjaGFyIHZqX3ZhbHVlWzhdOwkJLyogc3RyaW5nIGZvcm0gb2Ygdmogb3B0aW9uIHZhbHVlICovCi1zdGF0aWMgY2hhciBuZXRtYXNrX3N0clsyMF07CQkvKiBzdHJpbmcgZm9ybSBvZiBuZXRtYXNrIHZhbHVlICovCi0KLS8qCi0gKiBDYWxsYmFja3MgZm9yIGZzbSBjb2RlLiAgKENJID0gQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbikKLSAqLwotc3RhdGljIHZvaWQgaXBjcF9yZXNldGNpIF9fUCgoZnNtICopKTsJLyogUmVzZXQgb3VyIENJICovCi1zdGF0aWMgaW50ICBpcGNwX2NpbGVuIF9fUCgoZnNtICopKTsJICAgICAgICAvKiBSZXR1cm4gbGVuZ3RoIG9mIG91ciBDSSAqLwotc3RhdGljIHZvaWQgaXBjcF9hZGRjaSBfX1AoKGZzbSAqLCB1X2NoYXIgKiwgaW50ICopKTsgLyogQWRkIG91ciBDSSAqLwotc3RhdGljIGludCAgaXBjcF9hY2tjaSBfX1AoKGZzbSAqLCB1X2NoYXIgKiwgaW50KSk7CS8qIFBlZXIgYWNrJ2Qgb3VyIENJICovCi1zdGF0aWMgaW50ICBpcGNwX25ha2NpIF9fUCgoZnNtICosIHVfY2hhciAqLCBpbnQsIGludCkpOy8qIFBlZXIgbmFrJ2Qgb3VyIENJICovCi1zdGF0aWMgaW50ICBpcGNwX3JlamNpIF9fUCgoZnNtICosIHVfY2hhciAqLCBpbnQpKTsJLyogUGVlciByZWonZCBvdXIgQ0kgKi8KLXN0YXRpYyBpbnQgIGlwY3BfcmVxY2kgX19QKChmc20gKiwgdV9jaGFyICosIGludCAqLCBpbnQpKTsgLyogUmN2IENJICovCi1zdGF0aWMgdm9pZCBpcGNwX3VwIF9fUCgoZnNtICopKTsJCS8qIFdlJ3JlIFVQICovCi1zdGF0aWMgdm9pZCBpcGNwX2Rvd24gX19QKChmc20gKikpOwkJLyogV2UncmUgRE9XTiAqLwotc3RhdGljIHZvaWQgaXBjcF9maW5pc2hlZCBfX1AoKGZzbSAqKSk7CS8qIERvbid0IG5lZWQgbG93ZXIgbGF5ZXIgKi8KLQotZnNtIGlwY3BfZnNtW05VTV9QUFBdOwkJLyogSVBDUCBmc20gc3RydWN0dXJlICovCi0KLXN0YXRpYyBmc21fY2FsbGJhY2tzIGlwY3BfY2FsbGJhY2tzID0geyAvKiBJUENQIGNhbGxiYWNrIHJvdXRpbmVzICovCi0gICAgaXBjcF9yZXNldGNpLAkJLyogUmVzZXQgb3VyIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gKi8KLSAgICBpcGNwX2NpbGVuLAkJCS8qIExlbmd0aCBvZiBvdXIgQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbiAqLwotICAgIGlwY3BfYWRkY2ksCQkJLyogQWRkIG91ciBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uICovCi0gICAgaXBjcF9hY2tjaSwJCQkvKiBBQ0sgb3VyIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gKi8KLSAgICBpcGNwX25ha2NpLAkJCS8qIE5BSyBvdXIgQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbiAqLwotICAgIGlwY3BfcmVqY2ksCQkJLyogUmVqZWN0IG91ciBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uICovCi0gICAgaXBjcF9yZXFjaSwJCQkvKiBSZXF1ZXN0IHBlZXIncyBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uICovCi0gICAgaXBjcF91cCwJCQkvKiBDYWxsZWQgd2hlbiBmc20gcmVhY2hlcyBPUEVORUQgc3RhdGUgKi8KLSAgICBpcGNwX2Rvd24sCQkJLyogQ2FsbGVkIHdoZW4gZnNtIGxlYXZlcyBPUEVORUQgc3RhdGUgKi8KLSAgICBOVUxMLAkJCS8qIENhbGxlZCB3aGVuIHdlIHdhbnQgdGhlIGxvd2VyIGxheWVyIHVwICovCi0gICAgaXBjcF9maW5pc2hlZCwJCS8qIENhbGxlZCB3aGVuIHdlIHdhbnQgdGhlIGxvd2VyIGxheWVyIGRvd24gKi8KLSAgICBOVUxMLAkJCS8qIENhbGxlZCB3aGVuIFByb3RvY29sLVJlamVjdCByZWNlaXZlZCAqLwotICAgIE5VTEwsCQkJLyogUmV0cmFuc21pc3Npb24gaXMgbmVjZXNzYXJ5ICovCi0gICAgTlVMTCwJCQkvKiBDYWxsZWQgdG8gaGFuZGxlIHByb3RvY29sLXNwZWNpZmljIGNvZGVzICovCi0gICAgIklQQ1AiCQkJLyogU3RyaW5nIG5hbWUgb2YgcHJvdG9jb2wgKi8KLX07Ci0KLS8qCi0gKiBDb21tYW5kLWxpbmUgb3B0aW9ucy4KLSAqLwotc3RhdGljIGludCBzZXR2anNsb3RzIF9fUCgoY2hhciAqKikpOwotc3RhdGljIGludCBzZXRkbnNhZGRyIF9fUCgoY2hhciAqKikpOwotc3RhdGljIGludCBzZXR3aW5zYWRkciBfX1AoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgc2V0bmV0bWFzayBfX1AoKGNoYXIgKiopKTsKLWludCBzZXRpcGFkZHIgX19QKChjaGFyICosIGNoYXIgKiosIGludCkpOwotc3RhdGljIHZvaWQgcHJpbnRpcGFkZHIgX19QKChvcHRpb25fdCAqLCB2b2lkICgqKSh2b2lkICosIGNoYXIgKiwuLi4pLHZvaWQgKikpOwotCi1zdGF0aWMgb3B0aW9uX3QgaXBjcF9vcHRpb25fbGlzdFtdID0gewotICAgIHsgIm5vaXAiLCBvX2Jvb2wsICZpcGNwX3Byb3RlbnQuZW5hYmxlZF9mbGFnLAotICAgICAgIkRpc2FibGUgSVAgYW5kIElQQ1AiIH0sCi0gICAgeyAiLWlwIiwgb19ib29sLCAmaXBjcF9wcm90ZW50LmVuYWJsZWRfZmxhZywKLSAgICAgICJEaXNhYmxlIElQIGFuZCBJUENQIiwgT1BUX0FMSUFTIH0sCi0KLSAgICB7ICJub3ZqIiwgb19ib29sLCAmaXBjcF93YW50b3B0aW9uc1swXS5uZWdfdmosCi0gICAgICAiRGlzYWJsZSBWSiBjb21wcmVzc2lvbiIsIE9QVF9BMkNMUiwgJmlwY3BfYWxsb3dvcHRpb25zWzBdLm5lZ192aiB9LAotICAgIHsgIi12aiIsIG9fYm9vbCwgJmlwY3Bfd2FudG9wdGlvbnNbMF0ubmVnX3ZqLAotICAgICAgIkRpc2FibGUgVkogY29tcHJlc3Npb24iLCBPUFRfQUxJQVMgfCBPUFRfQTJDTFIsCi0gICAgICAmaXBjcF9hbGxvd29wdGlvbnNbMF0ubmVnX3ZqIH0sCi0KLSAgICB7ICJub3ZqY2NvbXAiLCBvX2Jvb2wsICZpcGNwX3dhbnRvcHRpb25zWzBdLmNmbGFnLAotICAgICAgIkRpc2FibGUgVkogY29ubmVjdGlvbi1JRCBjb21wcmVzc2lvbiIsIE9QVF9BMkNMUiwKLSAgICAgICZpcGNwX2FsbG93b3B0aW9uc1swXS5jZmxhZyB9LAotICAgIHsgIi12amNjb21wIiwgb19ib29sLCAmaXBjcF93YW50b3B0aW9uc1swXS5jZmxhZywKLSAgICAgICJEaXNhYmxlIFZKIGNvbm5lY3Rpb24tSUQgY29tcHJlc3Npb24iLCBPUFRfQUxJQVMgfCBPUFRfQTJDTFIsCi0gICAgICAmaXBjcF9hbGxvd29wdGlvbnNbMF0uY2ZsYWcgfSwKLQotICAgIHsgInZqLW1heC1zbG90cyIsIG9fc3BlY2lhbCwgKHZvaWQgKilzZXR2anNsb3RzLAotICAgICAgIlNldCBtYXhpbXVtIFZKIGhlYWRlciBzbG90cyIsCi0gICAgICBPUFRfUFJJTyB8IE9QVF9BMlNUUlZBTCB8IE9QVF9TVEFUSUMsIHZqX3ZhbHVlIH0sCi0KLSAgICB7ICJpcGNwLWFjY2VwdC1sb2NhbCIsIG9fYm9vbCwgJmlwY3Bfd2FudG9wdGlvbnNbMF0uYWNjZXB0X2xvY2FsLAotICAgICAgIkFjY2VwdCBwZWVyJ3MgYWRkcmVzcyBmb3IgdXMiLCAxIH0sCi0gICAgeyAiaXBjcC1hY2NlcHQtcmVtb3RlIiwgb19ib29sLCAmaXBjcF93YW50b3B0aW9uc1swXS5hY2NlcHRfcmVtb3RlLAotICAgICAgIkFjY2VwdCBwZWVyJ3MgYWRkcmVzcyBmb3IgaXQiLCAxIH0sCi0KLSAgICB7ICJpcHBhcmFtIiwgb19zdHJpbmcsICZpcHBhcmFtLAotICAgICAgIlNldCBpcCBzY3JpcHQgcGFyYW1ldGVyIiwgT1BUX1BSSU8gfSwKLQotICAgIHsgIm5vaXBkZWZhdWx0Iiwgb19ib29sLCAmZGlzYWJsZV9kZWZhdWx0aXAsCi0gICAgICAiRG9uJ3QgdXNlIG5hbWUgZm9yIGRlZmF1bHQgSVAgYWRycyIsIDEgfSwKLQotICAgIHsgIm1zLWRucyIsIDEsICh2b2lkICopc2V0ZG5zYWRkciwKLSAgICAgICJETlMgYWRkcmVzcyBmb3IgdGhlIHBlZXIncyB1c2UiIH0sCi0gICAgeyAibXMtd2lucyIsIDEsICh2b2lkICopc2V0d2luc2FkZHIsCi0gICAgICAiTmFtZXNlcnZlciBmb3IgU01CIG92ZXIgVENQL0lQIGZvciBwZWVyIiB9LAotCi0gICAgeyAiaXBjcC1yZXN0YXJ0Iiwgb19pbnQsICZpcGNwX2ZzbVswXS50aW1lb3V0dGltZSwKLSAgICAgICJTZXQgdGltZW91dCBmb3IgSVBDUCIsIE9QVF9QUklPIH0sCi0gICAgeyAiaXBjcC1tYXgtdGVybWluYXRlIiwgb19pbnQsICZpcGNwX2ZzbVswXS5tYXh0ZXJtdHJhbnNtaXRzLAotICAgICAgIlNldCBtYXggI3htaXRzIGZvciB0ZXJtLXJlcXMiLCBPUFRfUFJJTyB9LAotICAgIHsgImlwY3AtbWF4LWNvbmZpZ3VyZSIsIG9faW50LCAmaXBjcF9mc21bMF0ubWF4Y29uZnJlcXRyYW5zbWl0cywKLSAgICAgICJTZXQgbWF4ICN4bWl0cyBmb3IgY29uZi1yZXFzIiwgT1BUX1BSSU8gfSwKLSAgICB7ICJpcGNwLW1heC1mYWlsdXJlIiwgb19pbnQsICZpcGNwX2ZzbVswXS5tYXhuYWtsb29wcywKLSAgICAgICJTZXQgbWF4ICNjb25mLW5ha3MgZm9yIElQQ1AiLCBPUFRfUFJJTyB9LAotCi0gICAgeyAiZGVmYXVsdHJvdXRlIiwgb19ib29sLCAmaXBjcF93YW50b3B0aW9uc1swXS5kZWZhdWx0X3JvdXRlLAotICAgICAgIkFkZCBkZWZhdWx0IHJvdXRlIiwgT1BUX0VOQUJMRXwxLCAmaXBjcF9hbGxvd29wdGlvbnNbMF0uZGVmYXVsdF9yb3V0ZSB9LAotICAgIHsgIm5vZGVmYXVsdHJvdXRlIiwgb19ib29sLCAmaXBjcF9hbGxvd29wdGlvbnNbMF0uZGVmYXVsdF9yb3V0ZSwKLSAgICAgICJkaXNhYmxlIGRlZmF1bHRyb3V0ZSBvcHRpb24iLCBPUFRfQTJDTFIsCi0gICAgICAmaXBjcF93YW50b3B0aW9uc1swXS5kZWZhdWx0X3JvdXRlIH0sCi0gICAgeyAiLWRlZmF1bHRyb3V0ZSIsIG9fYm9vbCwgJmlwY3BfYWxsb3dvcHRpb25zWzBdLmRlZmF1bHRfcm91dGUsCi0gICAgICAiZGlzYWJsZSBkZWZhdWx0cm91dGUgb3B0aW9uIiwgT1BUX0FMSUFTIHwgT1BUX0EyQ0xSLAotICAgICAgJmlwY3Bfd2FudG9wdGlvbnNbMF0uZGVmYXVsdF9yb3V0ZSB9LAotCi0gICAgeyAicHJveHlhcnAiLCBvX2Jvb2wsICZpcGNwX3dhbnRvcHRpb25zWzBdLnByb3h5X2FycCwKLSAgICAgICJBZGQgcHJveHkgQVJQIGVudHJ5IiwgT1BUX0VOQUJMRXwxLCAmaXBjcF9hbGxvd29wdGlvbnNbMF0ucHJveHlfYXJwIH0sCi0gICAgeyAibm9wcm94eWFycCIsIG9fYm9vbCwgJmlwY3BfYWxsb3dvcHRpb25zWzBdLnByb3h5X2FycCwKLSAgICAgICJkaXNhYmxlIHByb3h5YXJwIG9wdGlvbiIsIE9QVF9BMkNMUiwKLSAgICAgICZpcGNwX3dhbnRvcHRpb25zWzBdLnByb3h5X2FycCB9LAotICAgIHsgIi1wcm94eWFycCIsIG9fYm9vbCwgJmlwY3BfYWxsb3dvcHRpb25zWzBdLnByb3h5X2FycCwKLSAgICAgICJkaXNhYmxlIHByb3h5YXJwIG9wdGlvbiIsIE9QVF9BTElBUyB8IE9QVF9BMkNMUiwKLSAgICAgICZpcGNwX3dhbnRvcHRpb25zWzBdLnByb3h5X2FycCB9LAotCi0gICAgeyAidXNlcGVlcmRucyIsIG9fYm9vbCwgJnVzZXBlZXJkbnMsCi0gICAgICAiQXNrIHBlZXIgZm9yIEROUyBhZGRyZXNzKGVzKSIsIDEgfSwKLQotICAgIHsgIm5ldG1hc2siLCBvX3NwZWNpYWwsICh2b2lkICopc2V0bmV0bWFzaywKLSAgICAgICJzZXQgbmV0bWFzayIsIE9QVF9QUklPIHwgT1BUX0EyU1RSVkFMIHwgT1BUX1NUQVRJQywgbmV0bWFza19zdHIgfSwKLQotICAgIHsgImlwY3Atbm8tYWRkcmVzc2VzIiwgb19ib29sLCAmaXBjcF93YW50b3B0aW9uc1swXS5vbGRfYWRkcnMsCi0gICAgICAiRGlzYWJsZSBvbGQtc3R5bGUgSVAtQWRkcmVzc2VzIHVzYWdlIiwgT1BUX0EyQ0xSLAotICAgICAgJmlwY3BfYWxsb3dvcHRpb25zWzBdLm9sZF9hZGRycyB9LAotICAgIHsgImlwY3Atbm8tYWRkcmVzcyIsIG9fYm9vbCwgJmlwY3Bfd2FudG9wdGlvbnNbMF0ubmVnX2FkZHIsCi0gICAgICAiRGlzYWJsZSBJUC1BZGRyZXNzIHVzYWdlIiwgT1BUX0EyQ0xSLAotICAgICAgJmlwY3BfYWxsb3dvcHRpb25zWzBdLm5lZ19hZGRyIH0sCi0jaWZkZWYgX19saW51eF9fCi0gICAgeyAibm9yZW1vdGVpcCIsIG9fYm9vbCwgJm5vcmVtb3RlaXAsCi0gICAgICAiQWxsb3cgcGVlciB0byBoYXZlIG5vIElQIGFkZHJlc3MiLCAxIH0sCi0jZW5kaWYKLSAgICB7ICJub3NlbmRpcCIsIG9fYm9vbCwgJmlwY3Bfd2FudG9wdGlvbnNbMF0ubmVnX2FkZHIsCi0gICAgICAiRG9uJ3Qgc2VuZCBvdXIgSVAgYWRkcmVzcyB0byBwZWVyIiwgT1BUX0EyQ0xSLAotICAgICAgJmlwY3Bfd2FudG9wdGlvbnNbMF0ub2xkX2FkZHJzfSwKLQotICAgIHsgIklQIGFkZHJlc3NlcyIsIG9fd2lsZCwgKHZvaWQgKikgJnNldGlwYWRkciwKLSAgICAgICJzZXQgbG9jYWwgYW5kIHJlbW90ZSBJUCBhZGRyZXNzZXMiLAotICAgICAgT1BUX05PQVJHIHwgT1BUX0EyUFJJTlRFUiwgKHZvaWQgKikgJnByaW50aXBhZGRyIH0sCi0KLSAgICB7IE5VTEwgfQotfTsKLQotLyoKLSAqIFByb3RvY29sIGVudHJ5IHBvaW50cyBmcm9tIG1haW4gY29kZS4KLSAqLwotc3RhdGljIHZvaWQgaXBjcF9pbml0IF9fUCgoaW50KSk7Ci1zdGF0aWMgdm9pZCBpcGNwX29wZW4gX19QKChpbnQpKTsKLXN0YXRpYyB2b2lkIGlwY3BfY2xvc2UgX19QKChpbnQsIGNoYXIgKikpOwotc3RhdGljIHZvaWQgaXBjcF9sb3dlcnVwIF9fUCgoaW50KSk7Ci1zdGF0aWMgdm9pZCBpcGNwX2xvd2VyZG93biBfX1AoKGludCkpOwotc3RhdGljIHZvaWQgaXBjcF9pbnB1dCBfX1AoKGludCwgdV9jaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgaXBjcF9wcm90cmVqIF9fUCgoaW50KSk7Ci1zdGF0aWMgaW50ICBpcGNwX3ByaW50cGt0IF9fUCgodV9jaGFyICosIGludCwKLQkJCSAgICAgICB2b2lkICgqKSBfX1AoKHZvaWQgKiwgY2hhciAqLCAuLi4pKSwgdm9pZCAqKSk7Ci1zdGF0aWMgdm9pZCBpcF9jaGVja19vcHRpb25zIF9fUCgodm9pZCkpOwotc3RhdGljIGludCAgaXBfZGVtYW5kX2NvbmYgX19QKChpbnQpKTsKLXN0YXRpYyBpbnQgIGlwX2FjdGl2ZV9wa3QgX19QKCh1X2NoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBjcmVhdGVfcmVzb2x2IF9fUCgodV9pbnQzMl90LCB1X2ludDMyX3QpKTsKLQotc3RydWN0IHByb3RlbnQgaXBjcF9wcm90ZW50ID0gewotICAgIFBQUF9JUENQLAotICAgIGlwY3BfaW5pdCwKLSAgICBpcGNwX2lucHV0LAotICAgIGlwY3BfcHJvdHJlaiwKLSAgICBpcGNwX2xvd2VydXAsCi0gICAgaXBjcF9sb3dlcmRvd24sCi0gICAgaXBjcF9vcGVuLAotICAgIGlwY3BfY2xvc2UsCi0gICAgaXBjcF9wcmludHBrdCwKLSAgICBOVUxMLAotICAgIDEsCi0gICAgIklQQ1AiLAotICAgICJJUCIsCi0gICAgaXBjcF9vcHRpb25fbGlzdCwKLSAgICBpcF9jaGVja19vcHRpb25zLAotICAgIGlwX2RlbWFuZF9jb25mLAotICAgIGlwX2FjdGl2ZV9wa3QKLX07Ci0KLXN0YXRpYyB2b2lkIGlwY3BfY2xlYXJfYWRkcnMgX19QKChpbnQsIHVfaW50MzJfdCwgdV9pbnQzMl90KSk7Ci1zdGF0aWMgdm9pZCBpcGNwX3NjcmlwdCBfX1AoKGNoYXIgKiwgaW50KSk7CS8qIFJ1biBhbiB1cC9kb3duIHNjcmlwdCAqLwotc3RhdGljIHZvaWQgaXBjcF9zY3JpcHRfZG9uZSBfX1AoKHZvaWQgKikpOwotCi0vKgotICogTGVuZ3RocyBvZiBjb25maWd1cmF0aW9uIG9wdGlvbnMuCi0gKi8KLSNkZWZpbmUgQ0lMRU5fVk9JRAkyCi0jZGVmaW5lIENJTEVOX0NPTVBSRVNTCTQJLyogbWluIGxlbmd0aCBmb3IgY29tcHJlc3Npb24gcHJvdG9jb2wgb3B0LiAqLwotI2RlZmluZSBDSUxFTl9WSgk2CS8qIGxlbmd0aCBmb3IgUkZDMTMzMiBWYW4tSmFjb2Jzb24gb3B0LiAqLwotI2RlZmluZSBDSUxFTl9BRERSCTYJLyogbmV3LXN0eWxlIHNpbmdsZSBhZGRyZXNzIG9wdGlvbiAqLwotI2RlZmluZSBDSUxFTl9BRERSUwkxMAkvKiBvbGQtc3R5bGUgZHVhbCBhZGRyZXNzIG9wdGlvbiAqLwotCi0KLSNkZWZpbmUgQ09ERU5BTUUoeCkJKCh4KSA9PSBDT05GQUNLID8gIkFDSyIgOiBcCi0JCQkgKHgpID09IENPTkZOQUsgPyAiTkFLIiA6ICJSRUoiKQotCi0vKgotICogVGhpcyBzdGF0ZSB2YXJpYWJsZSBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0Ci0gKiBydW4gYW4gaXBjcC11cC9kb3duIHNjcmlwdCB3aGlsZSBvbmUgaXMgYWxyZWFkeSBydW5uaW5nLgotICovCi1zdGF0aWMgZW51bSBzY3JpcHRfc3RhdGUgewotICAgIHNfZG93biwKLSAgICBzX3VwLAotfSBpcGNwX3NjcmlwdF9zdGF0ZTsKLXN0YXRpYyBwaWRfdCBpcGNwX3NjcmlwdF9waWQ7Ci0KLS8qCi0gKiBNYWtlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbmV0d29yayBJUCBhZGRyZXNzLgotICovCi1jaGFyICoKLWlwX250b2EoaXBhZGRyKQotdV9pbnQzMl90IGlwYWRkcjsKLXsKLSAgICBzdGF0aWMgY2hhciBiWzY0XTsKLQotICAgIHNscHJpbnRmKGIsIHNpemVvZihiKSwgIiVJIiwgaXBhZGRyKTsKLSAgICByZXR1cm4gYjsKLX0KLQotLyoKLSAqIE9wdGlvbiBwYXJzaW5nLgotICovCi0KLS8qCi0gKiBzZXR2anNsb3RzIC0gc2V0IG1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb24gc2xvdHMgZm9yIFZKIGNvbXByZXNzaW9uCi0gKi8KLXN0YXRpYyBpbnQKLXNldHZqc2xvdHMoYXJndikKLSAgICBjaGFyICoqYXJndjsKLXsKLSAgICBpbnQgdmFsdWU7Ci0KLSAgICBpZiAoIWludF9vcHRpb24oKmFyZ3YsICZ2YWx1ZSkpCi0JcmV0dXJuIDA7Ci0gICAgaWYgKHZhbHVlIDwgMiB8fCB2YWx1ZSA+IDE2KSB7Ci0Jb3B0aW9uX2Vycm9yKCJ2ai1tYXgtc2xvdHMgdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDIgYW5kIDE2Iik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGlwY3Bfd2FudG9wdGlvbnMgWzBdLm1heHNsb3RpbmRleCA9Ci0gICAgICAgIGlwY3BfYWxsb3dvcHRpb25zWzBdLm1heHNsb3RpbmRleCA9IHZhbHVlIC0gMTsKLSAgICBzbHByaW50Zih2al92YWx1ZSwgc2l6ZW9mKHZqX3ZhbHVlKSwgIiVkIiwgdmFsdWUpOwotICAgIHJldHVybiAxOwotfQotCi0vKgotICogc2V0ZG5zYWRkciAtIHNldCB0aGUgZG5zIGFkZHJlc3MoZXMpCi0gKi8KLXN0YXRpYyBpbnQKLXNldGRuc2FkZHIoYXJndikKLSAgICBjaGFyICoqYXJndjsKLXsKLSAgICB1X2ludDMyX3QgZG5zOwotICAgIHN0cnVjdCBob3N0ZW50ICpocDsKLQotICAgIGRucyA9IGluZXRfYWRkcigqYXJndik7Ci0gICAgaWYgKGRucyA9PSAodV9pbnQzMl90KSAtMSkgewotCWlmICgoaHAgPSBnZXRob3N0YnluYW1lKCphcmd2KSkgPT0gTlVMTCkgewotCSAgICBvcHRpb25fZXJyb3IoImludmFsaWQgYWRkcmVzcyBwYXJhbWV0ZXIgJyVzJyBmb3IgbXMtZG5zIG9wdGlvbiIsCi0JCQkgKmFyZ3YpOwotCSAgICByZXR1cm4gMDsKLQl9Ci0JZG5zID0gKih1X2ludDMyX3QgKilocC0+aF9hZGRyOwotICAgIH0KLQotICAgIC8qIFdlIHRha2UgdGhlIGxhc3QgMiB2YWx1ZXMgZ2l2ZW4sIHRoZSAybmQtbGFzdCBhcyB0aGUgcHJpbWFyeQotICAgICAgIGFuZCB0aGUgbGFzdCBhcyB0aGUgc2Vjb25kYXJ5LiAgSWYgb25seSBvbmUgaXMgZ2l2ZW4gaXQKLSAgICAgICBiZWNvbWVzIGJvdGggcHJpbWFyeSBhbmQgc2Vjb25kYXJ5LiAqLwotICAgIGlmIChpcGNwX2FsbG93b3B0aW9uc1swXS5kbnNhZGRyWzFdID09IDApCi0JaXBjcF9hbGxvd29wdGlvbnNbMF0uZG5zYWRkclswXSA9IGRuczsKLSAgICBlbHNlCi0JaXBjcF9hbGxvd29wdGlvbnNbMF0uZG5zYWRkclswXSA9IGlwY3BfYWxsb3dvcHRpb25zWzBdLmRuc2FkZHJbMV07Ci0KLSAgICAvKiBhbHdheXMgc2V0IHRoZSBzZWNvbmRhcnkgYWRkcmVzcyB2YWx1ZS4gKi8KLSAgICBpcGNwX2FsbG93b3B0aW9uc1swXS5kbnNhZGRyWzFdID0gZG5zOwotCi0gICAgcmV0dXJuICgxKTsKLX0KLQotLyoKLSAqIHNldHdpbnNhZGRyIC0gc2V0IHRoZSB3aW5zIGFkZHJlc3MoZXMpCi0gKiBUaGlzIGlzIHByaW1yYXJseSB1c2VkIHdpdGggdGhlIFNhbWJhIHBhY2thZ2UgdW5kZXIgVU5JWCBvciBmb3IgcG9pbnRpbmcKLSAqIHRoZSBjYWxsZXIgdG8gdGhlIGV4aXN0aW5nIFdJTlMgc2VydmVyIG9uIGEgV2luZG93cyBOVCBwbGF0Zm9ybS4KLSAqLwotc3RhdGljIGludAotc2V0d2luc2FkZHIoYXJndikKLSAgICBjaGFyICoqYXJndjsKLXsKLSAgICB1X2ludDMyX3Qgd2luczsKLSAgICBzdHJ1Y3QgaG9zdGVudCAqaHA7Ci0KLSAgICB3aW5zID0gaW5ldF9hZGRyKCphcmd2KTsKLSAgICBpZiAod2lucyA9PSAodV9pbnQzMl90KSAtMSkgewotCWlmICgoaHAgPSBnZXRob3N0YnluYW1lKCphcmd2KSkgPT0gTlVMTCkgewotCSAgICBvcHRpb25fZXJyb3IoImludmFsaWQgYWRkcmVzcyBwYXJhbWV0ZXIgJyVzJyBmb3IgbXMtd2lucyBvcHRpb24iLAotCQkJICphcmd2KTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCXdpbnMgPSAqKHVfaW50MzJfdCAqKWhwLT5oX2FkZHI7Ci0gICAgfQotCi0gICAgLyogV2UgdGFrZSB0aGUgbGFzdCAyIHZhbHVlcyBnaXZlbiwgdGhlIDJuZC1sYXN0IGFzIHRoZSBwcmltYXJ5Ci0gICAgICAgYW5kIHRoZSBsYXN0IGFzIHRoZSBzZWNvbmRhcnkuICBJZiBvbmx5IG9uZSBpcyBnaXZlbiBpdAotICAgICAgIGJlY29tZXMgYm90aCBwcmltYXJ5IGFuZCBzZWNvbmRhcnkuICovCi0gICAgaWYgKGlwY3BfYWxsb3dvcHRpb25zWzBdLndpbnNhZGRyWzFdID09IDApCi0JaXBjcF9hbGxvd29wdGlvbnNbMF0ud2luc2FkZHJbMF0gPSB3aW5zOwotICAgIGVsc2UKLQlpcGNwX2FsbG93b3B0aW9uc1swXS53aW5zYWRkclswXSA9IGlwY3BfYWxsb3dvcHRpb25zWzBdLndpbnNhZGRyWzFdOwotCi0gICAgLyogYWx3YXlzIHNldCB0aGUgc2Vjb25kYXJ5IGFkZHJlc3MgdmFsdWUuICovCi0gICAgaXBjcF9hbGxvd29wdGlvbnNbMF0ud2luc2FkZHJbMV0gPSB3aW5zOwotCi0gICAgcmV0dXJuICgxKTsKLX0KLQotLyoKLSAqIHNldGlwYWRkciAtIFNldCB0aGUgSVAgYWRkcmVzcwotICogSWYgZG9pdCBpcyAwLCB0aGUgY2FsbCBpcyB0byBjaGVjayB3aGV0aGVyIHRoaXMgb3B0aW9uIGlzCi0gKiBwb3RlbnRpYWxseSBhbiBJUCBhZGRyZXNzIHNwZWNpZmljYXRpb24uCi0gKiBOb3Qgc3RhdGljIHNvIHRoYXQgcGx1Z2lucyBjYW4gY2FsbCBpdCB0byBzZXQgdGhlIGFkZHJlc3NlcwotICovCi1pbnQKLXNldGlwYWRkcihhcmcsIGFyZ3YsIGRvaXQpCi0gICAgY2hhciAqYXJnOwotICAgIGNoYXIgKiphcmd2OwotICAgIGludCBkb2l0OwotewotICAgIHN0cnVjdCBob3N0ZW50ICpocDsKLSAgICBjaGFyICpjb2xvbjsKLSAgICB1X2ludDMyX3QgbG9jYWwsIHJlbW90ZTsKLSAgICBpcGNwX29wdGlvbnMgKndvID0gJmlwY3Bfd2FudG9wdGlvbnNbMF07Ci0gICAgc3RhdGljIGludCBwcmlvX2xvY2FsID0gMCwgcHJpb19yZW1vdGUgPSAwOwotCi0gICAgLyoKLSAgICAgKiBJUCBhZGRyZXNzIHBhaXIgc2VwYXJhdGVkIGJ5ICI6Ii4KLSAgICAgKi8KLSAgICBpZiAoKGNvbG9uID0gc3RyY2hyKGFyZywgJzonKSkgPT0gTlVMTCkKLQlyZXR1cm4gMDsKLSAgICBpZiAoIWRvaXQpCi0JcmV0dXJuIDE7Ci0gIAotICAgIC8qCi0gICAgICogSWYgY29sb24gZmlyc3QgY2hhcmFjdGVyLCB0aGVuIG5vIGxvY2FsIGFkZHIuCi0gICAgICovCi0gICAgaWYgKGNvbG9uICE9IGFyZyAmJiBvcHRpb25fcHJpb3JpdHkgPj0gcHJpb19sb2NhbCkgewotCSpjb2xvbiA9ICdcMCc7Ci0JaWYgKChsb2NhbCA9IGluZXRfYWRkcihhcmcpKSA9PSAodV9pbnQzMl90KSAtMSkgewotCSAgICBpZiAoKGhwID0gZ2V0aG9zdGJ5bmFtZShhcmcpKSA9PSBOVUxMKSB7Ci0JCW9wdGlvbl9lcnJvcigidW5rbm93biBob3N0OiAlcyIsIGFyZyk7Ci0JCXJldHVybiAwOwotCSAgICB9Ci0JICAgIGxvY2FsID0gKih1X2ludDMyX3QgKilocC0+aF9hZGRyOwotCX0KLQlpZiAoYmFkX2lwX2FkcnMobG9jYWwpKSB7Ci0JICAgIG9wdGlvbl9lcnJvcigiYmFkIGxvY2FsIElQIGFkZHJlc3MgJXMiLCBpcF9udG9hKGxvY2FsKSk7Ci0JICAgIHJldHVybiAwOwotCX0KLQlpZiAobG9jYWwgIT0gMCkKLQkgICAgd28tPm91cmFkZHIgPSBsb2NhbDsKLQkqY29sb24gPSAnOic7Ci0JcHJpb19sb2NhbCA9IG9wdGlvbl9wcmlvcml0eTsKLSAgICB9Ci0gIAotICAgIC8qCi0gICAgICogSWYgY29sb24gbGFzdCBjaGFyYWN0ZXIsIHRoZW4gbm8gcmVtb3RlIGFkZHIuCi0gICAgICovCi0gICAgaWYgKCorK2NvbG9uICE9ICdcMCcgJiYgb3B0aW9uX3ByaW9yaXR5ID49IHByaW9fcmVtb3RlKSB7Ci0JaWYgKChyZW1vdGUgPSBpbmV0X2FkZHIoY29sb24pKSA9PSAodV9pbnQzMl90KSAtMSkgewotCSAgICBpZiAoKGhwID0gZ2V0aG9zdGJ5bmFtZShjb2xvbikpID09IE5VTEwpIHsKLQkJb3B0aW9uX2Vycm9yKCJ1bmtub3duIGhvc3Q6ICVzIiwgY29sb24pOwotCQlyZXR1cm4gMDsKLQkgICAgfQotCSAgICByZW1vdGUgPSAqKHVfaW50MzJfdCAqKWhwLT5oX2FkZHI7Ci0JICAgIGlmIChyZW1vdGVfbmFtZVswXSA9PSAwKQotCQlzdHJsY3B5KHJlbW90ZV9uYW1lLCBjb2xvbiwgc2l6ZW9mKHJlbW90ZV9uYW1lKSk7Ci0JfQotCWlmIChiYWRfaXBfYWRycyhyZW1vdGUpKSB7Ci0JICAgIG9wdGlvbl9lcnJvcigiYmFkIHJlbW90ZSBJUCBhZGRyZXNzICVzIiwgaXBfbnRvYShyZW1vdGUpKTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCWlmIChyZW1vdGUgIT0gMCkKLQkgICAgd28tPmhpc2FkZHIgPSByZW1vdGU7Ci0JcHJpb19yZW1vdGUgPSBvcHRpb25fcHJpb3JpdHk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludGlwYWRkcihvcHQsIHByaW50ZXIsIGFyZykKLSAgICBvcHRpb25fdCAqb3B0OwotICAgIHZvaWQgKCpwcmludGVyKSBfX1AoKHZvaWQgKiwgY2hhciAqLCAuLi4pKTsKLSAgICB2b2lkICphcmc7Ci17Ci0JaXBjcF9vcHRpb25zICp3byA9ICZpcGNwX3dhbnRvcHRpb25zWzBdOwotCi0JaWYgKHdvLT5vdXJhZGRyICE9IDApCi0JCXByaW50ZXIoYXJnLCAiJUkiLCB3by0+b3VyYWRkcik7Ci0JcHJpbnRlcihhcmcsICI6Iik7Ci0JaWYgKHdvLT5oaXNhZGRyICE9IDApCi0JCXByaW50ZXIoYXJnLCAiJUkiLCB3by0+aGlzYWRkcik7Ci19Ci0KLS8qCi0gKiBzZXRuZXRtYXNrIC0gc2V0IHRoZSBuZXRtYXNrIHRvIGJlIHVzZWQgb24gdGhlIGludGVyZmFjZS4KLSAqLwotc3RhdGljIGludAotc2V0bmV0bWFzayhhcmd2KQotICAgIGNoYXIgKiphcmd2OwotewotICAgIHVfaW50MzJfdCBtYXNrOwotICAgIGludCBuOwotICAgIGNoYXIgKnA7Ci0KLSAgICAvKgotICAgICAqIFVuZm9ydHVuYXRlbHksIGlmIHdlIHVzZSBpbmV0X2FkZHIsIHdlIGNhbid0IHRlbGwgd2hldGhlcgotICAgICAqIGEgcmVzdWx0IG9mIGFsbCAxcyBpcyBhbiBlcnJvciBvciBhIHZhbGlkIDI1NS4yNTUuMjU1LjI1NS4KLSAgICAgKi8KLSAgICBwID0gKmFyZ3Y7Ci0gICAgbiA9IHBhcnNlX2RvdHRlZF9pcChwLCAmbWFzayk7Ci0KLSAgICBtYXNrID0gaHRvbmwobWFzayk7Ci0KLSAgICBpZiAobiA9PSAwIHx8IHBbbl0gIT0gMCB8fCAobmV0bWFzayAmIH5tYXNrKSAhPSAwKSB7Ci0Jb3B0aW9uX2Vycm9yKCJpbnZhbGlkIG5ldG1hc2sgdmFsdWUgJyVzJyIsICphcmd2KTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBuZXRtYXNrID0gbWFzazsKLSAgICBzbHByaW50ZihuZXRtYXNrX3N0ciwgc2l6ZW9mKG5ldG1hc2tfc3RyKSwgIiVJIiwgbWFzayk7Ci0KLSAgICByZXR1cm4gKDEpOwotfQotCi1pbnQKLXBhcnNlX2RvdHRlZF9pcChwLCB2cCkKLSAgICBjaGFyICpwOwotICAgIHVfaW50MzJfdCAqdnA7Ci17Ci0gICAgaW50IG47Ci0gICAgdV9pbnQzMl90IHYsIGI7Ci0gICAgY2hhciAqZW5kcCwgKnAwID0gcDsKLQotICAgIHYgPSAwOwotICAgIGZvciAobiA9IDM7OyAtLW4pIHsKLQliID0gc3RydG91bChwLCAmZW5kcCwgMCk7Ci0JaWYgKGVuZHAgPT0gcCkKLQkgICAgcmV0dXJuIDA7Ci0JaWYgKGIgPiAyNTUpIHsKLQkgICAgaWYgKG4gPCAzKQotCQlyZXR1cm4gMDsKLQkgICAgLyogYWNjZXB0IGUuZy4gMHhmZmZmZmYwMCAqLwotCSAgICAqdnAgPSBiOwotCSAgICByZXR1cm4gZW5kcCAtIHAwOwotCX0KLQl2IHw9IGIgPDwgKG4gKiA4KTsKLQlwID0gZW5kcDsKLQlpZiAobiA9PSAwKQotCSAgICBicmVhazsKLQlpZiAoKnAgIT0gJy4nKQotCSAgICByZXR1cm4gMDsKLQkrK3A7Ci0gICAgfQotICAgICp2cCA9IHY7Ci0gICAgcmV0dXJuIHAgLSBwMDsKLX0KLQotCi0vKgotICogaXBjcF9pbml0IC0gSW5pdGlhbGl6ZSBJUENQLgotICovCi1zdGF0aWMgdm9pZAotaXBjcF9pbml0KHVuaXQpCi0gICAgaW50IHVuaXQ7Ci17Ci0gICAgZnNtICpmID0gJmlwY3BfZnNtW3VuaXRdOwotICAgIGlwY3Bfb3B0aW9ucyAqd28gPSAmaXBjcF93YW50b3B0aW9uc1t1bml0XTsKLSAgICBpcGNwX29wdGlvbnMgKmFvID0gJmlwY3BfYWxsb3dvcHRpb25zW3VuaXRdOwotCi0gICAgZi0+dW5pdCA9IHVuaXQ7Ci0gICAgZi0+cHJvdG9jb2wgPSBQUFBfSVBDUDsKLSAgICBmLT5jYWxsYmFja3MgPSAmaXBjcF9jYWxsYmFja3M7Ci0gICAgZnNtX2luaXQoJmlwY3BfZnNtW3VuaXRdKTsKLQotICAgIC8qCi0gICAgICogU29tZSAzRyBtb2RlbXMgdXNlIHJlcGVhdGVkIElQQ1AgTkFLcyBhcyBhIHdheSBvZiBzdGFsbGluZwotICAgICAqIHVudGlsIHRoZXkgY2FuIGNvbnRhY3QgYSBzZXJ2ZXIgb24gdGhlIG5ldHdvcmssIHNvIHdlIGluY3JlYXNlCi0gICAgICogdGhlIGRlZmF1bHQgbnVtYmVyIG9mIE5BS3Mgd2UgYWNjZXB0IGJlZm9yZSB3ZSBzdGFydCB0cmVhdGluZwotICAgICAqIHRoZW0gYXMgcmVqZWN0cy4KLSAgICAgKi8KLSAgICBmLT5tYXhuYWtsb29wcyA9IDEwMDsKLQotICAgIG1lbXNldCh3bywgMCwgc2l6ZW9mKCp3bykpOwotICAgIG1lbXNldChhbywgMCwgc2l6ZW9mKCphbykpOwotCi0gICAgd28tPm5lZ19hZGRyID0gd28tPm9sZF9hZGRycyA9IDE7Ci0gICAgd28tPm5lZ192aiA9IDE7Ci0gICAgd28tPnZqX3Byb3RvY29sID0gSVBDUF9WSl9DT01QOwotICAgIHdvLT5tYXhzbG90aW5kZXggPSBNQVhfU1RBVEVTIC0gMTsgLyogcmVhbGx5IG1heCBpbmRleCAqLwotICAgIHdvLT5jZmxhZyA9IDE7Ci0KLQotICAgIC8qIG1heCBzbG90cyBhbmQgc2xvdC1pZCBjb21wcmVzc2lvbiBhcmUgY3VycmVudGx5IGhhcmR3aXJlZCBpbiAqLwotICAgIC8qIHBwcF9pZi5jIHRvIDE2IGFuZCAxLCB0aGlzIG5lZWRzIHRvIGJlIGNoYW5nZWQgKGFtb25nIG90aGVyICovCi0gICAgLyogdGhpbmdzKSBnbWMgKi8KLQotICAgIGFvLT5uZWdfYWRkciA9IGFvLT5vbGRfYWRkcnMgPSAxOwotICAgIGFvLT5uZWdfdmogPSAxOwotICAgIGFvLT5tYXhzbG90aW5kZXggPSBNQVhfU1RBVEVTIC0gMTsKLSAgICBhby0+Y2ZsYWcgPSAxOwotCi0gICAgLyoKLSAgICAgKiBYWFggVGhlc2UgY29udHJvbCB3aGV0aGVyIHRoZSB1c2VyIG1heSB1c2UgdGhlIHByb3h5YXJwCi0gICAgICogYW5kIGRlZmF1bHRyb3V0ZSBvcHRpb25zLgotICAgICAqLwotICAgIGFvLT5wcm94eV9hcnAgPSAxOwotICAgIGFvLT5kZWZhdWx0X3JvdXRlID0gMTsKLX0KLQotCi0vKgotICogaXBjcF9vcGVuIC0gSVBDUCBpcyBhbGxvd2VkIHRvIGNvbWUgdXAuCi0gKi8KLXN0YXRpYyB2b2lkCi1pcGNwX29wZW4odW5pdCkKLSAgICBpbnQgdW5pdDsKLXsKLSAgICBmc21fb3BlbigmaXBjcF9mc21bdW5pdF0pOwotICAgIGlwY3BfaXNfb3BlbiA9IDE7Ci19Ci0KLQotLyoKLSAqIGlwY3BfY2xvc2UgLSBUYWtlIElQQ1AgZG93bi4KLSAqLwotc3RhdGljIHZvaWQKLWlwY3BfY2xvc2UodW5pdCwgcmVhc29uKQotICAgIGludCB1bml0OwotICAgIGNoYXIgKnJlYXNvbjsKLXsKLSAgICBmc21fY2xvc2UoJmlwY3BfZnNtW3VuaXRdLCByZWFzb24pOwotfQotCi0KLS8qCi0gKiBpcGNwX2xvd2VydXAgLSBUaGUgbG93ZXIgbGF5ZXIgaXMgdXAuCi0gKi8KLXN0YXRpYyB2b2lkCi1pcGNwX2xvd2VydXAodW5pdCkKLSAgICBpbnQgdW5pdDsKLXsKLSAgICBmc21fbG93ZXJ1cCgmaXBjcF9mc21bdW5pdF0pOwotfQotCi0KLS8qCi0gKiBpcGNwX2xvd2VyZG93biAtIFRoZSBsb3dlciBsYXllciBpcyBkb3duLgotICovCi1zdGF0aWMgdm9pZAotaXBjcF9sb3dlcmRvd24odW5pdCkKLSAgICBpbnQgdW5pdDsKLXsKLSAgICBmc21fbG93ZXJkb3duKCZpcGNwX2ZzbVt1bml0XSk7Ci19Ci0KLQotLyoKLSAqIGlwY3BfaW5wdXQgLSBJbnB1dCBJUENQIHBhY2tldC4KLSAqLwotc3RhdGljIHZvaWQKLWlwY3BfaW5wdXQodW5pdCwgcCwgbGVuKQotICAgIGludCB1bml0OwotICAgIHVfY2hhciAqcDsKLSAgICBpbnQgbGVuOwotewotICAgIGZzbV9pbnB1dCgmaXBjcF9mc21bdW5pdF0sIHAsIGxlbik7Ci19Ci0KLQotLyoKLSAqIGlwY3BfcHJvdHJlaiAtIEEgUHJvdG9jb2wtUmVqZWN0IHdhcyByZWNlaXZlZCBmb3IgSVBDUC4KLSAqCi0gKiBQcmV0ZW5kIHRoZSBsb3dlciBsYXllciB3ZW50IGRvd24sIHNvIHdlIHNodXQgdXAuCi0gKi8KLXN0YXRpYyB2b2lkCi1pcGNwX3Byb3RyZWoodW5pdCkKLSAgICBpbnQgdW5pdDsKLXsKLSAgICBmc21fbG93ZXJkb3duKCZpcGNwX2ZzbVt1bml0XSk7Ci19Ci0KLQotLyoKLSAqIGlwY3BfcmVzZXRjaSAtIFJlc2V0IG91ciBDSS4KLSAqIENhbGxlZCBieSBmc21fc2NvbmZyZXEsIFNlbmQgQ29uZmlndXJlIFJlcXVlc3QuCi0gKi8KLXN0YXRpYyB2b2lkCi1pcGNwX3Jlc2V0Y2koZikKLSAgICBmc20gKmY7Ci17Ci0gICAgaXBjcF9vcHRpb25zICp3byA9ICZpcGNwX3dhbnRvcHRpb25zW2YtPnVuaXRdOwotICAgIGlwY3Bfb3B0aW9ucyAqZ28gPSAmaXBjcF9nb3RvcHRpb25zW2YtPnVuaXRdOwotICAgIGlwY3Bfb3B0aW9ucyAqYW8gPSAmaXBjcF9hbGxvd29wdGlvbnNbZi0+dW5pdF07Ci0KLSAgICB3by0+cmVxX2FkZHIgPSAod28tPm5lZ19hZGRyIHx8IHdvLT5vbGRfYWRkcnMpICYmCi0JKGFvLT5uZWdfYWRkciB8fCBhby0+b2xkX2FkZHJzKTsKLSAgICBpZiAod28tPm91cmFkZHIgPT0gMCkKLQl3by0+YWNjZXB0X2xvY2FsID0gMTsKLSAgICBpZiAod28tPmhpc2FkZHIgPT0gMCkKLQl3by0+YWNjZXB0X3JlbW90ZSA9IDE7Ci0gICAgd28tPnJlcV9kbnMxID0gdXNlcGVlcmRuczsJLyogUmVxdWVzdCBETlMgYWRkcmVzc2VzIGZyb20gdGhlIHBlZXIgKi8KLSAgICB3by0+cmVxX2RuczIgPSB1c2VwZWVyZG5zOwotICAgICpnbyA9ICp3bzsKLSAgICBpZiAoIWFza19mb3JfbG9jYWwpCi0JZ28tPm91cmFkZHIgPSAwOwotICAgIGlmIChpcF9jaG9vc2VfaG9vaykgewotCWlwX2Nob29zZV9ob29rKCZ3by0+aGlzYWRkcik7Ci0JaWYgKHdvLT5oaXNhZGRyKSB7Ci0JICAgIHdvLT5hY2NlcHRfcmVtb3RlID0gMDsKLQl9Ci0gICAgfQotICAgIEJaRVJPKCZpcGNwX2hpc29wdGlvbnNbZi0+dW5pdF0sIHNpemVvZihpcGNwX29wdGlvbnMpKTsKLX0KLQotCi0vKgotICogaXBjcF9jaWxlbiAtIFJldHVybiBsZW5ndGggb2Ygb3VyIENJLgotICogQ2FsbGVkIGJ5IGZzbV9zY29uZnJlcSwgU2VuZCBDb25maWd1cmUgUmVxdWVzdC4KLSAqLwotc3RhdGljIGludAotaXBjcF9jaWxlbihmKQotICAgIGZzbSAqZjsKLXsKLSAgICBpcGNwX29wdGlvbnMgKmdvID0gJmlwY3BfZ290b3B0aW9uc1tmLT51bml0XTsKLSAgICBpcGNwX29wdGlvbnMgKndvID0gJmlwY3Bfd2FudG9wdGlvbnNbZi0+dW5pdF07Ci0gICAgaXBjcF9vcHRpb25zICpobyA9ICZpcGNwX2hpc29wdGlvbnNbZi0+dW5pdF07Ci0KLSNkZWZpbmUgTEVOQ0lBRERSUyhuZWcpCQkobmVnID8gQ0lMRU5fQUREUlMgOiAwKQotI2RlZmluZSBMRU5DSVZKKG5lZywgb2xkKQkobmVnID8gKG9sZD8gQ0lMRU5fQ09NUFJFU1MgOiBDSUxFTl9WSikgOiAwKQotI2RlZmluZSBMRU5DSUFERFIobmVnKQkJKG5lZyA/IENJTEVOX0FERFIgOiAwKQotI2RlZmluZSBMRU5DSUROUyhuZWcpCQlMRU5DSUFERFIobmVnKQotI2RlZmluZSBMRU5DSVdJTlMobmVnKQkJTEVOQ0lBRERSKG5lZykKLQotICAgIC8qCi0gICAgICogRmlyc3Qgc2VlIGlmIHdlIHdhbnQgdG8gY2hhbmdlIG91ciBvcHRpb25zIHRvIHRoZSBvbGQKLSAgICAgKiBmb3JtcyBiZWNhdXNlIHdlIGhhdmUgcmVjZWl2ZWQgb2xkIGZvcm1zIGZyb20gdGhlIHBlZXIuCi0gICAgICovCi0gICAgaWYgKGdvLT5uZWdfYWRkciAmJiBnby0+b2xkX2FkZHJzICYmICFoby0+bmVnX2FkZHIgJiYgaG8tPm9sZF9hZGRycykKLQlnby0+bmVnX2FkZHIgPSAwOwotICAgIGlmICh3by0+bmVnX3ZqICYmICFnby0+bmVnX3ZqICYmICFnby0+b2xkX3ZqKSB7Ci0JLyogdHJ5IGFuIG9sZGVyIHN0eWxlIG9mIFZKIG5lZ290aWF0aW9uICovCi0JLyogdXNlIHRoZSBvbGQgc3R5bGUgb25seSBpZiB0aGUgcGVlciBkaWQgKi8KLQlpZiAoaG8tPm5lZ192aiAmJiBoby0+b2xkX3ZqKSB7Ci0JICAgIGdvLT5uZWdfdmogPSAxOwotCSAgICBnby0+b2xkX3ZqID0gMTsKLQkgICAgZ28tPnZqX3Byb3RvY29sID0gaG8tPnZqX3Byb3RvY29sOwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gKExFTkNJQUREUlMoIWdvLT5uZWdfYWRkciAmJiBnby0+b2xkX2FkZHJzKSArCi0JICAgIExFTkNJVkooZ28tPm5lZ192aiwgZ28tPm9sZF92aikgKwotCSAgICBMRU5DSUFERFIoZ28tPm5lZ19hZGRyKSArCi0JICAgIExFTkNJRE5TKGdvLT5yZXFfZG5zMSkgKwotCSAgICBMRU5DSUROUyhnby0+cmVxX2RuczIpICsKLQkgICAgTEVOQ0lXSU5TKGdvLT53aW5zYWRkclswXSkgKwotCSAgICBMRU5DSVdJTlMoZ28tPndpbnNhZGRyWzFdKSkgOwotfQotCi0KLS8qCi0gKiBpcGNwX2FkZGNpIC0gQWRkIG91ciBkZXNpcmVkIENJcyB0byBhIHBhY2tldC4KLSAqIENhbGxlZCBieSBmc21fc2NvbmZyZXEsIFNlbmQgQ29uZmlndXJlIFJlcXVlc3QuCi0gKi8KLXN0YXRpYyB2b2lkCi1pcGNwX2FkZGNpKGYsIHVjcCwgbGVucCkKLSAgICBmc20gKmY7Ci0gICAgdV9jaGFyICp1Y3A7Ci0gICAgaW50ICpsZW5wOwotewotICAgIGlwY3Bfb3B0aW9ucyAqZ28gPSAmaXBjcF9nb3RvcHRpb25zW2YtPnVuaXRdOwotICAgIGludCBsZW4gPSAqbGVucDsKLQotI2RlZmluZSBBRERDSUFERFJTKG9wdCwgbmVnLCB2YWwxLCB2YWwyKSBcCi0gICAgaWYgKG5lZykgeyBcCi0JaWYgKGxlbiA+PSBDSUxFTl9BRERSUykgeyBcCi0JICAgIHVfaW50MzJfdCBsOyBcCi0JICAgIFBVVENIQVIob3B0LCB1Y3ApOyBcCi0JICAgIFBVVENIQVIoQ0lMRU5fQUREUlMsIHVjcCk7IFwKLQkgICAgbCA9IG50b2hsKHZhbDEpOyBcCi0JICAgIFBVVExPTkcobCwgdWNwKTsgXAotCSAgICBsID0gbnRvaGwodmFsMik7IFwKLQkgICAgUFVUTE9ORyhsLCB1Y3ApOyBcCi0JICAgIGxlbiAtPSBDSUxFTl9BRERSUzsgXAotCX0gZWxzZSBcCi0JICAgIGdvLT5vbGRfYWRkcnMgPSAwOyBcCi0gICAgfQotCi0jZGVmaW5lIEFERENJVkoob3B0LCBuZWcsIHZhbCwgb2xkLCBtYXhzbG90aW5kZXgsIGNmbGFnKSBcCi0gICAgaWYgKG5lZykgeyBcCi0JaW50IHZqbGVuID0gb2xkPyBDSUxFTl9DT01QUkVTUyA6IENJTEVOX1ZKOyBcCi0JaWYgKGxlbiA+PSB2amxlbikgeyBcCi0JICAgIFBVVENIQVIob3B0LCB1Y3ApOyBcCi0JICAgIFBVVENIQVIodmpsZW4sIHVjcCk7IFwKLQkgICAgUFVUU0hPUlQodmFsLCB1Y3ApOyBcCi0JICAgIGlmICghb2xkKSB7IFwKLQkJUFVUQ0hBUihtYXhzbG90aW5kZXgsIHVjcCk7IFwKLQkJUFVUQ0hBUihjZmxhZywgdWNwKTsgXAotCSAgICB9IFwKLQkgICAgbGVuIC09IHZqbGVuOyBcCi0JfSBlbHNlIFwKLQkgICAgbmVnID0gMDsgXAotICAgIH0KLQotI2RlZmluZSBBRERDSUFERFIob3B0LCBuZWcsIHZhbCkgXAotICAgIGlmIChuZWcpIHsgXAotCWlmIChsZW4gPj0gQ0lMRU5fQUREUikgeyBcCi0JICAgIHVfaW50MzJfdCBsOyBcCi0JICAgIFBVVENIQVIob3B0LCB1Y3ApOyBcCi0JICAgIFBVVENIQVIoQ0lMRU5fQUREUiwgdWNwKTsgXAotCSAgICBsID0gbnRvaGwodmFsKTsgXAotCSAgICBQVVRMT05HKGwsIHVjcCk7IFwKLQkgICAgbGVuIC09IENJTEVOX0FERFI7IFwKLQl9IGVsc2UgXAotCSAgICBuZWcgPSAwOyBcCi0gICAgfQotCi0jZGVmaW5lIEFERENJRE5TKG9wdCwgbmVnLCBhZGRyKSBcCi0gICAgaWYgKG5lZykgeyBcCi0JaWYgKGxlbiA+PSBDSUxFTl9BRERSKSB7IFwKLQkgICAgdV9pbnQzMl90IGw7IFwKLQkgICAgUFVUQ0hBUihvcHQsIHVjcCk7IFwKLQkgICAgUFVUQ0hBUihDSUxFTl9BRERSLCB1Y3ApOyBcCi0JICAgIGwgPSBudG9obChhZGRyKTsgXAotCSAgICBQVVRMT05HKGwsIHVjcCk7IFwKLQkgICAgbGVuIC09IENJTEVOX0FERFI7IFwKLQl9IGVsc2UgXAotCSAgICBuZWcgPSAwOyBcCi0gICAgfQotCi0jZGVmaW5lIEFERENJV0lOUyhvcHQsIGFkZHIpIFwKLSAgICBpZiAoYWRkcikgeyBcCi0JaWYgKGxlbiA+PSBDSUxFTl9BRERSKSB7IFwKLQkgICAgdV9pbnQzMl90IGw7IFwKLQkgICAgUFVUQ0hBUihvcHQsIHVjcCk7IFwKLQkgICAgUFVUQ0hBUihDSUxFTl9BRERSLCB1Y3ApOyBcCi0JICAgIGwgPSBudG9obChhZGRyKTsgXAotCSAgICBQVVRMT05HKGwsIHVjcCk7IFwKLQkgICAgbGVuIC09IENJTEVOX0FERFI7IFwKLQl9IGVsc2UgXAotCSAgICBhZGRyID0gMDsgXAotICAgIH0KLQotICAgIEFERENJQUREUlMoQ0lfQUREUlMsICFnby0+bmVnX2FkZHIgJiYgZ28tPm9sZF9hZGRycywgZ28tPm91cmFkZHIsCi0JICAgICAgIGdvLT5oaXNhZGRyKTsKLQotICAgIEFERENJVkooQ0lfQ09NUFJFU1NUWVBFLCBnby0+bmVnX3ZqLCBnby0+dmpfcHJvdG9jb2wsIGdvLT5vbGRfdmosCi0JICAgIGdvLT5tYXhzbG90aW5kZXgsIGdvLT5jZmxhZyk7Ci0KLSAgICBBRERDSUFERFIoQ0lfQUREUiwgZ28tPm5lZ19hZGRyLCBnby0+b3VyYWRkcik7Ci0KLSAgICBBRERDSUROUyhDSV9NU19ETlMxLCBnby0+cmVxX2RuczEsIGdvLT5kbnNhZGRyWzBdKTsKLQotICAgIEFERENJRE5TKENJX01TX0ROUzIsIGdvLT5yZXFfZG5zMiwgZ28tPmRuc2FkZHJbMV0pOwotCi0gICAgQUREQ0lXSU5TKENJX01TX1dJTlMxLCBnby0+d2luc2FkZHJbMF0pOwotCi0gICAgQUREQ0lXSU5TKENJX01TX1dJTlMyLCBnby0+d2luc2FkZHJbMV0pOwotICAgIAotICAgICpsZW5wIC09IGxlbjsKLX0KLQotCi0vKgotICogaXBjcF9hY2tjaSAtIEFjayBvdXIgQ0lzLgotICogQ2FsbGVkIGJ5IGZzbV9yY29uZmFjaywgUmVjZWl2ZSBDb25maWd1cmUgQUNLLgotICoKLSAqIFJldHVybnM6Ci0gKgkwIC0gQWNrIHdhcyBiYWQuCi0gKgkxIC0gQWNrIHdhcyBnb29kLgotICovCi1zdGF0aWMgaW50Ci1pcGNwX2Fja2NpKGYsIHAsIGxlbikKLSAgICBmc20gKmY7Ci0gICAgdV9jaGFyICpwOwotICAgIGludCBsZW47Ci17Ci0gICAgaXBjcF9vcHRpb25zICpnbyA9ICZpcGNwX2dvdG9wdGlvbnNbZi0+dW5pdF07Ci0gICAgdV9zaG9ydCBjaWxlbiwgY2l0eXBlLCBjaXNob3J0OwotICAgIHVfaW50MzJfdCBjaWxvbmc7Ci0gICAgdV9jaGFyIGNpbWF4c2xvdGluZGV4LCBjaWNmbGFnOwotCi0gICAgLyoKLSAgICAgKiBDSXMgbXVzdCBiZSBpbiBleGFjdGx5IHRoZSBzYW1lIG9yZGVyIHRoYXQgd2Ugc2VudC4uLgotICAgICAqIENoZWNrIHBhY2tldCBsZW5ndGggYW5kIENJIGxlbmd0aCBhdCBlYWNoIHN0ZXAuCi0gICAgICogSWYgd2UgZmluZCBhbnkgZGV2aWF0aW9ucywgdGhlbiB0aGlzIHBhY2tldCBpcyBiYWQuCi0gICAgICovCi0KLSNkZWZpbmUgQUNLQ0lBRERSUyhvcHQsIG5lZywgdmFsMSwgdmFsMikgXAotICAgIGlmIChuZWcpIHsgXAotCXVfaW50MzJfdCBsOyBcCi0JaWYgKChsZW4gLT0gQ0lMRU5fQUREUlMpIDwgMCkgXAotCSAgICBnb3RvIGJhZDsgXAotCUdFVENIQVIoY2l0eXBlLCBwKTsgXAotCUdFVENIQVIoY2lsZW4sIHApOyBcCi0JaWYgKGNpbGVuICE9IENJTEVOX0FERFJTIHx8IFwKLQkgICAgY2l0eXBlICE9IG9wdCkgXAotCSAgICBnb3RvIGJhZDsgXAotCUdFVExPTkcobCwgcCk7IFwKLQljaWxvbmcgPSBodG9ubChsKTsgXAotCWlmICh2YWwxICE9IGNpbG9uZykgXAotCSAgICBnb3RvIGJhZDsgXAotCUdFVExPTkcobCwgcCk7IFwKLQljaWxvbmcgPSBodG9ubChsKTsgXAotCWlmICh2YWwyICE9IGNpbG9uZykgXAotCSAgICBnb3RvIGJhZDsgXAotICAgIH0KLQotI2RlZmluZSBBQ0tDSVZKKG9wdCwgbmVnLCB2YWwsIG9sZCwgbWF4c2xvdGluZGV4LCBjZmxhZykgXAotICAgIGlmIChuZWcpIHsgXAotCWludCB2amxlbiA9IG9sZD8gQ0lMRU5fQ09NUFJFU1MgOiBDSUxFTl9WSjsgXAotCWlmICgobGVuIC09IHZqbGVuKSA8IDApIFwKLQkgICAgZ290byBiYWQ7IFwKLQlHRVRDSEFSKGNpdHlwZSwgcCk7IFwKLQlHRVRDSEFSKGNpbGVuLCBwKTsgXAotCWlmIChjaWxlbiAhPSB2amxlbiB8fCBcCi0JICAgIGNpdHlwZSAhPSBvcHQpICBcCi0JICAgIGdvdG8gYmFkOyBcCi0JR0VUU0hPUlQoY2lzaG9ydCwgcCk7IFwKLQlpZiAoY2lzaG9ydCAhPSB2YWwpIFwKLQkgICAgZ290byBiYWQ7IFwKLQlpZiAoIW9sZCkgeyBcCi0JICAgIEdFVENIQVIoY2ltYXhzbG90aW5kZXgsIHApOyBcCi0JICAgIGlmIChjaW1heHNsb3RpbmRleCAhPSBtYXhzbG90aW5kZXgpIFwKLQkJZ290byBiYWQ7IFwKLQkgICAgR0VUQ0hBUihjaWNmbGFnLCBwKTsgXAotCSAgICBpZiAoY2ljZmxhZyAhPSBjZmxhZykgXAotCQlnb3RvIGJhZDsgXAotCX0gXAotICAgIH0KLQotI2RlZmluZSBBQ0tDSUFERFIob3B0LCBuZWcsIHZhbCkgXAotICAgIGlmIChuZWcpIHsgXAotCXVfaW50MzJfdCBsOyBcCi0JaWYgKChsZW4gLT0gQ0lMRU5fQUREUikgPCAwKSBcCi0JICAgIGdvdG8gYmFkOyBcCi0JR0VUQ0hBUihjaXR5cGUsIHApOyBcCi0JR0VUQ0hBUihjaWxlbiwgcCk7IFwKLQlpZiAoY2lsZW4gIT0gQ0lMRU5fQUREUiB8fCBcCi0JICAgIGNpdHlwZSAhPSBvcHQpIFwKLQkgICAgZ290byBiYWQ7IFwKLQlHRVRMT05HKGwsIHApOyBcCi0JY2lsb25nID0gaHRvbmwobCk7IFwKLQlpZiAodmFsICE9IGNpbG9uZykgXAotCSAgICBnb3RvIGJhZDsgXAotICAgIH0KLQotI2RlZmluZSBBQ0tDSUROUyhvcHQsIG5lZywgYWRkcikgXAotICAgIGlmIChuZWcpIHsgXAotCXVfaW50MzJfdCBsOyBcCi0JaWYgKChsZW4gLT0gQ0lMRU5fQUREUikgPCAwKSBcCi0JICAgIGdvdG8gYmFkOyBcCi0JR0VUQ0hBUihjaXR5cGUsIHApOyBcCi0JR0VUQ0hBUihjaWxlbiwgcCk7IFwKLQlpZiAoY2lsZW4gIT0gQ0lMRU5fQUREUiB8fCBjaXR5cGUgIT0gb3B0KSBcCi0JICAgIGdvdG8gYmFkOyBcCi0JR0VUTE9ORyhsLCBwKTsgXAotCWNpbG9uZyA9IGh0b25sKGwpOyBcCi0JaWYgKGFkZHIgIT0gY2lsb25nKSBcCi0JICAgIGdvdG8gYmFkOyBcCi0gICAgfQotCi0jZGVmaW5lIEFDS0NJV0lOUyhvcHQsIGFkZHIpIFwKLSAgICBpZiAoYWRkcikgeyBcCi0JdV9pbnQzMl90IGw7IFwKLQlpZiAoKGxlbiAtPSBDSUxFTl9BRERSKSA8IDApIFwKLQkgICAgZ290byBiYWQ7IFwKLQlHRVRDSEFSKGNpdHlwZSwgcCk7IFwKLQlHRVRDSEFSKGNpbGVuLCBwKTsgXAotCWlmIChjaWxlbiAhPSBDSUxFTl9BRERSIHx8IGNpdHlwZSAhPSBvcHQpIFwKLQkgICAgZ290byBiYWQ7IFwKLQlHRVRMT05HKGwsIHApOyBcCi0JY2lsb25nID0gaHRvbmwobCk7IFwKLQlpZiAoYWRkciAhPSBjaWxvbmcpIFwKLQkgICAgZ290byBiYWQ7IFwKLSAgICB9Ci0KLSAgICBBQ0tDSUFERFJTKENJX0FERFJTLCAhZ28tPm5lZ19hZGRyICYmIGdvLT5vbGRfYWRkcnMsIGdvLT5vdXJhZGRyLAotCSAgICAgICBnby0+aGlzYWRkcik7Ci0KLSAgICBBQ0tDSVZKKENJX0NPTVBSRVNTVFlQRSwgZ28tPm5lZ192aiwgZ28tPnZqX3Byb3RvY29sLCBnby0+b2xkX3ZqLAotCSAgICBnby0+bWF4c2xvdGluZGV4LCBnby0+Y2ZsYWcpOwotCi0gICAgQUNLQ0lBRERSKENJX0FERFIsIGdvLT5uZWdfYWRkciwgZ28tPm91cmFkZHIpOwotCi0gICAgQUNLQ0lETlMoQ0lfTVNfRE5TMSwgZ28tPnJlcV9kbnMxLCBnby0+ZG5zYWRkclswXSk7Ci0KLSAgICBBQ0tDSUROUyhDSV9NU19ETlMyLCBnby0+cmVxX2RuczIsIGdvLT5kbnNhZGRyWzFdKTsKLQotICAgIEFDS0NJV0lOUyhDSV9NU19XSU5TMSwgZ28tPndpbnNhZGRyWzBdKTsKLQotICAgIEFDS0NJV0lOUyhDSV9NU19XSU5TMiwgZ28tPndpbnNhZGRyWzFdKTsKLQotICAgIC8qCi0gICAgICogSWYgdGhlcmUgYXJlIGFueSByZW1haW5pbmcgQ0lzLCB0aGVuIHRoaXMgcGFja2V0IGlzIGJhZC4KLSAgICAgKi8KLSAgICBpZiAobGVuICE9IDApCi0JZ290byBiYWQ7Ci0gICAgcmV0dXJuICgxKTsKLQotYmFkOgotICAgIElQQ1BERUJVRygoImlwY3BfYWNrY2k6IHJlY2VpdmVkIGJhZCBBY2shIikpOwotICAgIHJldHVybiAoMCk7Ci19Ci0KLS8qCi0gKiBpcGNwX25ha2NpIC0gUGVlciBoYXMgc2VudCBhIE5BSyBmb3Igc29tZSBvZiBvdXIgQ0lzLgotICogVGhpcyBzaG91bGQgbm90IG1vZGlmeSBhbnkgc3RhdGUgaWYgdGhlIE5hayBpcyBiYWQKLSAqIG9yIGlmIElQQ1AgaXMgaW4gdGhlIE9QRU5FRCBzdGF0ZS4KLSAqIENhbGJhY2sgZnJvbSBmc21fcmNvbmZuYWtyZWogLSBSZWNlaXZlIENvbmZpZ3VyZS1OYWsgb3IgQ29uZmlndXJlLVJlamVjdC4KLSAqCi0gKiBSZXR1cm5zOgotICoJMCAtIE5hayB3YXMgYmFkLgotICoJMSAtIE5hayB3YXMgZ29vZC4KLSAqLwotc3RhdGljIGludAotaXBjcF9uYWtjaShmLCBwLCBsZW4sIHRyZWF0X2FzX3JlamVjdCkKLSAgICBmc20gKmY7Ci0gICAgdV9jaGFyICpwOwotICAgIGludCBsZW47Ci0gICAgaW50IHRyZWF0X2FzX3JlamVjdDsKLXsKLSAgICBpcGNwX29wdGlvbnMgKmdvID0gJmlwY3BfZ290b3B0aW9uc1tmLT51bml0XTsKLSAgICB1X2NoYXIgY2ltYXhzbG90aW5kZXgsIGNpY2ZsYWc7Ci0gICAgdV9jaGFyIGNpdHlwZSwgY2lsZW4sICpuZXh0OwotICAgIHVfc2hvcnQgY2lzaG9ydDsKLSAgICB1X2ludDMyX3QgY2lhZGRyMSwgY2lhZGRyMiwgbCwgY2lkbnNhZGRyOwotICAgIGlwY3Bfb3B0aW9ucyBubzsJCS8qIG9wdGlvbnMgd2UndmUgc2VlbiBOYWtzIGZvciAqLwotICAgIGlwY3Bfb3B0aW9ucyB0cnk7CQkvKiBvcHRpb25zIHRvIHJlcXVlc3QgbmV4dCB0aW1lICovCi0KLSAgICBCWkVSTygmbm8sIHNpemVvZihubykpOwotICAgIHRyeSA9ICpnbzsKLQotICAgIC8qCi0gICAgICogQW55IE5haydkIENJcyBtdXN0IGJlIGluIGV4YWN0bHkgdGhlIHNhbWUgb3JkZXIgdGhhdCB3ZSBzZW50LgotICAgICAqIENoZWNrIHBhY2tldCBsZW5ndGggYW5kIENJIGxlbmd0aCBhdCBlYWNoIHN0ZXAuCi0gICAgICogSWYgd2UgZmluZCBhbnkgZGV2aWF0aW9ucywgdGhlbiB0aGlzIHBhY2tldCBpcyBiYWQuCi0gICAgICovCi0jZGVmaW5lIE5BS0NJQUREUlMob3B0LCBuZWcsIGNvZGUpIFwKLSAgICBpZiAoKG5lZykgJiYgXAotCShjaWxlbiA9IHBbMV0pID09IENJTEVOX0FERFJTICYmIFwKLQlsZW4gPj0gY2lsZW4gJiYgXAotCXBbMF0gPT0gb3B0KSB7IFwKLQlsZW4gLT0gY2lsZW47IFwKLQlJTkNQVFIoMiwgcCk7IFwKLQlHRVRMT05HKGwsIHApOyBcCi0JY2lhZGRyMSA9IGh0b25sKGwpOyBcCi0JR0VUTE9ORyhsLCBwKTsgXAotCWNpYWRkcjIgPSBodG9ubChsKTsgXAotCW5vLm9sZF9hZGRycyA9IDE7IFwKLQljb2RlIFwKLSAgICB9Ci0KLSNkZWZpbmUgTkFLQ0lWSihvcHQsIG5lZywgY29kZSkgXAotICAgIGlmIChnby0+bmVnICYmIFwKLQkoKGNpbGVuID0gcFsxXSkgPT0gQ0lMRU5fQ09NUFJFU1MgfHwgY2lsZW4gPT0gQ0lMRU5fVkopICYmIFwKLQlsZW4gPj0gY2lsZW4gJiYgXAotCXBbMF0gPT0gb3B0KSB7IFwKLQlsZW4gLT0gY2lsZW47IFwKLQlJTkNQVFIoMiwgcCk7IFwKLQlHRVRTSE9SVChjaXNob3J0LCBwKTsgXAotCW5vLm5lZyA9IDE7IFwKLSAgICAgICAgY29kZSBcCi0gICAgfQotCi0jZGVmaW5lIE5BS0NJQUREUihvcHQsIG5lZywgY29kZSkgXAotICAgIGlmIChnby0+bmVnICYmIFwKLQkoY2lsZW4gPSBwWzFdKSA9PSBDSUxFTl9BRERSICYmIFwKLQlsZW4gPj0gY2lsZW4gJiYgXAotCXBbMF0gPT0gb3B0KSB7IFwKLQlsZW4gLT0gY2lsZW47IFwKLQlJTkNQVFIoMiwgcCk7IFwKLQlHRVRMT05HKGwsIHApOyBcCi0JY2lhZGRyMSA9IGh0b25sKGwpOyBcCi0Jbm8ubmVnID0gMTsgXAotCWNvZGUgXAotICAgIH0KLQotI2RlZmluZSBOQUtDSUROUyhvcHQsIG5lZywgY29kZSkgXAotICAgIGlmIChnby0+bmVnICYmIFwKLQkoKGNpbGVuID0gcFsxXSkgPT0gQ0lMRU5fQUREUikgJiYgXAotCWxlbiA+PSBjaWxlbiAmJiBcCi0JcFswXSA9PSBvcHQpIHsgXAotCWxlbiAtPSBjaWxlbjsgXAotCUlOQ1BUUigyLCBwKTsgXAotCUdFVExPTkcobCwgcCk7IFwKLQljaWRuc2FkZHIgPSBodG9ubChsKTsgXAotCW5vLm5lZyA9IDE7IFwKLQljb2RlIFwKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEFjY2VwdCB0aGUgcGVlcidzIGlkZWEgb2Yge291cixoaXN9IGFkZHJlc3MsIGlmIGRpZmZlcmVudAotICAgICAqIGZyb20gb3VyIGlkZWEsIG9ubHkgaWYgdGhlIGFjY2VwdF97bG9jYWwscmVtb3RlfSBmbGFnIGlzIHNldC4KLSAgICAgKi8KLSAgICBOQUtDSUFERFJTKENJX0FERFJTLCAhZ28tPm5lZ19hZGRyICYmIGdvLT5vbGRfYWRkcnMsCi0JICAgICAgIGlmICh0cmVhdF9hc19yZWplY3QpIHsKLQkJICAgdHJ5Lm9sZF9hZGRycyA9IDA7Ci0JICAgICAgIH0gZWxzZSB7Ci0JCSAgIGlmIChnby0+YWNjZXB0X2xvY2FsICYmIGNpYWRkcjEpIHsKLQkJICAgICAgIC8qIHRha2UgaGlzIGlkZWEgb2Ygb3VyIGFkZHJlc3MgKi8KLQkJICAgICAgIHRyeS5vdXJhZGRyID0gY2lhZGRyMTsKLQkJICAgfQotCQkgICBpZiAoZ28tPmFjY2VwdF9yZW1vdGUgJiYgY2lhZGRyMikgewotCQkgICAgICAgLyogdGFrZSBoaXMgaWRlYSBvZiBoaXMgYWRkcmVzcyAqLwotCQkgICAgICAgdHJ5Lmhpc2FkZHIgPSBjaWFkZHIyOwotCQkgICB9Ci0JICAgICAgIH0KLQkpOwotCi0gICAgLyoKLSAgICAgKiBBY2NlcHQgdGhlIHBlZXIncyB2YWx1ZSBvZiBtYXhzbG90aW5kZXggcHJvdmlkZWQgdGhhdCBpdAotICAgICAqIGlzIGxlc3MgdGhhbiB3aGF0IHdlIGFza2VkIGZvci4gIFR1cm4gb2ZmIHNsb3QtSUQgY29tcHJlc3Npb24KLSAgICAgKiBpZiB0aGUgcGVlciB3YW50cy4gIFNlbmQgb2xkLXN0eWxlIGNvbXByZXNzLXR5cGUgb3B0aW9uIGlmCi0gICAgICogdGhlIHBlZXIgd2FudHMuCi0gICAgICovCi0gICAgTkFLQ0lWSihDSV9DT01QUkVTU1RZUEUsIG5lZ192aiwKLQkgICAgaWYgKHRyZWF0X2FzX3JlamVjdCkgewotCQl0cnkubmVnX3ZqID0gMDsKLQkgICAgfSBlbHNlIGlmIChjaWxlbiA9PSBDSUxFTl9WSikgewotCQlHRVRDSEFSKGNpbWF4c2xvdGluZGV4LCBwKTsKLQkJR0VUQ0hBUihjaWNmbGFnLCBwKTsKLQkJaWYgKGNpc2hvcnQgPT0gSVBDUF9WSl9DT01QKSB7Ci0JCSAgICB0cnkub2xkX3ZqID0gMDsKLQkJICAgIGlmIChjaW1heHNsb3RpbmRleCA8IGdvLT5tYXhzbG90aW5kZXgpCi0JCQl0cnkubWF4c2xvdGluZGV4ID0gY2ltYXhzbG90aW5kZXg7Ci0JCSAgICBpZiAoIWNpY2ZsYWcpCi0JCQl0cnkuY2ZsYWcgPSAwOwotCQl9IGVsc2UgewotCQkgICAgdHJ5Lm5lZ192aiA9IDA7Ci0JCX0KLQkgICAgfSBlbHNlIHsKLQkJaWYgKGNpc2hvcnQgPT0gSVBDUF9WSl9DT01QIHx8IGNpc2hvcnQgPT0gSVBDUF9WSl9DT01QX09MRCkgewotCQkgICAgdHJ5Lm9sZF92aiA9IDE7Ci0JCSAgICB0cnkudmpfcHJvdG9jb2wgPSBjaXNob3J0OwotCQl9IGVsc2UgewotCQkgICAgdHJ5Lm5lZ192aiA9IDA7Ci0JCX0KLQkgICAgfQotCSAgICApOwotCi0gICAgTkFLQ0lBRERSKENJX0FERFIsIG5lZ19hZGRyLAotCSAgICAgIGlmICh0cmVhdF9hc19yZWplY3QpIHsKLQkJICB0cnkubmVnX2FkZHIgPSAwOwotCQkgIHRyeS5vbGRfYWRkcnMgPSAwOwotCSAgICAgIH0gZWxzZSBpZiAoZ28tPmFjY2VwdF9sb2NhbCAmJiBjaWFkZHIxKSB7Ci0JCSAgLyogdGFrZSBoaXMgaWRlYSBvZiBvdXIgYWRkcmVzcyAqLwotCQkgIHRyeS5vdXJhZGRyID0gY2lhZGRyMTsKLQkgICAgICB9Ci0JICAgICAgKTsKLQotICAgIE5BS0NJRE5TKENJX01TX0ROUzEsIHJlcV9kbnMxLAotCSAgICAgaWYgKHRyZWF0X2FzX3JlamVjdCkgewotCQkgdHJ5LnJlcV9kbnMxID0gMDsKLQkgICAgIH0gZWxzZSB7Ci0JCSB0cnkuZG5zYWRkclswXSA9IGNpZG5zYWRkcjsKLQkgICAgIH0KLQkgICAgICk7Ci0KLSAgICBOQUtDSUROUyhDSV9NU19ETlMyLCByZXFfZG5zMiwKLQkgICAgIGlmICh0cmVhdF9hc19yZWplY3QpIHsKLQkJIHRyeS5yZXFfZG5zMiA9IDA7Ci0JICAgICB9IGVsc2UgewotCQkgdHJ5LmRuc2FkZHJbMV0gPSBjaWRuc2FkZHI7Ci0JICAgICB9Ci0JICAgICApOwotCi0gICAgLyoKLSAgICAgKiBUaGVyZSBtYXkgYmUgcmVtYWluaW5nIENJcywgaWYgdGhlIHBlZXIgaXMgcmVxdWVzdGluZyBuZWdvdGlhdGlvbgotICAgICAqIG9uIGFuIG9wdGlvbiB0aGF0IHdlIGRpZG4ndCBpbmNsdWRlIGluIG91ciByZXF1ZXN0IHBhY2tldC4KLSAgICAgKiBJZiB0aGV5IHdhbnQgdG8gbmVnb3RpYXRlIGFib3V0IElQIGFkZHJlc3Nlcywgd2UgY29tcGx5LgotICAgICAqIElmIHRoZXkgd2FudCB1cyB0byBhc2sgZm9yIGNvbXByZXNzaW9uLCB3ZSByZWZ1c2UuCi0gICAgICogSWYgdGhleSB3YW50IHVzIHRvIGFzayBmb3IgbXMtZG5zLCB3ZSBkbyB0aGF0LCBzaW5jZSBzb21lCi0gICAgICogcGVlcnMgZ2V0IGh1ZmZ5IGlmIHdlIGRvbid0LgotICAgICAqLwotICAgIHdoaWxlIChsZW4gPj0gQ0lMRU5fVk9JRCkgewotCUdFVENIQVIoY2l0eXBlLCBwKTsKLQlHRVRDSEFSKGNpbGVuLCBwKTsKLQlpZiAoIGNpbGVuIDwgQ0lMRU5fVk9JRCB8fCAobGVuIC09IGNpbGVuKSA8IDAgKQotCSAgICBnb3RvIGJhZDsKLQluZXh0ID0gcCArIGNpbGVuIC0gMjsKLQotCXN3aXRjaCAoY2l0eXBlKSB7Ci0JY2FzZSBDSV9DT01QUkVTU1RZUEU6Ci0JICAgIGlmIChnby0+bmVnX3ZqIHx8IG5vLm5lZ192aiB8fAotCQkoY2lsZW4gIT0gQ0lMRU5fVkogJiYgY2lsZW4gIT0gQ0lMRU5fQ09NUFJFU1MpKQotCQlnb3RvIGJhZDsKLQkgICAgbm8ubmVnX3ZqID0gMTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDSV9BRERSUzoKLQkgICAgaWYgKCghZ28tPm5lZ19hZGRyICYmIGdvLT5vbGRfYWRkcnMpIHx8IG5vLm9sZF9hZGRycwotCQl8fCBjaWxlbiAhPSBDSUxFTl9BRERSUykKLQkJZ290byBiYWQ7Ci0JICAgIHRyeS5uZWdfYWRkciA9IDA7Ci0JICAgIEdFVExPTkcobCwgcCk7Ci0JICAgIGNpYWRkcjEgPSBodG9ubChsKTsKLQkgICAgaWYgKGNpYWRkcjEgJiYgZ28tPmFjY2VwdF9sb2NhbCkKLQkJdHJ5Lm91cmFkZHIgPSBjaWFkZHIxOwotCSAgICBHRVRMT05HKGwsIHApOwotCSAgICBjaWFkZHIyID0gaHRvbmwobCk7Ci0JICAgIGlmIChjaWFkZHIyICYmIGdvLT5hY2NlcHRfcmVtb3RlKQotCQl0cnkuaGlzYWRkciA9IGNpYWRkcjI7Ci0JICAgIG5vLm9sZF9hZGRycyA9IDE7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ0lfQUREUjoKLQkgICAgaWYgKGdvLT5uZWdfYWRkciB8fCBuby5uZWdfYWRkciB8fCBjaWxlbiAhPSBDSUxFTl9BRERSKQotCQlnb3RvIGJhZDsKLQkgICAgdHJ5Lm9sZF9hZGRycyA9IDA7Ci0JICAgIEdFVExPTkcobCwgcCk7Ci0JICAgIGNpYWRkcjEgPSBodG9ubChsKTsKLQkgICAgaWYgKGNpYWRkcjEgJiYgZ28tPmFjY2VwdF9sb2NhbCkKLQkJdHJ5Lm91cmFkZHIgPSBjaWFkZHIxOwotCSAgICBpZiAodHJ5Lm91cmFkZHIgIT0gMCkKLQkJdHJ5Lm5lZ19hZGRyID0gMTsKLQkgICAgbm8ubmVnX2FkZHIgPSAxOwotCSAgICBicmVhazsKLQljYXNlIENJX01TX0ROUzE6Ci0JICAgIGlmIChnby0+cmVxX2RuczEgfHwgbm8ucmVxX2RuczEgfHwgY2lsZW4gIT0gQ0lMRU5fQUREUikKLQkJZ290byBiYWQ7Ci0JICAgIEdFVExPTkcobCwgcCk7Ci0JICAgIHRyeS5kbnNhZGRyWzBdID0gaHRvbmwobCk7Ci0JICAgIHRyeS5yZXFfZG5zMSA9IDE7Ci0JICAgIG5vLnJlcV9kbnMxID0gMTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDSV9NU19ETlMyOgotCSAgICBpZiAoZ28tPnJlcV9kbnMyIHx8IG5vLnJlcV9kbnMyIHx8IGNpbGVuICE9IENJTEVOX0FERFIpCi0JCWdvdG8gYmFkOwotCSAgICBHRVRMT05HKGwsIHApOwotCSAgICB0cnkuZG5zYWRkclsxXSA9IGh0b25sKGwpOwotCSAgICB0cnkucmVxX2RuczIgPSAxOwotCSAgICBuby5yZXFfZG5zMiA9IDE7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ0lfTVNfV0lOUzE6Ci0JY2FzZSBDSV9NU19XSU5TMjoKLQkgICAgaWYgKGNpbGVuICE9IENJTEVOX0FERFIpCi0JCWdvdG8gYmFkOwotCSAgICBHRVRMT05HKGwsIHApOwotCSAgICBjaWFkZHIxID0gaHRvbmwobCk7Ci0JICAgIGlmIChjaWFkZHIxKQotCQl0cnkud2luc2FkZHJbY2l0eXBlID09IENJX01TX1dJTlMyXSA9IGNpYWRkcjE7Ci0JICAgIGJyZWFrOwotCX0KLQlwID0gbmV4dDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE9LLCB0aGUgTmFrIGlzIGdvb2QuICBOb3cgd2UgY2FuIHVwZGF0ZSBzdGF0ZS4KLSAgICAgKiBJZiB0aGVyZSBhcmUgYW55IHJlbWFpbmluZyBvcHRpb25zLCB3ZSBpZ25vcmUgdGhlbS4KLSAgICAgKi8KLSAgICBpZiAoZi0+c3RhdGUgIT0gT1BFTkVEKQotCSpnbyA9IHRyeTsKLQotICAgIHJldHVybiAxOwotCi1iYWQ6Ci0gICAgSVBDUERFQlVHKCgiaXBjcF9uYWtjaTogcmVjZWl2ZWQgYmFkIE5hayEiKSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqIGlwY3BfcmVqY2kgLSBSZWplY3Qgc29tZSBvZiBvdXIgQ0lzLgotICogQ2FsbGJhY2sgZnJvbSBmc21fcmNvbmZuYWtyZWouCi0gKi8KLXN0YXRpYyBpbnQKLWlwY3BfcmVqY2koZiwgcCwgbGVuKQotICAgIGZzbSAqZjsKLSAgICB1X2NoYXIgKnA7Ci0gICAgaW50IGxlbjsKLXsKLSAgICBpcGNwX29wdGlvbnMgKmdvID0gJmlwY3BfZ290b3B0aW9uc1tmLT51bml0XTsKLSAgICB1X2NoYXIgY2ltYXhzbG90aW5kZXgsIGNpZmxhZywgY2lsZW47Ci0gICAgdV9zaG9ydCBjaXNob3J0OwotICAgIHVfaW50MzJfdCBjaWxvbmc7Ci0gICAgaXBjcF9vcHRpb25zIHRyeTsJCS8qIG9wdGlvbnMgdG8gcmVxdWVzdCBuZXh0IHRpbWUgKi8KLQotICAgIHRyeSA9ICpnbzsKLSAgICAvKgotICAgICAqIEFueSBSZWplY3RlZCBDSXMgbXVzdCBiZSBpbiBleGFjdGx5IHRoZSBzYW1lIG9yZGVyIHRoYXQgd2Ugc2VudC4KLSAgICAgKiBDaGVjayBwYWNrZXQgbGVuZ3RoIGFuZCBDSSBsZW5ndGggYXQgZWFjaCBzdGVwLgotICAgICAqIElmIHdlIGZpbmQgYW55IGRldmlhdGlvbnMsIHRoZW4gdGhpcyBwYWNrZXQgaXMgYmFkLgotICAgICAqLwotI2RlZmluZSBSRUpDSUFERFJTKG9wdCwgbmVnLCB2YWwxLCB2YWwyKSBcCi0gICAgaWYgKChuZWcpICYmIFwKLQkoY2lsZW4gPSBwWzFdKSA9PSBDSUxFTl9BRERSUyAmJiBcCi0JbGVuID49IGNpbGVuICYmIFwKLQlwWzBdID09IG9wdCkgeyBcCi0JdV9pbnQzMl90IGw7IFwKLQlsZW4gLT0gY2lsZW47IFwKLQlJTkNQVFIoMiwgcCk7IFwKLQlHRVRMT05HKGwsIHApOyBcCi0JY2lsb25nID0gaHRvbmwobCk7IFwKLQkvKiBDaGVjayByZWplY3RlZCB2YWx1ZS4gKi8gXAotCWlmIChjaWxvbmcgIT0gdmFsMSkgXAotCSAgICBnb3RvIGJhZDsgXAotCUdFVExPTkcobCwgcCk7IFwKLQljaWxvbmcgPSBodG9ubChsKTsgXAotCS8qIENoZWNrIHJlamVjdGVkIHZhbHVlLiAqLyBcCi0JaWYgKGNpbG9uZyAhPSB2YWwyKSBcCi0JICAgIGdvdG8gYmFkOyBcCi0JdHJ5Lm9sZF9hZGRycyA9IDA7IFwKLSAgICB9Ci0KLSNkZWZpbmUgUkVKQ0lWSihvcHQsIG5lZywgdmFsLCBvbGQsIG1heHNsb3QsIGNmbGFnKSBcCi0gICAgaWYgKGdvLT5uZWcgJiYgXAotCXBbMV0gPT0gKG9sZD8gQ0lMRU5fQ09NUFJFU1MgOiBDSUxFTl9WSikgJiYgXAotCWxlbiA+PSBwWzFdICYmIFwKLQlwWzBdID09IG9wdCkgeyBcCi0JbGVuIC09IHBbMV07IFwKLQlJTkNQVFIoMiwgcCk7IFwKLQlHRVRTSE9SVChjaXNob3J0LCBwKTsgXAotCS8qIENoZWNrIHJlamVjdGVkIHZhbHVlLiAqLyAgXAotCWlmIChjaXNob3J0ICE9IHZhbCkgXAotCSAgICBnb3RvIGJhZDsgXAotCWlmICghb2xkKSB7IFwKLQkgICBHRVRDSEFSKGNpbWF4c2xvdGluZGV4LCBwKTsgXAotCSAgIGlmIChjaW1heHNsb3RpbmRleCAhPSBtYXhzbG90KSBcCi0JICAgICBnb3RvIGJhZDsgXAotCSAgIEdFVENIQVIoY2lmbGFnLCBwKTsgXAotCSAgIGlmIChjaWZsYWcgIT0gY2ZsYWcpIFwKLQkgICAgIGdvdG8gYmFkOyBcCi0gICAgICAgIH0gXAotCXRyeS5uZWcgPSAwOyBcCi0gICAgIH0KLQotI2RlZmluZSBSRUpDSUFERFIob3B0LCBuZWcsIHZhbCkgXAotICAgIGlmIChnby0+bmVnICYmIFwKLQkoY2lsZW4gPSBwWzFdKSA9PSBDSUxFTl9BRERSICYmIFwKLQlsZW4gPj0gY2lsZW4gJiYgXAotCXBbMF0gPT0gb3B0KSB7IFwKLQl1X2ludDMyX3QgbDsgXAotCWxlbiAtPSBjaWxlbjsgXAotCUlOQ1BUUigyLCBwKTsgXAotCUdFVExPTkcobCwgcCk7IFwKLQljaWxvbmcgPSBodG9ubChsKTsgXAotCS8qIENoZWNrIHJlamVjdGVkIHZhbHVlLiAqLyBcCi0JaWYgKGNpbG9uZyAhPSB2YWwpIFwKLQkgICAgZ290byBiYWQ7IFwKLQl0cnkubmVnID0gMDsgXAotICAgIH0KLQotI2RlZmluZSBSRUpDSUROUyhvcHQsIG5lZywgZG5zYWRkcikgXAotICAgIGlmIChnby0+bmVnICYmIFwKLQkoKGNpbGVuID0gcFsxXSkgPT0gQ0lMRU5fQUREUikgJiYgXAotCWxlbiA+PSBjaWxlbiAmJiBcCi0JcFswXSA9PSBvcHQpIHsgXAotCXVfaW50MzJfdCBsOyBcCi0JbGVuIC09IGNpbGVuOyBcCi0JSU5DUFRSKDIsIHApOyBcCi0JR0VUTE9ORyhsLCBwKTsgXAotCWNpbG9uZyA9IGh0b25sKGwpOyBcCi0JLyogQ2hlY2sgcmVqZWN0ZWQgdmFsdWUuICovIFwKLQlpZiAoY2lsb25nICE9IGRuc2FkZHIpIFwKLQkgICAgZ290byBiYWQ7IFwKLQl0cnkubmVnID0gMDsgXAotICAgIH0KLQotI2RlZmluZSBSRUpDSVdJTlMob3B0LCBhZGRyKSBcCi0gICAgaWYgKGFkZHIgJiYgXAotCSgoY2lsZW4gPSBwWzFdKSA9PSBDSUxFTl9BRERSKSAmJiBcCi0JbGVuID49IGNpbGVuICYmIFwKLQlwWzBdID09IG9wdCkgeyBcCi0JdV9pbnQzMl90IGw7IFwKLQlsZW4gLT0gY2lsZW47IFwKLQlJTkNQVFIoMiwgcCk7IFwKLQlHRVRMT05HKGwsIHApOyBcCi0JY2lsb25nID0gaHRvbmwobCk7IFwKLQkvKiBDaGVjayByZWplY3RlZCB2YWx1ZS4gKi8gXAotCWlmIChjaWxvbmcgIT0gYWRkcikgXAotCSAgICBnb3RvIGJhZDsgXAotCXRyeS53aW5zYWRkcltvcHQgPT0gQ0lfTVNfV0lOUzJdID0gMDsgXAotICAgIH0KLQotICAgIFJFSkNJQUREUlMoQ0lfQUREUlMsICFnby0+bmVnX2FkZHIgJiYgZ28tPm9sZF9hZGRycywKLQkgICAgICAgZ28tPm91cmFkZHIsIGdvLT5oaXNhZGRyKTsKLQotICAgIFJFSkNJVkooQ0lfQ09NUFJFU1NUWVBFLCBuZWdfdmosIGdvLT52al9wcm90b2NvbCwgZ28tPm9sZF92aiwKLQkgICAgZ28tPm1heHNsb3RpbmRleCwgZ28tPmNmbGFnKTsKLQotICAgIFJFSkNJQUREUihDSV9BRERSLCBuZWdfYWRkciwgZ28tPm91cmFkZHIpOwotCi0gICAgUkVKQ0lETlMoQ0lfTVNfRE5TMSwgcmVxX2RuczEsIGdvLT5kbnNhZGRyWzBdKTsKLQotICAgIFJFSkNJRE5TKENJX01TX0ROUzIsIHJlcV9kbnMyLCBnby0+ZG5zYWRkclsxXSk7Ci0KLSAgICBSRUpDSVdJTlMoQ0lfTVNfV0lOUzEsIGdvLT53aW5zYWRkclswXSk7Ci0KLSAgICBSRUpDSVdJTlMoQ0lfTVNfV0lOUzIsIGdvLT53aW5zYWRkclsxXSk7Ci0KLSAgICAvKgotICAgICAqIElmIHRoZXJlIGFyZSBhbnkgcmVtYWluaW5nIENJcywgdGhlbiB0aGlzIHBhY2tldCBpcyBiYWQuCi0gICAgICovCi0gICAgaWYgKGxlbiAhPSAwKQotCWdvdG8gYmFkOwotICAgIC8qCi0gICAgICogTm93IHdlIGNhbiB1cGRhdGUgc3RhdGUuCi0gICAgICovCi0gICAgaWYgKGYtPnN0YXRlICE9IE9QRU5FRCkKLQkqZ28gPSB0cnk7Ci0gICAgcmV0dXJuIDE7Ci0KLWJhZDoKLSAgICBJUENQREVCVUcoKCJpcGNwX3JlamNpOiByZWNlaXZlZCBiYWQgUmVqZWN0ISIpKTsKLSAgICByZXR1cm4gMDsKLX0KLQotCi0vKgotICogaXBjcF9yZXFjaSAtIENoZWNrIHRoZSBwZWVyJ3MgcmVxdWVzdGVkIENJcyBhbmQgc2VuZCBhcHByb3ByaWF0ZSByZXNwb25zZS4KLSAqIENhbGxiYWNrIGZyb20gZnNtX3Jjb25mcmVxLCBSZWNlaXZlIENvbmZpZ3VyZSBSZXF1ZXN0Ci0gKgotICogUmV0dXJuczogQ09ORkFDSywgQ09ORk5BSyBvciBDT05GUkVKIGFuZCBpbnB1dCBwYWNrZXQgbW9kaWZpZWQKLSAqIGFwcHJvcHJpYXRlbHkuICBJZiByZWplY3RfaWZfZGlzYWdyZWUgaXMgbm9uLXplcm8sIGRvZXNuJ3QgcmV0dXJuCi0gKiBDT05GTkFLOyByZXR1cm5zIENPTkZSRUogaWYgaXQgY2FuJ3QgcmV0dXJuIENPTkZBQ0suCi0gKi8KLXN0YXRpYyBpbnQKLWlwY3BfcmVxY2koZiwgaW5wLCBsZW4sIHJlamVjdF9pZl9kaXNhZ3JlZSkKLSAgICBmc20gKmY7Ci0gICAgdV9jaGFyICppbnA7CQkvKiBSZXF1ZXN0ZWQgQ0lzICovCi0gICAgaW50ICpsZW47CQkJLyogTGVuZ3RoIG9mIHJlcXVlc3RlZCBDSXMgKi8KLSAgICBpbnQgcmVqZWN0X2lmX2Rpc2FncmVlOwotewotICAgIGlwY3Bfb3B0aW9ucyAqd28gPSAmaXBjcF93YW50b3B0aW9uc1tmLT51bml0XTsKLSAgICBpcGNwX29wdGlvbnMgKmhvID0gJmlwY3BfaGlzb3B0aW9uc1tmLT51bml0XTsKLSAgICBpcGNwX29wdGlvbnMgKmFvID0gJmlwY3BfYWxsb3dvcHRpb25zW2YtPnVuaXRdOwotICAgIHVfY2hhciAqY2lwLCAqbmV4dDsJCS8qIFBvaW50ZXIgdG8gY3VycmVudCBhbmQgbmV4dCBDSXMgKi8KLSAgICB1X3Nob3J0IGNpbGVuLCBjaXR5cGU7CS8qIFBhcnNlZCBsZW4sIHR5cGUgKi8KLSAgICB1X3Nob3J0IGNpc2hvcnQ7CQkvKiBQYXJzZWQgc2hvcnQgdmFsdWUgKi8KLSAgICB1X2ludDMyX3QgdGwsIGNpYWRkcjEsIGNpYWRkcjI7LyogUGFyc2VkIGFkZHJlc3MgdmFsdWVzICovCi0gICAgaW50IHJjID0gQ09ORkFDSzsJCS8qIEZpbmFsIHBhY2tldCByZXR1cm4gY29kZSAqLwotICAgIGludCBvcmM7CQkJLyogSW5kaXZpZHVhbCBvcHRpb24gcmV0dXJuIGNvZGUgKi8KLSAgICB1X2NoYXIgKnA7CQkJLyogUG9pbnRlciB0byBuZXh0IGNoYXIgdG8gcGFyc2UgKi8KLSAgICB1X2NoYXIgKnVjcCA9IGlucDsJCS8qIFBvaW50ZXIgdG8gY3VycmVudCBvdXRwdXQgY2hhciAqLwotICAgIGludCBsID0gKmxlbjsJCS8qIExlbmd0aCBsZWZ0ICovCi0gICAgdV9jaGFyIG1heHNsb3RpbmRleCwgY2ZsYWc7Ci0gICAgaW50IGQ7Ci0KLSAgICAvKgotICAgICAqIFJlc2V0IGFsbCBoaXMgb3B0aW9ucy4KLSAgICAgKi8KLSAgICBCWkVSTyhobywgc2l6ZW9mKCpobykpOwotICAgIAotICAgIC8qCi0gICAgICogUHJvY2VzcyBhbGwgaGlzIG9wdGlvbnMuCi0gICAgICovCi0gICAgbmV4dCA9IGlucDsKLSAgICB3aGlsZSAobCkgewotCW9yYyA9IENPTkZBQ0s7CQkJLyogQXNzdW1lIHN1Y2Nlc3MgKi8KLQljaXAgPSBwID0gbmV4dDsJCQkvKiBSZW1lbWJlciBiZWdpbmluZyBvZiBDSSAqLwotCWlmIChsIDwgMiB8fAkJCS8qIE5vdCBlbm91Z2ggZGF0YSBmb3IgQ0kgaGVhZGVyIG9yICovCi0JICAgIHBbMV0gPCAyIHx8CQkJLyogIENJIGxlbmd0aCB0b28gc21hbGwgb3IgKi8KLQkgICAgcFsxXSA+IGwpIHsJCQkvKiAgQ0kgbGVuZ3RoIHRvbyBiaWc/ICovCi0JICAgIElQQ1BERUJVRygoImlwY3BfcmVxY2k6IGJhZCBDSSBsZW5ndGghIikpOwotCSAgICBvcmMgPSBDT05GUkVKOwkJLyogUmVqZWN0IGJhZCBDSSAqLwotCSAgICBjaWxlbiA9IGw7CQkJLyogUmVqZWN0IHRpbGwgZW5kIG9mIHBhY2tldCAqLwotCSAgICBsID0gMDsJCQkvKiBEb24ndCBsb29wIGFnYWluICovCi0JICAgIGdvdG8gZW5kc3dpdGNoOwotCX0KLQlHRVRDSEFSKGNpdHlwZSwgcCk7CQkvKiBQYXJzZSBDSSB0eXBlICovCi0JR0VUQ0hBUihjaWxlbiwgcCk7CQkvKiBQYXJzZSBDSSBsZW5ndGggKi8KLQlsIC09IGNpbGVuOwkJCS8qIEFkanVzdCByZW1haW5pbmcgbGVuZ3RoICovCi0JbmV4dCArPSBjaWxlbjsJCQkvKiBTdGVwIHRvIG5leHQgQ0kgKi8KLQotCXN3aXRjaCAoY2l0eXBlKSB7CQkvKiBDaGVjayBDSSB0eXBlICovCi0JY2FzZSBDSV9BRERSUzoKLQkgICAgaWYgKCFhby0+b2xkX2FkZHJzIHx8IGhvLT5uZWdfYWRkciB8fAotCQljaWxlbiAhPSBDSUxFTl9BRERSUykgewkvKiBDaGVjayBDSSBsZW5ndGggKi8KLQkJb3JjID0gQ09ORlJFSjsJCS8qIFJlamVjdCBDSSAqLwotCQlicmVhazsKLQkgICAgfQotCi0JICAgIC8qCi0JICAgICAqIElmIGhlIGhhcyBubyBhZGRyZXNzLCBvciBpZiB3ZSBib3RoIGhhdmUgaGlzIGFkZHJlc3MgYnV0Ci0JICAgICAqIGRpc2FncmVlIGFib3V0IGl0LCB0aGVuIE5BSyBpdCB3aXRoIG91ciBpZGVhLgotCSAgICAgKiBJbiBwYXJ0aWN1bGFyLCBpZiB3ZSBkb24ndCBrbm93IGhpcyBhZGRyZXNzLCBidXQgaGUgZG9lcywKLQkgICAgICogdGhlbiBhY2NlcHQgaXQuCi0JICAgICAqLwotCSAgICBHRVRMT05HKHRsLCBwKTsJCS8qIFBhcnNlIHNvdXJjZSBhZGRyZXNzIChoaXMpICovCi0JICAgIGNpYWRkcjEgPSBodG9ubCh0bCk7Ci0JICAgIGlmIChjaWFkZHIxICE9IHdvLT5oaXNhZGRyCi0JCSYmIChjaWFkZHIxID09IDAgfHwgIXdvLT5hY2NlcHRfcmVtb3RlKSkgewotCQlvcmMgPSBDT05GTkFLOwotCQlpZiAoIXJlamVjdF9pZl9kaXNhZ3JlZSkgewotCQkgICAgREVDUFRSKHNpemVvZih1X2ludDMyX3QpLCBwKTsKLQkJICAgIHRsID0gbnRvaGwod28tPmhpc2FkZHIpOwotCQkgICAgUFVUTE9ORyh0bCwgcCk7Ci0JCX0KLQkgICAgfSBlbHNlIGlmIChjaWFkZHIxID09IDAgJiYgd28tPmhpc2FkZHIgPT0gMCkgewotCQkvKgotCQkgKiBJZiBuZWl0aGVyIHdlIG5vciBoZSBrbm93cyBoaXMgYWRkcmVzcywgcmVqZWN0IHRoZSBvcHRpb24uCi0JCSAqLwotCQlvcmMgPSBDT05GUkVKOwotCQl3by0+cmVxX2FkZHIgPSAwOwkvKiBkb24ndCBOQUsgd2l0aCAwLjAuMC4wIGxhdGVyICovCi0JCWJyZWFrOwotCSAgICB9Ci0KLQkgICAgLyoKLQkgICAgICogSWYgaGUgZG9lc24ndCBrbm93IG91ciBhZGRyZXNzLCBvciBpZiB3ZSBib3RoIGhhdmUgb3VyIGFkZHJlc3MKLQkgICAgICogYnV0IGRpc2FncmVlIGFib3V0IGl0LCB0aGVuIE5BSyBpdCB3aXRoIG91ciBpZGVhLgotCSAgICAgKi8KLQkgICAgR0VUTE9ORyh0bCwgcCk7CQkvKiBQYXJzZSBkZXNpbmF0aW9uIGFkZHJlc3MgKG91cnMpICovCi0JICAgIGNpYWRkcjIgPSBodG9ubCh0bCk7Ci0JICAgIGlmIChjaWFkZHIyICE9IHdvLT5vdXJhZGRyKSB7Ci0JCWlmIChjaWFkZHIyID09IDAgfHwgIXdvLT5hY2NlcHRfbG9jYWwpIHsKLQkJICAgIG9yYyA9IENPTkZOQUs7Ci0JCSAgICBpZiAoIXJlamVjdF9pZl9kaXNhZ3JlZSkgewotCQkJREVDUFRSKHNpemVvZih1X2ludDMyX3QpLCBwKTsKLQkJCXRsID0gbnRvaGwod28tPm91cmFkZHIpOwotCQkJUFVUTE9ORyh0bCwgcCk7Ci0JCSAgICB9Ci0JCX0gZWxzZSB7Ci0JCSAgICB3by0+b3VyYWRkciA9IGNpYWRkcjI7CS8qIGFjY2VwdCBwZWVyJ3MgaWRlYSAqLwotCQl9Ci0JICAgIH0KLQotCSAgICBoby0+b2xkX2FkZHJzID0gMTsKLQkgICAgaG8tPmhpc2FkZHIgPSBjaWFkZHIxOwotCSAgICBoby0+b3VyYWRkciA9IGNpYWRkcjI7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBDSV9BRERSOgotCSAgICBpZiAoIWFvLT5uZWdfYWRkciB8fCBoby0+b2xkX2FkZHJzIHx8Ci0JCWNpbGVuICE9IENJTEVOX0FERFIpIHsJLyogQ2hlY2sgQ0kgbGVuZ3RoICovCi0JCW9yYyA9IENPTkZSRUo7CQkvKiBSZWplY3QgQ0kgKi8KLQkJYnJlYWs7Ci0JICAgIH0KLQotCSAgICAvKgotCSAgICAgKiBJZiBoZSBoYXMgbm8gYWRkcmVzcywgb3IgaWYgd2UgYm90aCBoYXZlIGhpcyBhZGRyZXNzIGJ1dAotCSAgICAgKiBkaXNhZ3JlZSBhYm91dCBpdCwgdGhlbiBOQUsgaXQgd2l0aCBvdXIgaWRlYS4KLQkgICAgICogSW4gcGFydGljdWxhciwgaWYgd2UgZG9uJ3Qga25vdyBoaXMgYWRkcmVzcywgYnV0IGhlIGRvZXMsCi0JICAgICAqIHRoZW4gYWNjZXB0IGl0LgotCSAgICAgKi8KLQkgICAgR0VUTE9ORyh0bCwgcCk7CS8qIFBhcnNlIHNvdXJjZSBhZGRyZXNzIChoaXMpICovCi0JICAgIGNpYWRkcjEgPSBodG9ubCh0bCk7Ci0JICAgIGlmIChjaWFkZHIxICE9IHdvLT5oaXNhZGRyCi0JCSYmIChjaWFkZHIxID09IDAgfHwgIXdvLT5hY2NlcHRfcmVtb3RlKSkgewotCQlvcmMgPSBDT05GTkFLOwotCQlpZiAoIXJlamVjdF9pZl9kaXNhZ3JlZSkgewotCQkgICAgREVDUFRSKHNpemVvZih1X2ludDMyX3QpLCBwKTsKLQkJICAgIHRsID0gbnRvaGwod28tPmhpc2FkZHIpOwotCQkgICAgUFVUTE9ORyh0bCwgcCk7Ci0JCX0KLQkgICAgfSBlbHNlIGlmIChjaWFkZHIxID09IDAgJiYgd28tPmhpc2FkZHIgPT0gMCkgewotCQkvKgotCQkgKiBEb24ndCBBQ0sgYW4gYWRkcmVzcyBvZiAwLjAuMC4wIC0gcmVqZWN0IGl0IGluc3RlYWQuCi0JCSAqLwotCQlvcmMgPSBDT05GUkVKOwotCQl3by0+cmVxX2FkZHIgPSAwOwkvKiBkb24ndCBOQUsgd2l0aCAwLjAuMC4wIGxhdGVyICovCi0JCWJyZWFrOwotCSAgICB9Ci0JCi0JICAgIGhvLT5uZWdfYWRkciA9IDE7Ci0JICAgIGhvLT5oaXNhZGRyID0gY2lhZGRyMTsKLQkgICAgYnJlYWs7Ci0KLQljYXNlIENJX01TX0ROUzE6Ci0JY2FzZSBDSV9NU19ETlMyOgotCSAgICAvKiBNaWNyb3NvZnQgcHJpbWFyeSBvciBzZWNvbmRhcnkgRE5TIHJlcXVlc3QgKi8KLQkgICAgZCA9IGNpdHlwZSA9PSBDSV9NU19ETlMyOwotCi0JICAgIC8qIElmIHdlIGRvIG5vdCBoYXZlIGEgRE5TIGFkZHJlc3MgdGhlbiB3ZSBjYW5ub3Qgc2VuZCBpdCAqLwotCSAgICBpZiAoYW8tPmRuc2FkZHJbZF0gPT0gMCB8fAotCQljaWxlbiAhPSBDSUxFTl9BRERSKSB7CS8qIENoZWNrIENJIGxlbmd0aCAqLwotCQlvcmMgPSBDT05GUkVKOwkJLyogUmVqZWN0IENJICovCi0JCWJyZWFrOwotCSAgICB9Ci0JICAgIEdFVExPTkcodGwsIHApOwotCSAgICBpZiAoaHRvbmwodGwpICE9IGFvLT5kbnNhZGRyW2RdKSB7Ci0gICAgICAgICAgICAgICAgREVDUFRSKHNpemVvZih1X2ludDMyX3QpLCBwKTsKLQkJdGwgPSBudG9obChhby0+ZG5zYWRkcltkXSk7Ci0JCVBVVExPTkcodGwsIHApOwotCQlvcmMgPSBDT05GTkFLOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLQljYXNlIENJX01TX1dJTlMxOgotCWNhc2UgQ0lfTVNfV0lOUzI6Ci0JICAgIC8qIE1pY3Jvc29mdCBwcmltYXJ5IG9yIHNlY29uZGFyeSBXSU5TIHJlcXVlc3QgKi8KLQkgICAgZCA9IGNpdHlwZSA9PSBDSV9NU19XSU5TMjsKLQotCSAgICAvKiBJZiB3ZSBkbyBub3QgaGF2ZSBhIEROUyBhZGRyZXNzIHRoZW4gd2UgY2Fubm90IHNlbmQgaXQgKi8KLQkgICAgaWYgKGFvLT53aW5zYWRkcltkXSA9PSAwIHx8Ci0JCWNpbGVuICE9IENJTEVOX0FERFIpIHsJLyogQ2hlY2sgQ0kgbGVuZ3RoICovCi0JCW9yYyA9IENPTkZSRUo7CQkvKiBSZWplY3QgQ0kgKi8KLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgR0VUTE9ORyh0bCwgcCk7Ci0JICAgIGlmIChodG9ubCh0bCkgIT0gYW8tPndpbnNhZGRyW2RdKSB7Ci0gICAgICAgICAgICAgICAgREVDUFRSKHNpemVvZih1X2ludDMyX3QpLCBwKTsKLQkJdGwgPSBudG9obChhby0+d2luc2FkZHJbZF0pOwotCQlQVVRMT05HKHRsLCBwKTsKLQkJb3JjID0gQ09ORk5BSzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCQotCWNhc2UgQ0lfQ09NUFJFU1NUWVBFOgotCSAgICBpZiAoIWFvLT5uZWdfdmogfHwKLQkJKGNpbGVuICE9IENJTEVOX1ZKICYmIGNpbGVuICE9IENJTEVOX0NPTVBSRVNTKSkgewotCQlvcmMgPSBDT05GUkVKOwotCQlicmVhazsKLQkgICAgfQotCSAgICBHRVRTSE9SVChjaXNob3J0LCBwKTsKLQotCSAgICBpZiAoIShjaXNob3J0ID09IElQQ1BfVkpfQ09NUCB8fAotCQkgIChjaXNob3J0ID09IElQQ1BfVkpfQ09NUF9PTEQgJiYgY2lsZW4gPT0gQ0lMRU5fQ09NUFJFU1MpKSkgewotCQlvcmMgPSBDT05GUkVKOwotCQlicmVhazsKLQkgICAgfQotCi0JICAgIGhvLT5uZWdfdmogPSAxOwotCSAgICBoby0+dmpfcHJvdG9jb2wgPSBjaXNob3J0OwotCSAgICBpZiAoY2lsZW4gPT0gQ0lMRU5fVkopIHsKLQkJR0VUQ0hBUihtYXhzbG90aW5kZXgsIHApOwotCQlpZiAobWF4c2xvdGluZGV4ID4gYW8tPm1heHNsb3RpbmRleCkgeyAKLQkJICAgIG9yYyA9IENPTkZOQUs7Ci0JCSAgICBpZiAoIXJlamVjdF9pZl9kaXNhZ3JlZSl7Ci0JCQlERUNQVFIoMSwgcCk7Ci0JCQlQVVRDSEFSKGFvLT5tYXhzbG90aW5kZXgsIHApOwotCQkgICAgfQotCQl9Ci0JCUdFVENIQVIoY2ZsYWcsIHApOwotCQlpZiAoY2ZsYWcgJiYgIWFvLT5jZmxhZykgewotCQkgICAgb3JjID0gQ09ORk5BSzsKLQkJICAgIGlmICghcmVqZWN0X2lmX2Rpc2FncmVlKXsKLQkJCURFQ1BUUigxLCBwKTsKLQkJCVBVVENIQVIod28tPmNmbGFnLCBwKTsKLQkJICAgIH0KLQkJfQotCQloby0+bWF4c2xvdGluZGV4ID0gbWF4c2xvdGluZGV4OwotCQloby0+Y2ZsYWcgPSBjZmxhZzsKLQkgICAgfSBlbHNlIHsKLQkJaG8tPm9sZF92aiA9IDE7Ci0JCWhvLT5tYXhzbG90aW5kZXggPSBNQVhfU1RBVEVTIC0gMTsKLQkJaG8tPmNmbGFnID0gMTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICAgIG9yYyA9IENPTkZSRUo7Ci0JICAgIGJyZWFrOwotCX0KLWVuZHN3aXRjaDoKLQlpZiAob3JjID09IENPTkZBQ0sgJiYJCS8qIEdvb2QgQ0kgKi8KLQkgICAgcmMgIT0gQ09ORkFDSykJCS8qICBidXQgcHJpb3IgQ0kgd2FzbnQ/ICovCi0JICAgIGNvbnRpbnVlOwkJCS8qIERvbid0IHNlbmQgdGhpcyBvbmUgKi8KLQotCWlmIChvcmMgPT0gQ09ORk5BSykgewkJLyogTmFrIHRoaXMgQ0k/ICovCi0JICAgIGlmIChyZWplY3RfaWZfZGlzYWdyZWUpCS8qIEdldHRpbmcgZmVkIHVwIHdpdGggc2VuZGluZyBOQUtzPyAqLwotCQlvcmMgPSBDT05GUkVKOwkJLyogR2V0IHRvdWdoIGlmIHNvICovCi0JICAgIGVsc2UgewotCQlpZiAocmMgPT0gQ09ORlJFSikJLyogUmVqZWN0aW5nIHByaW9yIENJPyAqLwotCQkgICAgY29udGludWU7CQkvKiBEb24ndCBzZW5kIHRoaXMgb25lICovCi0JCWlmIChyYyA9PSBDT05GQUNLKSB7CS8qIEFjaydkIGFsbCBwcmlvciBDSXM/ICovCi0JCSAgICByYyA9IENPTkZOQUs7CS8qIE5vdCBhbnltb3JlLi4uICovCi0JCSAgICB1Y3AgPSBpbnA7CQkvKiBCYWNrdXAgKi8KLQkJfQotCSAgICB9Ci0JfQotCi0JaWYgKG9yYyA9PSBDT05GUkVKICYmCQkvKiBSZWplY3QgdGhpcyBDSSAqLwotCSAgICByYyAhPSBDT05GUkVKKSB7CQkvKiAgYnV0IG5vIHByaW9yIG9uZXM/ICovCi0JICAgIHJjID0gQ09ORlJFSjsKLQkgICAgdWNwID0gaW5wOwkJCS8qIEJhY2t1cCAqLwotCX0KLQotCS8qIE5lZWQgdG8gbW92ZSBDST8gKi8KLQlpZiAodWNwICE9IGNpcCkKLQkgICAgQkNPUFkoY2lwLCB1Y3AsIGNpbGVuKTsJLyogTW92ZSBpdCAqLwotCi0JLyogVXBkYXRlIG91dHB1dCBwb2ludGVyICovCi0JSU5DUFRSKGNpbGVuLCB1Y3ApOwotICAgIH0KLQotICAgIC8qCi0gICAgICogSWYgd2UgYXJlbid0IHJlamVjdGluZyB0aGlzIHBhY2tldCwgYW5kIHdlIHdhbnQgdG8gbmVnb3RpYXRlCi0gICAgICogdGhlaXIgYWRkcmVzcywgYW5kIHRoZXkgZGlkbid0IHNlbmQgdGhlaXIgYWRkcmVzcywgdGhlbiB3ZQotICAgICAqIHNlbmQgYSBOQUsgd2l0aCBhIENJX0FERFIgb3B0aW9uIGFwcGVuZGVkLiAgV2UgYXNzdW1lIHRoZQotICAgICAqIGlucHV0IGJ1ZmZlciBpcyBsb25nIGVub3VnaCB0aGF0IHdlIGNhbiBhcHBlbmQgdGhlIGV4dHJhCi0gICAgICogb3B0aW9uIHNhZmVseS4KLSAgICAgKi8KLSAgICBpZiAocmMgIT0gQ09ORlJFSiAmJiAhaG8tPm5lZ19hZGRyICYmICFoby0+b2xkX2FkZHJzICYmCi0Jd28tPnJlcV9hZGRyICYmICFyZWplY3RfaWZfZGlzYWdyZWUgJiYgIW5vcmVtb3RlaXApIHsKLQlpZiAocmMgPT0gQ09ORkFDSykgewotCSAgICByYyA9IENPTkZOQUs7Ci0JICAgIHVjcCA9IGlucDsJCQkvKiByZXNldCBwb2ludGVyICovCi0JICAgIHdvLT5yZXFfYWRkciA9IDA7CQkvKiBkb24ndCBhc2sgYWdhaW4gKi8KLQl9Ci0JUFVUQ0hBUihDSV9BRERSLCB1Y3ApOwotCVBVVENIQVIoQ0lMRU5fQUREUiwgdWNwKTsKLQl0bCA9IG50b2hsKHdvLT5oaXNhZGRyKTsKLQlQVVRMT05HKHRsLCB1Y3ApOwotICAgIH0KLQotICAgICpsZW4gPSB1Y3AgLSBpbnA7CQkJLyogQ29tcHV0ZSBvdXRwdXQgbGVuZ3RoICovCi0gICAgSVBDUERFQlVHKCgiaXBjcDogcmV0dXJuaW5nIENvbmZpZ3VyZS0lcyIsIENPREVOQU1FKHJjKSkpOwotICAgIHJldHVybiAocmMpOwkJCS8qIFJldHVybiBmaW5hbCBjb2RlICovCi19Ci0KLQotLyoKLSAqIGlwX2NoZWNrX29wdGlvbnMgLSBjaGVjayB0aGF0IGFueSBJUC1yZWxhdGVkIG9wdGlvbnMgYXJlIE9LLAotICogYW5kIGFzc2lnbiBhcHByb3ByaWF0ZSBkZWZhdWx0cy4KLSAqLwotc3RhdGljIHZvaWQKLWlwX2NoZWNrX29wdGlvbnMoKQotewotICAgIHN0cnVjdCBob3N0ZW50ICpocDsKLSAgICB1X2ludDMyX3QgbG9jYWw7Ci0gICAgaXBjcF9vcHRpb25zICp3byA9ICZpcGNwX3dhbnRvcHRpb25zWzBdOwotCi0gICAgLyoKLSAgICAgKiBEZWZhdWx0IG91ciBsb2NhbCBJUCBhZGRyZXNzIGJhc2VkIG9uIG91ciBob3N0bmFtZS4KLSAgICAgKiBJZiBsb2NhbCBJUCBhZGRyZXNzIGFscmVhZHkgZ2l2ZW4sIGRvbid0IGJvdGhlci4KLSAgICAgKi8KLSAgICBpZiAod28tPm91cmFkZHIgPT0gMCAmJiAhZGlzYWJsZV9kZWZhdWx0aXApIHsKLQkvKgotCSAqIExvb2sgdXAgb3VyIGhvc3RuYW1lIChwb3NzaWJseSB3aXRoIGRvbWFpbiBuYW1lIGFwcGVuZGVkKQotCSAqIGFuZCB0YWtlIHRoZSBmaXJzdCBJUCBhZGRyZXNzIGFzIG91ciBsb2NhbCBJUCBhZGRyZXNzLgotCSAqIElmIHRoZXJlIGlzbid0IGFuIElQIGFkZHJlc3MgZm9yIG91ciBob3N0bmFtZSwgdG9vIGJhZC4KLQkgKi8KLQl3by0+YWNjZXB0X2xvY2FsID0gMTsJLyogZG9uJ3QgaW5zaXN0IG9uIHRoaXMgZGVmYXVsdCB2YWx1ZSAqLwotCWlmICgoaHAgPSBnZXRob3N0YnluYW1lKGhvc3RuYW1lKSkgIT0gTlVMTCkgewotCSAgICBsb2NhbCA9ICoodV9pbnQzMl90ICopaHAtPmhfYWRkcjsKLQkgICAgaWYgKGxvY2FsICE9IDAgJiYgIWJhZF9pcF9hZHJzKGxvY2FsKSkKLQkJd28tPm91cmFkZHIgPSBsb2NhbDsKLQl9Ci0gICAgfQotICAgIGFza19mb3JfbG9jYWwgPSB3by0+b3VyYWRkciAhPSAwIHx8ICFkaXNhYmxlX2RlZmF1bHRpcDsKLX0KLQotCi0vKgotICogaXBfZGVtYW5kX2NvbmYgLSBjb25maWd1cmUgdGhlIGludGVyZmFjZSBhcyB0aG91Z2gKLSAqIElQQ1Agd2VyZSB1cCwgZm9yIHVzZSB3aXRoIGRpYWwtb24tZGVtYW5kLgotICovCi1zdGF0aWMgaW50Ci1pcF9kZW1hbmRfY29uZih1KQotICAgIGludCB1OwotewotICAgIGlwY3Bfb3B0aW9ucyAqd28gPSAmaXBjcF93YW50b3B0aW9uc1t1XTsKLQotICAgIGlmICh3by0+aGlzYWRkciA9PSAwICYmICFub3JlbW90ZWlwKSB7Ci0JLyogbWFrZSB1cCBhbiBhcmJpdHJhcnkgYWRkcmVzcyBmb3IgdGhlIHBlZXIgKi8KLQl3by0+aGlzYWRkciA9IGh0b25sKDB4MGE3MDcwNzAgKyBpZnVuaXQpOwotCXdvLT5hY2NlcHRfcmVtb3RlID0gMTsKLSAgICB9Ci0gICAgaWYgKHdvLT5vdXJhZGRyID09IDApIHsKLQkvKiBtYWtlIHVwIGFuIGFyYml0cmFyeSBhZGRyZXNzIGZvciB1cyAqLwotCXdvLT5vdXJhZGRyID0gaHRvbmwoMHgwYTQwNDA0MCArIGlmdW5pdCk7Ci0Jd28tPmFjY2VwdF9sb2NhbCA9IDE7Ci0JYXNrX2Zvcl9sb2NhbCA9IDA7CS8qIGRvbid0IHRlbGwgdGhlIHBlZXIgdGhpcyBhZGRyZXNzICovCi0gICAgfQotICAgIGlmICghc2lmYWRkcih1LCB3by0+b3VyYWRkciwgd28tPmhpc2FkZHIsIEdldE1hc2sod28tPm91cmFkZHIpKSkKLQlyZXR1cm4gMDsKLSAgICBpcGNwX3NjcmlwdChfUEFUSF9JUFBSRVVQLCAxKTsKLSAgICBpZiAoIXNpZnVwKHUpKQotCXJldHVybiAwOwotICAgIGlmICghc2lmbnBtb2RlKHUsIFBQUF9JUCwgTlBNT0RFX1FVRVVFKSkKLQlyZXR1cm4gMDsKLSAgICBpZiAod28tPmRlZmF1bHRfcm91dGUpCi0JaWYgKHNpZmRlZmF1bHRyb3V0ZSh1LCB3by0+b3VyYWRkciwgd28tPmhpc2FkZHIpKQotCSAgICBkZWZhdWx0X3JvdXRlX3NldFt1XSA9IDE7Ci0gICAgaWYgKHdvLT5wcm94eV9hcnApCi0JaWYgKHNpZnByb3h5YXJwKHUsIHdvLT5oaXNhZGRyKSkKLQkgICAgcHJveHlfYXJwX3NldFt1XSA9IDE7Ci0KLSAgICBub3RpY2UoImxvY2FsICBJUCBhZGRyZXNzICVJIiwgd28tPm91cmFkZHIpOwotICAgIGlmICh3by0+aGlzYWRkcikKLQlub3RpY2UoInJlbW90ZSBJUCBhZGRyZXNzICVJIiwgd28tPmhpc2FkZHIpOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLQotLyoKLSAqIGlwY3BfdXAgLSBJUENQIGhhcyBjb21lIFVQLgotICoKLSAqIENvbmZpZ3VyZSB0aGUgSVAgbmV0d29yayBpbnRlcmZhY2UgYXBwcm9wcmlhdGVseSBhbmQgYnJpbmcgaXQgdXAuCi0gKi8KLXN0YXRpYyB2b2lkCi1pcGNwX3VwKGYpCi0gICAgZnNtICpmOwotewotICAgIHVfaW50MzJfdCBtYXNrOwotICAgIGlwY3Bfb3B0aW9ucyAqaG8gPSAmaXBjcF9oaXNvcHRpb25zW2YtPnVuaXRdOwotICAgIGlwY3Bfb3B0aW9ucyAqZ28gPSAmaXBjcF9nb3RvcHRpb25zW2YtPnVuaXRdOwotICAgIGlwY3Bfb3B0aW9ucyAqd28gPSAmaXBjcF93YW50b3B0aW9uc1tmLT51bml0XTsKLQotICAgIElQQ1BERUJVRygoImlwY3A6IHVwIikpOwotCi0gICAgLyoKLSAgICAgKiBXZSBtdXN0IGhhdmUgYSBub24temVybyBJUCBhZGRyZXNzIGZvciBib3RoIGVuZHMgb2YgdGhlIGxpbmsuCi0gICAgICovCi0gICAgaWYgKCFoby0+bmVnX2FkZHIgJiYgIWhvLT5vbGRfYWRkcnMpCi0JaG8tPmhpc2FkZHIgPSB3by0+aGlzYWRkcjsKLQotICAgIGlmICghKGdvLT5uZWdfYWRkciB8fCBnby0+b2xkX2FkZHJzKSAmJiAod28tPm5lZ19hZGRyIHx8IHdvLT5vbGRfYWRkcnMpCi0JJiYgd28tPm91cmFkZHIgIT0gMCkgewotCWVycm9yKCJQZWVyIHJlZnVzZWQgdG8gYWdyZWUgdG8gb3VyIElQIGFkZHJlc3MiKTsKLQlpcGNwX2Nsb3NlKGYtPnVuaXQsICJSZWZ1c2VkIG91ciBJUCBhZGRyZXNzIik7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBpZiAoZ28tPm91cmFkZHIgPT0gMCkgewotCWVycm9yKCJDb3VsZCBub3QgZGV0ZXJtaW5lIGxvY2FsIElQIGFkZHJlc3MiKTsKLQlpcGNwX2Nsb3NlKGYtPnVuaXQsICJDb3VsZCBub3QgZGV0ZXJtaW5lIGxvY2FsIElQIGFkZHJlc3MiKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIGlmIChoby0+aGlzYWRkciA9PSAwICYmICFub3JlbW90ZWlwKSB7Ci0JaG8tPmhpc2FkZHIgPSBodG9ubCgweDBhNDA0MDQwICsgaWZ1bml0KTsKLQl3YXJuKCJDb3VsZCBub3QgZGV0ZXJtaW5lIHJlbW90ZSBJUCBhZGRyZXNzOiBkZWZhdWx0aW5nIHRvICVJIiwKLQkgICAgIGhvLT5oaXNhZGRyKTsKLSAgICB9Ci0gICAgc2NyaXB0X3NldGVudigiSVBMT0NBTCIsIGlwX250b2EoZ28tPm91cmFkZHIpLCAwKTsKLSAgICBpZiAoaG8tPmhpc2FkZHIgIT0gMCkKLQlzY3JpcHRfc2V0ZW52KCJJUFJFTU9URSIsIGlwX250b2EoaG8tPmhpc2FkZHIpLCAxKTsKLQotICAgIGlmICghZ28tPnJlcV9kbnMxKQotCSAgICBnby0+ZG5zYWRkclswXSA9IDA7Ci0gICAgaWYgKCFnby0+cmVxX2RuczIpCi0JICAgIGdvLT5kbnNhZGRyWzFdID0gMDsKLSAgICBpZiAoZ28tPmRuc2FkZHJbMF0pCi0Jc2NyaXB0X3NldGVudigiRE5TMSIsIGlwX250b2EoZ28tPmRuc2FkZHJbMF0pLCAwKTsKLSAgICBpZiAoZ28tPmRuc2FkZHJbMV0pCi0Jc2NyaXB0X3NldGVudigiRE5TMiIsIGlwX250b2EoZ28tPmRuc2FkZHJbMV0pLCAwKTsKLSAgICBpZiAodXNlcGVlcmRucyAmJiAoZ28tPmRuc2FkZHJbMF0gfHwgZ28tPmRuc2FkZHJbMV0pKSB7Ci0Jc2NyaXB0X3NldGVudigiVVNFUEVFUkROUyIsICIxIiwgMCk7Ci0JY3JlYXRlX3Jlc29sdihnby0+ZG5zYWRkclswXSwgZ28tPmRuc2FkZHJbMV0pOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ2hlY2sgdGhhdCB0aGUgcGVlciBpcyBhbGxvd2VkIHRvIHVzZSB0aGUgSVAgYWRkcmVzcyBpdCB3YW50cy4KLSAgICAgKi8KLSAgICBpZiAoaG8tPmhpc2FkZHIgIT0gMCAmJiAhYXV0aF9pcF9hZGRyKGYtPnVuaXQsIGhvLT5oaXNhZGRyKSkgewotCWVycm9yKCJQZWVyIGlzIG5vdCBhdXRob3JpemVkIHRvIHVzZSByZW1vdGUgYWRkcmVzcyAlSSIsIGhvLT5oaXNhZGRyKTsKLQlpcGNwX2Nsb3NlKGYtPnVuaXQsICJVbmF1dGhvcml6ZWQgcmVtb3RlIElQIGFkZHJlc3MiKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgLyogc2V0IHRjcCBjb21wcmVzc2lvbiAqLwotICAgIHNpZnZqY29tcChmLT51bml0LCBoby0+bmVnX3ZqLCBoby0+Y2ZsYWcsIGhvLT5tYXhzbG90aW5kZXgpOwotCi0gICAgLyoKLSAgICAgKiBJZiB3ZSBhcmUgZG9pbmcgZGlhbC1vbi1kZW1hbmQsIHRoZSBpbnRlcmZhY2UgaXMgYWxyZWFkeQotICAgICAqIGNvbmZpZ3VyZWQsIHNvIHdlIHB1dCBvdXQgYW55IHNhdmVkLXVwIHBhY2tldHMsIHRoZW4gc2V0IHRoZQotICAgICAqIGludGVyZmFjZSB0byBwYXNzIElQIHBhY2tldHMuCi0gICAgICovCi0gICAgaWYgKGRlbWFuZCkgewotCWlmIChnby0+b3VyYWRkciAhPSB3by0+b3VyYWRkciB8fCBoby0+aGlzYWRkciAhPSB3by0+aGlzYWRkcikgewotCSAgICBpcGNwX2NsZWFyX2FkZHJzKGYtPnVuaXQsIHdvLT5vdXJhZGRyLCB3by0+aGlzYWRkcik7Ci0JICAgIGlmIChnby0+b3VyYWRkciAhPSB3by0+b3VyYWRkcikgewotCQl3YXJuKCJMb2NhbCBJUCBhZGRyZXNzIGNoYW5nZWQgdG8gJUkiLCBnby0+b3VyYWRkcik7Ci0JCXNjcmlwdF9zZXRlbnYoIk9MRElQTE9DQUwiLCBpcF9udG9hKHdvLT5vdXJhZGRyKSwgMCk7Ci0JCXdvLT5vdXJhZGRyID0gZ28tPm91cmFkZHI7Ci0JICAgIH0gZWxzZQotCQlzY3JpcHRfdW5zZXRlbnYoIk9MRElQTE9DQUwiKTsKLQkgICAgaWYgKGhvLT5oaXNhZGRyICE9IHdvLT5oaXNhZGRyICYmIHdvLT5oaXNhZGRyICE9IDApIHsKLQkJd2FybigiUmVtb3RlIElQIGFkZHJlc3MgY2hhbmdlZCB0byAlSSIsIGhvLT5oaXNhZGRyKTsKLQkJc2NyaXB0X3NldGVudigiT0xESVBSRU1PVEUiLCBpcF9udG9hKHdvLT5oaXNhZGRyKSwgMCk7Ci0JCXdvLT5oaXNhZGRyID0gaG8tPmhpc2FkZHI7Ci0JICAgIH0gZWxzZQotCQlzY3JpcHRfdW5zZXRlbnYoIk9MRElQUkVNT1RFIik7Ci0KLQkgICAgLyogU2V0IHRoZSBpbnRlcmZhY2UgdG8gdGhlIG5ldyBhZGRyZXNzZXMgKi8KLQkgICAgbWFzayA9IEdldE1hc2soZ28tPm91cmFkZHIpOwotCSAgICBpZiAoIXNpZmFkZHIoZi0+dW5pdCwgZ28tPm91cmFkZHIsIGhvLT5oaXNhZGRyLCBtYXNrKSkgewotCQlpZiAoZGVidWcpCi0JCSAgICB3YXJuKCJJbnRlcmZhY2UgY29uZmlndXJhdGlvbiBmYWlsZWQiKTsKLQkJaXBjcF9jbG9zZShmLT51bml0LCAiSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gZmFpbGVkIik7Ci0JCXJldHVybjsKLQkgICAgfQotCi0JICAgIC8qIGFzc2lnbiBhIGRlZmF1bHQgcm91dGUgdGhyb3VnaCB0aGUgaW50ZXJmYWNlIGlmIHJlcXVpcmVkICovCi0JICAgIGlmIChpcGNwX3dhbnRvcHRpb25zW2YtPnVuaXRdLmRlZmF1bHRfcm91dGUpIAotCQlpZiAoc2lmZGVmYXVsdHJvdXRlKGYtPnVuaXQsIGdvLT5vdXJhZGRyLCBoby0+aGlzYWRkcikpCi0JCSAgICBkZWZhdWx0X3JvdXRlX3NldFtmLT51bml0XSA9IDE7Ci0KLQkgICAgLyogTWFrZSBhIHByb3h5IEFSUCBlbnRyeSBpZiByZXF1ZXN0ZWQuICovCi0JICAgIGlmIChoby0+aGlzYWRkciAhPSAwICYmIGlwY3Bfd2FudG9wdGlvbnNbZi0+dW5pdF0ucHJveHlfYXJwKQotCQlpZiAoc2lmcHJveHlhcnAoZi0+dW5pdCwgaG8tPmhpc2FkZHIpKQotCQkgICAgcHJveHlfYXJwX3NldFtmLT51bml0XSA9IDE7Ci0KLQl9Ci0JZGVtYW5kX3JleG1pdChQUFBfSVApOwotCXNpZm5wbW9kZShmLT51bml0LCBQUFBfSVAsIE5QTU9ERV9QQVNTKTsKLQotICAgIH0gZWxzZSB7Ci0JLyoKLQkgKiBTZXQgSVAgYWRkcmVzc2VzIGFuZCAoaWYgc3BlY2lmaWVkKSBuZXRtYXNrLgotCSAqLwotCW1hc2sgPSBHZXRNYXNrKGdvLT5vdXJhZGRyKTsKLQotI2lmICEoZGVmaW5lZChTVlI0KSAmJiAoZGVmaW5lZChTTkkpIHx8IGRlZmluZWQoX19VU0xDX18pKSkKLQlpZiAoIXNpZmFkZHIoZi0+dW5pdCwgZ28tPm91cmFkZHIsIGhvLT5oaXNhZGRyLCBtYXNrKSkgewotCSAgICBpZiAoZGVidWcpCi0JCXdhcm4oIkludGVyZmFjZSBjb25maWd1cmF0aW9uIGZhaWxlZCIpOwotCSAgICBpcGNwX2Nsb3NlKGYtPnVuaXQsICJJbnRlcmZhY2UgY29uZmlndXJhdGlvbiBmYWlsZWQiKTsKLQkgICAgcmV0dXJuOwotCX0KLSNlbmRpZgotCi0JLyogcnVuIHRoZSBwcmUtdXAgc2NyaXB0LCBpZiBhbnksIGFuZCB3YWl0IGZvciBpdCB0byBmaW5pc2ggKi8KLQlpcGNwX3NjcmlwdChfUEFUSF9JUFBSRVVQLCAxKTsKLQotCS8qIGJyaW5nIHRoZSBpbnRlcmZhY2UgdXAgZm9yIElQICovCi0JaWYgKCFzaWZ1cChmLT51bml0KSkgewotCSAgICBpZiAoZGVidWcpCi0JCXdhcm4oIkludGVyZmFjZSBmYWlsZWQgdG8gY29tZSB1cCIpOwotCSAgICBpcGNwX2Nsb3NlKGYtPnVuaXQsICJJbnRlcmZhY2UgY29uZmlndXJhdGlvbiBmYWlsZWQiKTsKLQkgICAgcmV0dXJuOwotCX0KLQotI2lmIChkZWZpbmVkKFNWUjQpICYmIChkZWZpbmVkKFNOSSkgfHwgZGVmaW5lZChfX1VTTENfXykpKQotCWlmICghc2lmYWRkcihmLT51bml0LCBnby0+b3VyYWRkciwgaG8tPmhpc2FkZHIsIG1hc2spKSB7Ci0JICAgIGlmIChkZWJ1ZykKLQkJd2FybigiSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gZmFpbGVkIik7Ci0JICAgIGlwY3BfY2xvc2UoZi0+dW5pdCwgIkludGVyZmFjZSBjb25maWd1cmF0aW9uIGZhaWxlZCIpOwotCSAgICByZXR1cm47Ci0JfQotI2VuZGlmCi0Jc2lmbnBtb2RlKGYtPnVuaXQsIFBQUF9JUCwgTlBNT0RFX1BBU1MpOwotCi0JLyogYXNzaWduIGEgZGVmYXVsdCByb3V0ZSB0aHJvdWdoIHRoZSBpbnRlcmZhY2UgaWYgcmVxdWlyZWQgKi8KLQlpZiAoaXBjcF93YW50b3B0aW9uc1tmLT51bml0XS5kZWZhdWx0X3JvdXRlKSAKLQkgICAgaWYgKHNpZmRlZmF1bHRyb3V0ZShmLT51bml0LCBnby0+b3VyYWRkciwgaG8tPmhpc2FkZHIpKQotCQlkZWZhdWx0X3JvdXRlX3NldFtmLT51bml0XSA9IDE7Ci0KLQkvKiBNYWtlIGEgcHJveHkgQVJQIGVudHJ5IGlmIHJlcXVlc3RlZC4gKi8KLQlpZiAoaG8tPmhpc2FkZHIgIT0gMCAmJiBpcGNwX3dhbnRvcHRpb25zW2YtPnVuaXRdLnByb3h5X2FycCkKLQkgICAgaWYgKHNpZnByb3h5YXJwKGYtPnVuaXQsIGhvLT5oaXNhZGRyKSkKLQkJcHJveHlfYXJwX3NldFtmLT51bml0XSA9IDE7Ci0KLQlpcGNwX3dhbnRvcHRpb25zWzBdLm91cmFkZHIgPSBnby0+b3VyYWRkcjsKLQotCW5vdGljZSgibG9jYWwgIElQIGFkZHJlc3MgJUkiLCBnby0+b3VyYWRkcik7Ci0JaWYgKGhvLT5oaXNhZGRyICE9IDApCi0JICAgIG5vdGljZSgicmVtb3RlIElQIGFkZHJlc3MgJUkiLCBoby0+aGlzYWRkcik7Ci0JaWYgKGdvLT5kbnNhZGRyWzBdKQotCSAgICBub3RpY2UoInByaW1hcnkgICBETlMgYWRkcmVzcyAlSSIsIGdvLT5kbnNhZGRyWzBdKTsKLQlpZiAoZ28tPmRuc2FkZHJbMV0pCi0JICAgIG5vdGljZSgic2Vjb25kYXJ5IEROUyBhZGRyZXNzICVJIiwgZ28tPmRuc2FkZHJbMV0pOwotICAgIH0KLQotICAgIHJlc2V0X2xpbmtfc3RhdHMoZi0+dW5pdCk7Ci0KLSAgICBucF91cChmLT51bml0LCBQUFBfSVApOwotICAgIGlwY3BfaXNfdXAgPSAxOwotCi0gICAgbm90aWZ5KGlwX3VwX25vdGlmaWVyLCAwKTsKLSAgICBpZiAoaXBfdXBfaG9vaykKLQlpcF91cF9ob29rKCk7Ci0KLSAgICAvKgotICAgICAqIEV4ZWN1dGUgdGhlIGlwLXVwIHNjcmlwdCwgbGlrZSB0aGlzOgotICAgICAqCS9ldGMvcHBwL2lwLXVwIGludGVyZmFjZSB0dHkgc3BlZWQgbG9jYWwtSVAgcmVtb3RlLUlQCi0gICAgICovCi0gICAgaWYgKGlwY3Bfc2NyaXB0X3N0YXRlID09IHNfZG93biAmJiBpcGNwX3NjcmlwdF9waWQgPT0gMCkgewotCWlwY3Bfc2NyaXB0X3N0YXRlID0gc191cDsKLQlpcGNwX3NjcmlwdChfUEFUSF9JUFVQLCAwKTsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIGlwY3BfZG93biAtIElQQ1AgaGFzIGdvbmUgRE9XTi4KLSAqCi0gKiBUYWtlIHRoZSBJUCBuZXR3b3JrIGludGVyZmFjZSBkb3duLCBjbGVhciBpdHMgYWRkcmVzc2VzCi0gKiBhbmQgZGVsZXRlIHJvdXRlcyB0aHJvdWdoIGl0LgotICovCi1zdGF0aWMgdm9pZAotaXBjcF9kb3duKGYpCi0gICAgZnNtICpmOwotewotICAgIElQQ1BERUJVRygoImlwY3A6IGRvd24iKSk7Ci0gICAgLyogWFhYIGEgYml0IElQdjQtY2VudHJpYyBoZXJlLCB3ZSBvbmx5IG5lZWQgdG8gZ2V0IHRoZSBzdGF0cwotICAgICAqIGJlZm9yZSB0aGUgaW50ZXJmYWNlIGlzIG1hcmtlZCBkb3duLiAqLwotICAgIC8qIFhYWCBtb3JlIGNvcnJlY3Q6IHdlIG11c3QgZ2V0IHRoZSBzdGF0cyBiZWZvcmUgcnVubmluZyB0aGUgbm90aWZpZXJzLAotICAgICAqIGF0IGxlYXN0IGZvciB0aGUgcmFkaXVzIHBsdWdpbiAqLwotICAgIHVwZGF0ZV9saW5rX3N0YXRzKGYtPnVuaXQpOwotICAgIG5vdGlmeShpcF9kb3duX25vdGlmaWVyLCAwKTsKLSAgICBpZiAoaXBfZG93bl9ob29rKQotCWlwX2Rvd25faG9vaygpOwotICAgIGlmIChpcGNwX2lzX3VwKSB7Ci0JaXBjcF9pc191cCA9IDA7Ci0JbnBfZG93bihmLT51bml0LCBQUFBfSVApOwotICAgIH0KLSAgICBzaWZ2amNvbXAoZi0+dW5pdCwgMCwgMCwgMCk7Ci0KLSAgICBwcmludF9saW5rX3N0YXRzKCk7IC8qIF9hZnRlcl8gcnVubmluZyB0aGUgbm90aWZpZXJzIGFuZCBpcF9kb3duX2hvb2soKSwKLQkJCSAqIGJlY2F1c2UgcHJpbnRfbGlua19zdGF0cygpIHNldHMgbGlua19zdGF0c192YWxpZAotCQkJICogdG8gMCAoemVybykgKi8KLQotICAgIC8qCi0gICAgICogSWYgd2UgYXJlIGRvaW5nIGRpYWwtb24tZGVtYW5kLCBzZXQgdGhlIGludGVyZmFjZQotICAgICAqIHRvIHF1ZXVlIHVwIG91dGdvaW5nIHBhY2tldHMgKGZvciBub3cpLgotICAgICAqLwotICAgIGlmIChkZW1hbmQpIHsKLQlzaWZucG1vZGUoZi0+dW5pdCwgUFBQX0lQLCBOUE1PREVfUVVFVUUpOwotICAgIH0gZWxzZSB7Ci0Jc2lmbnBtb2RlKGYtPnVuaXQsIFBQUF9JUCwgTlBNT0RFX0RST1ApOwotCXNpZmRvd24oZi0+dW5pdCk7Ci0JaXBjcF9jbGVhcl9hZGRycyhmLT51bml0LCBpcGNwX2dvdG9wdGlvbnNbZi0+dW5pdF0ub3VyYWRkciwKLQkJCSBpcGNwX2hpc29wdGlvbnNbZi0+dW5pdF0uaGlzYWRkcik7Ci0gICAgfQotCi0gICAgLyogRXhlY3V0ZSB0aGUgaXAtZG93biBzY3JpcHQgKi8KLSAgICBpZiAoaXBjcF9zY3JpcHRfc3RhdGUgPT0gc191cCAmJiBpcGNwX3NjcmlwdF9waWQgPT0gMCkgewotCWlwY3Bfc2NyaXB0X3N0YXRlID0gc19kb3duOwotCWlwY3Bfc2NyaXB0KF9QQVRIX0lQRE9XTiwgMCk7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBpcGNwX2NsZWFyX2FkZHJzKCkgLSBjbGVhciB0aGUgaW50ZXJmYWNlIGFkZHJlc3Nlcywgcm91dGVzLAotICogcHJveHkgYXJwIGVudHJpZXMsIGV0Yy4KLSAqLwotc3RhdGljIHZvaWQKLWlwY3BfY2xlYXJfYWRkcnModW5pdCwgb3VyYWRkciwgaGlzYWRkcikKLSAgICBpbnQgdW5pdDsKLSAgICB1X2ludDMyX3Qgb3VyYWRkcjsgIC8qIGxvY2FsIGFkZHJlc3MgKi8KLSAgICB1X2ludDMyX3QgaGlzYWRkcjsgIC8qIHJlbW90ZSBhZGRyZXNzICovCi17Ci0gICAgaWYgKHByb3h5X2FycF9zZXRbdW5pdF0pIHsKLQljaWZwcm94eWFycCh1bml0LCBoaXNhZGRyKTsKLQlwcm94eV9hcnBfc2V0W3VuaXRdID0gMDsKLSAgICB9Ci0gICAgaWYgKGRlZmF1bHRfcm91dGVfc2V0W3VuaXRdKSB7Ci0JY2lmZGVmYXVsdHJvdXRlKHVuaXQsIG91cmFkZHIsIGhpc2FkZHIpOwotCWRlZmF1bHRfcm91dGVfc2V0W3VuaXRdID0gMDsKLSAgICB9Ci0gICAgY2lmYWRkcih1bml0LCBvdXJhZGRyLCBoaXNhZGRyKTsKLX0KLQotCi0vKgotICogaXBjcF9maW5pc2hlZCAtIHBvc3NpYmx5IHNodXQgZG93biB0aGUgbG93ZXIgbGF5ZXJzLgotICovCi1zdGF0aWMgdm9pZAotaXBjcF9maW5pc2hlZChmKQotICAgIGZzbSAqZjsKLXsKLQlpZiAoaXBjcF9pc19vcGVuKSB7Ci0JCWlwY3BfaXNfb3BlbiA9IDA7Ci0JCW5wX2ZpbmlzaGVkKGYtPnVuaXQsIFBQUF9JUCk7Ci0JfQotfQotCi0KLS8qCi0gKiBpcGNwX3NjcmlwdF9kb25lIC0gY2FsbGVkIHdoZW4gdGhlIGlwLXVwIG9yIGlwLWRvd24gc2NyaXB0Ci0gKiBoYXMgZmluaXNoZWQuCi0gKi8KLXN0YXRpYyB2b2lkCi1pcGNwX3NjcmlwdF9kb25lKGFyZykKLSAgICB2b2lkICphcmc7Ci17Ci0gICAgaXBjcF9zY3JpcHRfcGlkID0gMDsKLSAgICBzd2l0Y2ggKGlwY3Bfc2NyaXB0X3N0YXRlKSB7Ci0gICAgY2FzZSBzX3VwOgotCWlmIChpcGNwX2ZzbVswXS5zdGF0ZSAhPSBPUEVORUQpIHsKLQkgICAgaXBjcF9zY3JpcHRfc3RhdGUgPSBzX2Rvd247Ci0JICAgIGlwY3Bfc2NyaXB0KF9QQVRIX0lQRE9XTiwgMCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2Ugc19kb3duOgotCWlmIChpcGNwX2ZzbVswXS5zdGF0ZSA9PSBPUEVORUQpIHsKLQkgICAgaXBjcF9zY3JpcHRfc3RhdGUgPSBzX3VwOwotCSAgICBpcGNwX3NjcmlwdChfUEFUSF9JUFVQLCAwKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBpcGNwX3NjcmlwdCAtIEV4ZWN1dGUgYSBzY3JpcHQgd2l0aCBhcmd1bWVudHMKLSAqIGludGVyZmFjZS1uYW1lIHR0eS1uYW1lIHNwZWVkIGxvY2FsLUlQIHJlbW90ZS1JUC4KLSAqLwotc3RhdGljIHZvaWQKLWlwY3Bfc2NyaXB0KHNjcmlwdCwgd2FpdCkKLSAgICBjaGFyICpzY3JpcHQ7Ci0gICAgaW50IHdhaXQ7Ci17Ci0gICAgY2hhciBzdHJzcGVlZFszMl0sIHN0cmxvY2FsWzMyXSwgc3RycmVtb3RlWzMyXTsKLSAgICBjaGFyICphcmd2WzhdOwotCi0gICAgc2xwcmludGYoc3Ryc3BlZWQsIHNpemVvZihzdHJzcGVlZCksICIlZCIsIGJhdWRfcmF0ZSk7Ci0gICAgc2xwcmludGYoc3RybG9jYWwsIHNpemVvZihzdHJsb2NhbCksICIlSSIsIGlwY3BfZ290b3B0aW9uc1swXS5vdXJhZGRyKTsKLSAgICBzbHByaW50ZihzdHJyZW1vdGUsIHNpemVvZihzdHJyZW1vdGUpLCAiJUkiLCBpcGNwX2hpc29wdGlvbnNbMF0uaGlzYWRkcik7Ci0KLSAgICBhcmd2WzBdID0gc2NyaXB0OwotICAgIGFyZ3ZbMV0gPSBpZm5hbWU7Ci0gICAgYXJndlsyXSA9IGRldm5hbTsKLSAgICBhcmd2WzNdID0gc3Ryc3BlZWQ7Ci0gICAgYXJndls0XSA9IHN0cmxvY2FsOwotICAgIGFyZ3ZbNV0gPSBzdHJyZW1vdGU7Ci0gICAgYXJndls2XSA9IGlwcGFyYW07Ci0gICAgYXJndls3XSA9IE5VTEw7Ci0gICAgaWYgKHdhaXQpCi0JcnVuX3Byb2dyYW0oc2NyaXB0LCBhcmd2LCAwLCBOVUxMLCBOVUxMLCAxKTsKLSAgICBlbHNlCi0JaXBjcF9zY3JpcHRfcGlkID0gcnVuX3Byb2dyYW0oc2NyaXB0LCBhcmd2LCAwLCBpcGNwX3NjcmlwdF9kb25lLAotCQkJCSAgICAgIE5VTEwsIDApOwotfQotCi0vKgotICogY3JlYXRlX3Jlc29sdiAtIGNyZWF0ZSB0aGUgcmVwbGFjZW1lbnQgcmVzb2x2LmNvbmYgZmlsZQotICovCi1zdGF0aWMgdm9pZAotY3JlYXRlX3Jlc29sdihwZWVyZG5zMSwgcGVlcmRuczIpCi0gICAgdV9pbnQzMl90IHBlZXJkbnMxLCBwZWVyZG5zMjsKLXsKLSNpZiAhZGVmaW5lZChfX0FORFJPSURfXykKLSAgICBGSUxFICpmOwotCi0gICAgZiA9IGZvcGVuKF9QQVRIX1JFU09MViwgInciKTsKLSAgICBpZiAoZiA9PSBOVUxMKSB7Ci0JZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgJXM6ICVtIiwgX1BBVEhfUkVTT0xWKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHBlZXJkbnMxKQotCWZwcmludGYoZiwgIm5hbWVzZXJ2ZXIgJXNcbiIsIGlwX250b2EocGVlcmRuczEpKTsKLQotICAgIGlmIChwZWVyZG5zMikKLQlmcHJpbnRmKGYsICJuYW1lc2VydmVyICVzXG4iLCBpcF9udG9hKHBlZXJkbnMyKSk7Ci0KLSAgICBpZiAoZmVycm9yKGYpKQotCWVycm9yKCJXcml0ZSBmYWlsZWQgdG8gJXM6ICVtIiwgX1BBVEhfUkVTT0xWKTsKLQotICAgIGZjbG9zZShmKTsKLSNlbmRpZgotfQotCi0vKgotICogaXBjcF9wcmludHBrdCAtIHByaW50IHRoZSBjb250ZW50cyBvZiBhbiBJUENQIHBhY2tldC4KLSAqLwotc3RhdGljIGNoYXIgKmlwY3BfY29kZW5hbWVzW10gPSB7Ci0gICAgIkNvbmZSZXEiLCAiQ29uZkFjayIsICJDb25mTmFrIiwgIkNvbmZSZWoiLAotICAgICJUZXJtUmVxIiwgIlRlcm1BY2siLCAiQ29kZVJlaiIKLX07Ci0KLXN0YXRpYyBpbnQKLWlwY3BfcHJpbnRwa3QocCwgcGxlbiwgcHJpbnRlciwgYXJnKQotICAgIHVfY2hhciAqcDsKLSAgICBpbnQgcGxlbjsKLSAgICB2b2lkICgqcHJpbnRlcikgX19QKCh2b2lkICosIGNoYXIgKiwgLi4uKSk7Ci0gICAgdm9pZCAqYXJnOwotewotICAgIGludCBjb2RlLCBpZCwgbGVuLCBvbGVuOwotICAgIHVfY2hhciAqcHN0YXJ0LCAqb3B0ZW5kOwotICAgIHVfc2hvcnQgY2lzaG9ydDsKLSAgICB1X2ludDMyX3QgY2lsb25nOwotCi0gICAgaWYgKHBsZW4gPCBIRUFERVJMRU4pCi0JcmV0dXJuIDA7Ci0gICAgcHN0YXJ0ID0gcDsKLSAgICBHRVRDSEFSKGNvZGUsIHApOwotICAgIEdFVENIQVIoaWQsIHApOwotICAgIEdFVFNIT1JUKGxlbiwgcCk7Ci0gICAgaWYgKGxlbiA8IEhFQURFUkxFTiB8fCBsZW4gPiBwbGVuKQotCXJldHVybiAwOwotCi0gICAgaWYgKGNvZGUgPj0gMSAmJiBjb2RlIDw9IHNpemVvZihpcGNwX2NvZGVuYW1lcykgLyBzaXplb2YoY2hhciAqKSkKLQlwcmludGVyKGFyZywgIiAlcyIsIGlwY3BfY29kZW5hbWVzW2NvZGUtMV0pOwotICAgIGVsc2UKLQlwcmludGVyKGFyZywgIiBjb2RlPTB4JXgiLCBjb2RlKTsKLSAgICBwcmludGVyKGFyZywgIiBpZD0weCV4IiwgaWQpOwotICAgIGxlbiAtPSBIRUFERVJMRU47Ci0gICAgc3dpdGNoIChjb2RlKSB7Ci0gICAgY2FzZSBDT05GUkVROgotICAgIGNhc2UgQ09ORkFDSzoKLSAgICBjYXNlIENPTkZOQUs6Ci0gICAgY2FzZSBDT05GUkVKOgotCS8qIHByaW50IG9wdGlvbiBsaXN0ICovCi0Jd2hpbGUgKGxlbiA+PSAyKSB7Ci0JICAgIEdFVENIQVIoY29kZSwgcCk7Ci0JICAgIEdFVENIQVIob2xlbiwgcCk7Ci0JICAgIHAgLT0gMjsKLQkgICAgaWYgKG9sZW4gPCAyIHx8IG9sZW4gPiBsZW4pIHsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgcHJpbnRlcihhcmcsICIgPCIpOwotCSAgICBsZW4gLT0gb2xlbjsKLQkgICAgb3B0ZW5kID0gcCArIG9sZW47Ci0JICAgIHN3aXRjaCAoY29kZSkgewotCSAgICBjYXNlIENJX0FERFJTOgotCQlpZiAob2xlbiA9PSBDSUxFTl9BRERSUykgewotCQkgICAgcCArPSAyOwotCQkgICAgR0VUTE9ORyhjaWxvbmcsIHApOwotCQkgICAgcHJpbnRlcihhcmcsICJhZGRycyAlSSIsIGh0b25sKGNpbG9uZykpOwotCQkgICAgR0VUTE9ORyhjaWxvbmcsIHApOwotCQkgICAgcHJpbnRlcihhcmcsICIgJUkiLCBodG9ubChjaWxvbmcpKTsKLQkJfQotCQlicmVhazsKLQkgICAgY2FzZSBDSV9DT01QUkVTU1RZUEU6Ci0JCWlmIChvbGVuID49IENJTEVOX0NPTVBSRVNTKSB7Ci0JCSAgICBwICs9IDI7Ci0JCSAgICBHRVRTSE9SVChjaXNob3J0LCBwKTsKLQkJICAgIHByaW50ZXIoYXJnLCAiY29tcHJlc3MgIik7Ci0JCSAgICBzd2l0Y2ggKGNpc2hvcnQpIHsKLQkJICAgIGNhc2UgSVBDUF9WSl9DT01QOgotCQkJcHJpbnRlcihhcmcsICJWSiIpOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIElQQ1BfVkpfQ09NUF9PTEQ6Ci0JCQlwcmludGVyKGFyZywgIm9sZC1WSiIpOwotCQkJYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkJcHJpbnRlcihhcmcsICIweCV4IiwgY2lzaG9ydCk7Ci0JCSAgICB9Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgQ0lfQUREUjoKLQkJaWYgKG9sZW4gPT0gQ0lMRU5fQUREUikgewotCQkgICAgcCArPSAyOwotCQkgICAgR0VUTE9ORyhjaWxvbmcsIHApOwotCQkgICAgcHJpbnRlcihhcmcsICJhZGRyICVJIiwgaHRvbmwoY2lsb25nKSk7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgQ0lfTVNfRE5TMToKLQkgICAgY2FzZSBDSV9NU19ETlMyOgotCSAgICAgICAgcCArPSAyOwotCQlHRVRMT05HKGNpbG9uZywgcCk7Ci0JCXByaW50ZXIoYXJnLCAibXMtZG5zJWQgJUkiLCAoY29kZSA9PSBDSV9NU19ETlMxPyAxOiAyKSwKLQkJCWh0b25sKGNpbG9uZykpOwotCQlicmVhazsKLQkgICAgY2FzZSBDSV9NU19XSU5TMToKLQkgICAgY2FzZSBDSV9NU19XSU5TMjoKLQkgICAgICAgIHAgKz0gMjsKLQkJR0VUTE9ORyhjaWxvbmcsIHApOwotCQlwcmludGVyKGFyZywgIm1zLXdpbnMgJUkiLCBodG9ubChjaWxvbmcpKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgd2hpbGUgKHAgPCBvcHRlbmQpIHsKLQkJR0VUQ0hBUihjb2RlLCBwKTsKLQkJcHJpbnRlcihhcmcsICIgJS4yeCIsIGNvZGUpOwotCSAgICB9Ci0JICAgIHByaW50ZXIoYXJnLCAiPiIpOwotCX0KLQlicmVhazsKLQotICAgIGNhc2UgVEVSTUFDSzoKLSAgICBjYXNlIFRFUk1SRVE6Ci0JaWYgKGxlbiA+IDAgJiYgKnAgPj0gJyAnICYmICpwIDwgMHg3ZikgewotCSAgICBwcmludGVyKGFyZywgIiAiKTsKLQkgICAgcHJpbnRfc3RyaW5nKChjaGFyICopcCwgbGVuLCBwcmludGVyLCBhcmcpOwotCSAgICBwICs9IGxlbjsKLQkgICAgbGVuID0gMDsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotCi0gICAgLyogcHJpbnQgdGhlIHJlc3Qgb2YgdGhlIGJ5dGVzIGluIHRoZSBwYWNrZXQgKi8KLSAgICBmb3IgKDsgbGVuID4gMDsgLS1sZW4pIHsKLQlHRVRDSEFSKGNvZGUsIHApOwotCXByaW50ZXIoYXJnLCAiICUuMngiLCBjb2RlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcCAtIHBzdGFydDsKLX0KLQotLyoKLSAqIGlwX2FjdGl2ZV9wa3QgLSBzZWUgaWYgdGhpcyBJUCBwYWNrZXQgaXMgd29ydGggYnJpbmdpbmcgdGhlIGxpbmsgdXAgZm9yLgotICogV2UgZG9uJ3QgYnJpbmcgdGhlIGxpbmsgdXAgZm9yIElQIGZyYWdtZW50cyBvciBmb3IgVENQIEZJTiBwYWNrZXRzCi0gKiB3aXRoIG5vIGRhdGEuCi0gKi8KLSNkZWZpbmUgSVBfSERSTEVOCTIwCS8qIGJ5dGVzICovCi0jZGVmaW5lIElQX09GRk1BU0sJMHgxZmZmCi0jaWZuZGVmIElQUFJPVE9fVENQCi0jZGVmaW5lIElQUFJPVE9fVENQCTYKLSNlbmRpZgotI2RlZmluZSBUQ1BfSERSTEVOCTIwCi0jZGVmaW5lIFRIX0ZJTgkJMHgwMQotCi0vKgotICogV2UgdXNlIHRoZXNlIG1hY3JvcyBiZWNhdXNlIHRoZSBJUCBoZWFkZXIgbWF5IGJlIGF0IGFuIG9kZCBhZGRyZXNzLAotICogYW5kIHNvbWUgY29tcGlsZXJzIG1pZ2h0IHVzZSB3b3JkIGxvYWRzIHRvIGdldCB0aF9vZmYgb3IgaXBfaGwuCi0gKi8KLQotI2RlZmluZSBuZXRfc2hvcnQoeCkJKCgoeClbMF0gPDwgOCkgKyAoeClbMV0pCi0jZGVmaW5lIGdldF9pcGhsKHgpCSgoKHVuc2lnbmVkIGNoYXIgKikoeCkpWzBdICYgMHhGKQotI2RlZmluZSBnZXRfaXBvZmYoeCkJbmV0X3Nob3J0KCh1bnNpZ25lZCBjaGFyICopKHgpICsgNikKLSNkZWZpbmUgZ2V0X2lwcHJvdG8oeCkJKCgodW5zaWduZWQgY2hhciAqKSh4KSlbOV0pCi0jZGVmaW5lIGdldF90Y3BvZmYoeCkJKCgodW5zaWduZWQgY2hhciAqKSh4KSlbMTJdID4+IDQpCi0jZGVmaW5lIGdldF90Y3BmbGFncyh4KQkoKCh1bnNpZ25lZCBjaGFyICopKHgpKVsxM10pCi0KLXN0YXRpYyBpbnQKLWlwX2FjdGl2ZV9wa3QocGt0LCBsZW4pCi0gICAgdV9jaGFyICpwa3Q7Ci0gICAgaW50IGxlbjsKLXsKLSAgICB1X2NoYXIgKnRjcDsKLSAgICBpbnQgaGxlbjsKLQotICAgIGxlbiAtPSBQUFBfSERSTEVOOwotICAgIHBrdCArPSBQUFBfSERSTEVOOwotICAgIGlmIChsZW4gPCBJUF9IRFJMRU4pCi0JcmV0dXJuIDA7Ci0gICAgaWYgKChnZXRfaXBvZmYocGt0KSAmIElQX09GRk1BU0spICE9IDApCi0JcmV0dXJuIDA7Ci0gICAgaWYgKGdldF9pcHByb3RvKHBrdCkgIT0gSVBQUk9UT19UQ1ApCi0JcmV0dXJuIDE7Ci0gICAgaGxlbiA9IGdldF9pcGhsKHBrdCkgKiA0OwotICAgIGlmIChsZW4gPCBobGVuICsgVENQX0hEUkxFTikKLQlyZXR1cm4gMDsKLSAgICB0Y3AgPSBwa3QgKyBobGVuOwotICAgIGlmICgoZ2V0X3RjcGZsYWdzKHRjcCkgJiBUSF9GSU4pICE9IDAgJiYgbGVuID09IGhsZW4gKyBnZXRfdGNwb2ZmKHRjcCkgKiA0KQotCXJldHVybiAwOwotICAgIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvcHBwZC9pcGNwLmggYi9wcHBkL2lwY3AuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNmMTRjOS4uMDAwMDAwMAotLS0gYS9wcHBkL2lwY3AuaAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBpcGNwLmggLSBJUCBDb250cm9sIFByb3RvY29sIGRlZmluaXRpb25zLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk4NC0yMDAwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBuYW1lICJDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHBlcm1pc3Npb24gb3IgYW55IGxlZ2FsCi0gKiAgICBkZXRhaWxzLCBwbGVhc2UgY29udGFjdAotICogICAgICBPZmZpY2Ugb2YgVGVjaG5vbG9neSBUcmFuc2ZlcgotICogICAgICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQotICogICAgICA1MDAwIEZvcmJlcyBBdmVudWUKLSAqICAgICAgUGl0dHNidXJnaCwgUEEgIDE1MjEzLTM4OTAKLSAqICAgICAgKDQxMikgMjY4LTQzODcsIGZheDogKDQxMikgMjY4LTczOTUKLSAqICAgICAgdGVjaC10cmFuc2ZlckBhbmRyZXcuY211LmVkdQotICoKLSAqIDQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQ29tcHV0aW5nIFNlcnZpY2VzCi0gKiAgICAgYXQgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkgKGh0dHA6Ly93d3cuY211LmVkdS9jb21wdXRpbmcvKS4iCi0gKgotICogQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi0gKiBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLSAqIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLSAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLSAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICoKLSAqICRJZDogaXBjcC5oLHYgMS4xNCAyMDAyLzEyLzA0IDIzOjAzOjMyIHBhdWx1cyBFeHAgJAotICovCi0KLS8qCi0gKiBPcHRpb25zLgotICovCi0jZGVmaW5lIENJX0FERFJTCTEJLyogSVAgQWRkcmVzc2VzICovCi0jZGVmaW5lIENJX0NPTVBSRVNTVFlQRQkyCS8qIENvbXByZXNzaW9uIFR5cGUgKi8KLSNkZWZpbmUJQ0lfQUREUgkJMwotCi0jZGVmaW5lIENJX01TX0ROUzEJMTI5CS8qIFByaW1hcnkgRE5TIHZhbHVlICovCi0jZGVmaW5lIENJX01TX1dJTlMxCTEzMAkvKiBQcmltYXJ5IFdJTlMgdmFsdWUgKi8KLSNkZWZpbmUgQ0lfTVNfRE5TMgkxMzEJLyogU2Vjb25kYXJ5IEROUyB2YWx1ZSAqLwotI2RlZmluZSBDSV9NU19XSU5TMgkxMzIJLyogU2Vjb25kYXJ5IFdJTlMgdmFsdWUgKi8KLQotI2RlZmluZSBNQVhfU1RBVEVTIDE2CQkvKiBmcm9tIHNsY29tcHJlc3MuaCAqLwotCi0jZGVmaW5lIElQQ1BfVkpNT0RFX09MRCAxCS8qICJvbGQiIG1vZGUgKG9wdGlvbiAjID0gMHgwMDM3KSAqLwotI2RlZmluZSBJUENQX1ZKTU9ERV9SRkMxMTcyIDIJLyogIm9sZC1yZmMibW9kZSAob3B0aW9uICMgPSAweDAwMmQpICovCi0jZGVmaW5lIElQQ1BfVkpNT0RFX1JGQzEzMzIgMwkvKiAibmV3LXJmYyJtb2RlIChvcHRpb24gIyA9IDB4MDAyZCwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIG1heHNsb3QgYW5kIHNsb3QgbnVtYmVyIGNvbXByZXNzaW9uKSAqLwotCi0jZGVmaW5lIElQQ1BfVkpfQ09NUCAweDAwMmQJLyogY3VycmVudCB2YWx1ZSBmb3IgVkogY29tcHJlc3Npb24gb3B0aW9uKi8KLSNkZWZpbmUgSVBDUF9WSl9DT01QX09MRCAweDAwMzcJLyogIm9sZCIgKGkuZSwgYnJva2VuKSB2YWx1ZSBmb3IgVkogKi8KLQkJCQkvKiBjb21wcmVzc2lvbiBvcHRpb24qLyAKLQotdHlwZWRlZiBzdHJ1Y3QgaXBjcF9vcHRpb25zIHsKLSAgICBib29sIG5lZ19hZGRyOwkJLyogTmVnb3RpYXRlIElQIEFkZHJlc3M/ICovCi0gICAgYm9vbCBvbGRfYWRkcnM7CQkvKiBVc2Ugb2xkIChJUC1BZGRyZXNzZXMpIG9wdGlvbj8gKi8KLSAgICBib29sIHJlcV9hZGRyOwkJLyogQXNrIHBlZXIgdG8gc2VuZCBJUCBhZGRyZXNzPyAqLwotICAgIGJvb2wgZGVmYXVsdF9yb3V0ZTsJCS8qIEFzc2lnbiBkZWZhdWx0IHJvdXRlIHRocm91Z2ggaW50ZXJmYWNlPyAqLwotICAgIGJvb2wgcHJveHlfYXJwOwkJLyogTWFrZSBwcm94eSBBUlAgZW50cnkgZm9yIHBlZXI/ICovCi0gICAgYm9vbCBuZWdfdmo7CQkvKiBWYW4gSmFjb2Jzb24gQ29tcHJlc3Npb24/ICovCi0gICAgYm9vbCBvbGRfdmo7CQkvKiB1c2Ugb2xkIChzaG9ydCkgZm9ybSBvZiBWSiBvcHRpb24/ICovCi0gICAgYm9vbCBhY2NlcHRfbG9jYWw7CQkvKiBhY2NlcHQgcGVlcidzIHZhbHVlIGZvciBvdXJhZGRyICovCi0gICAgYm9vbCBhY2NlcHRfcmVtb3RlOwkJLyogYWNjZXB0IHBlZXIncyB2YWx1ZSBmb3IgaGlzYWRkciAqLwotICAgIGJvb2wgcmVxX2RuczE7CQkvKiBBc2sgcGVlciB0byBzZW5kIHByaW1hcnkgRE5TIGFkZHJlc3M/ICovCi0gICAgYm9vbCByZXFfZG5zMjsJCS8qIEFzayBwZWVyIHRvIHNlbmQgc2Vjb25kYXJ5IEROUyBhZGRyZXNzPyAqLwotICAgIGludCAgdmpfcHJvdG9jb2w7CQkvKiBwcm90b2NvbCB2YWx1ZSB0byB1c2UgaW4gVkogb3B0aW9uICovCi0gICAgaW50ICBtYXhzbG90aW5kZXg7CQkvKiB2YWx1ZXMgZm9yIFJGQzEzMzIgVkogY29tcHJlc3Npb24gbmVnLiAqLwotICAgIGJvb2wgY2ZsYWc7Ci0gICAgdV9pbnQzMl90IG91cmFkZHIsIGhpc2FkZHI7CS8qIEFkZHJlc3NlcyBpbiBORVRXT1JLIEJZVEUgT1JERVIgKi8KLSAgICB1X2ludDMyX3QgZG5zYWRkclsyXTsJLyogUHJpbWFyeSBhbmQgc2Vjb25kYXJ5IE1TIEROUyBlbnRyaWVzICovCi0gICAgdV9pbnQzMl90IHdpbnNhZGRyWzJdOwkvKiBQcmltYXJ5IGFuZCBzZWNvbmRhcnkgTVMgV0lOUyBlbnRyaWVzICovCi19IGlwY3Bfb3B0aW9uczsKLQotZXh0ZXJuIGZzbSBpcGNwX2ZzbVtdOwotZXh0ZXJuIGlwY3Bfb3B0aW9ucyBpcGNwX3dhbnRvcHRpb25zW107Ci1leHRlcm4gaXBjcF9vcHRpb25zIGlwY3BfZ290b3B0aW9uc1tdOwotZXh0ZXJuIGlwY3Bfb3B0aW9ucyBpcGNwX2FsbG93b3B0aW9uc1tdOwotZXh0ZXJuIGlwY3Bfb3B0aW9ucyBpcGNwX2hpc29wdGlvbnNbXTsKLQotY2hhciAqaXBfbnRvYSBfX1AoKHVfaW50MzJfdCkpOwotCi1leHRlcm4gc3RydWN0IHByb3RlbnQgaXBjcF9wcm90ZW50OwpkaWZmIC0tZ2l0IGEvcHBwZC9pcHY2Y3AuYyBiL3BwcGQvaXB2NmNwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NmZmODQuLjAwMDAwMDAKLS0tIGEvcHBwZC9pcHY2Y3AuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NDQgKzAsMCBAQAotLyoKLSAqIGlwdjZjcC5jIC0gUFBQIElQVjYgQ29udHJvbCBQcm90b2NvbC4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVG9tbWkgS29tdWxhaW5lbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIDQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgVG9tbWkgS29tdWxhaW5lbgotICogICAgIDxUb21taS5Lb211bGFpbmVuQGlraS5maT4iLgotICoKLSAqIFRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLSAqIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotICogQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKgotICovCi0KLS8qICBPcmlnaW5hbCB2ZXJzaW9uLCBiYXNlZCBvbiBSRkMyMDIzIDoKLQotICAgIENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiwgMTk5NyBGcmFuY2lzLkR1cG9udEBpbnJpYS5mciwgSU5SSUEgUm9jcXVlbmNvdXJ0LAotICAgIEFsYWluLkR1cmFuZEBpbWFnLmZyLCBJTUFHLAotICAgIEplYW4tTHVjLlJpY2hpZXJAaW1hZy5mciwgSU1BRy1MU1IuCi0KLSAgICBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgRnJhbmNpcy5EdXBvbnRAaW5yaWEuZnIsIEdJRSBEWUFERSwKLSAgICBBbGFpbi5EdXJhbmRAaW1hZy5mciwgSU1BRywKLSAgICBKZWFuLUx1Yy5SaWNoaWVyQGltYWcuZnIsIElNQUctTFNSLgotCi0gICAgQ2UgdHJhdmFpbCBhIOl06SBmYWl0IGF1IHNlaW4gZHUgR0lFIERZQURFIChHcm91cGVtZW50IGQnSW506XLqdAotICAgIMljb25vbWlxdWUgYXlhbnQgcG91ciBtZW1icmVzIEJVTEwgUy5BLiBldCBsJ0lOUklBKS4KLQotICAgIENlIGxvZ2ljaWVsIGluZm9ybWF0aXF1ZSBlc3QgZGlzcG9uaWJsZSBhdXggY29uZGl0aW9ucwotICAgIHVzdWVsbGVzIGRhbnMgbGEgcmVjaGVyY2hlLCBjJ2VzdC3gLWRpcmUgcXUnaWwgcGV1dAotICAgIOp0cmUgdXRpbGlz6SwgY29waeksIG1vZGlmaeksIGRpc3RyaWJ16SDgIGwndW5pcXVlCi0gICAgY29uZGl0aW9uIHF1ZSBjZSB0ZXh0ZSBzb2l0IGNvbnNlcnbpIGFmaW4gcXVlCi0gICAgbCdvcmlnaW5lIGRlIGNlIGxvZ2ljaWVsIHNvaXQgcmVjb25udWUuCi0KLSAgICBMZSBub20gZGUgbCdJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlCi0gICAgZXQgZW4gQXV0b21hdGlxdWUgKElOUklBKSwgZGUgbCdJTUFHLCBvdSBkJ3VuZSBwZXJzb25uZSBtb3JhbGUKLSAgICBvdSBwaHlzaXF1ZSBheWFudCBwYXJ0aWNpcOkg4CBsJ+lsYWJvcmF0aW9uIGRlIGNlIGxvZ2ljaWVsIG5lIHBldXQKLSAgICDqdHJlIHV0aWxpc+kgc2FucyBzb24gYWNjb3JkIHBy6WFsYWJsZSBleHBsaWNpdGUuCi0KLSAgICBDZSBsb2dpY2llbCBlc3QgZm91cm5pIHRlbCBxdWVsIHNhbnMgYXVjdW5lIGdhcmFudGllLAotICAgIHN1cHBvcnQgb3UgcmVzcG9uc2FiaWxpdOkgZCdhdWN1bmUgc29ydGUuCi0gICAgQ2UgbG9naWNpZWwgZXN0IGTpcml26SBkZSBzb3VyY2VzIGQnb3JpZ2luZQotICAgICJVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEgYXQgQmVya2VsZXkiIGV0Ci0gICAgIkRpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uIiBjb3V2ZXJ0ZXMgcGFyIGRlcyBjb3B5cmlnaHRzLgotCi0gICAgTCdJbnN0aXR1dCBkJ0luZm9ybWF0aXF1ZSBldCBkZSBNYXRo6W1hdGlxdWVzIEFwcGxpcXXpZXMgZGUgR3Jlbm9ibGUgKElNQUcpCi0gICAgZXN0IHVuZSBm6WTpcmF0aW9uIGQndW5pdOlzIG1peHRlcyBkZSByZWNoZXJjaGUgZHUgQ05SUywgZGUgbCdJbnN0aXR1dCBOYXRpb25hbAotICAgIFBvbHl0ZWNobmlxdWUgZGUgR3Jlbm9ibGUgZXQgZGUgbCdVbml2ZXJzaXTpIEpvc2VwaCBGb3VyaWVyIHJlZ3JvdXBhbnQKLSAgICBzZXB0IGxhYm9yYXRvaXJlcyBkb250IGxlIGxhYm9yYXRvaXJlIExvZ2ljaWVscywgU3lzdOhtZXMsIFLpc2VhdXggKExTUikuCi0KLSAgICBUaGlzIHdvcmsgaGFzIGJlZW4gZG9uZSBpbiB0aGUgY29udGV4dCBvZiBHSUUgRFlBREUgKGpvaW50IFIgJiBEIHZlbnR1cmUKLSAgICBiZXR3ZWVuIEJVTEwgUy5BLiBhbmQgSU5SSUEpLgotCi0gICAgVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgd2l0aCB1c3VhbCAicmVzZWFyY2giIHRlcm1zCi0gICAgd2l0aCB0aGUgYWltIG9mIHJldGFpbiBjcmVkaXRzIG9mIHRoZSBzb2Z0d2FyZS4gCi0gICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAgICBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAgICBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLAotICAgIGFuZCB0aGUgbmFtZSBvZiBJTlJJQSwgSU1BRywgb3IgYW55IGNvbnRyaWJ1dG9yIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nCi0gICAgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhpcyBtYXRlcmlhbCB3aXRob3V0IHRoZSBwcmlvciBleHBsaWNpdAotICAgIHBlcm1pc3Npb24uIFRoZSBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgYW55Ci0gICAgd2FycmFudGllcywgc3VwcG9ydCBvciBsaWFiaWxpdGllcyBvZiBhbnkga2luZC4KLSAgICBUaGlzIHNvZnR3YXJlIGlzIGRlcml2ZWQgZnJvbSBzb3VyY2UgY29kZSBmcm9tCi0gICAgIlVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBhdCBCZXJrZWxleSIgYW5kCi0gICAgIkRpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uIiBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0cy4KLQotICAgIEdyZW5vYmxlJ3MgSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UgYW5kIEFwcGxpZWQgTWF0aGVtYXRpY3MgKElNQUcpCi0gICAgaXMgYSBmZWRlcmF0aW9uIG9mIHNldmVuIHJlc2VhcmNoIHVuaXRzIGZ1bmRlZCBieSB0aGUgQ05SUywgTmF0aW9uYWwKLSAgICBQb2x5dGVjaG5pYyBJbnN0aXR1dGUgb2YgR3Jlbm9ibGUgYW5kIFVuaXZlcnNpdHkgSm9zZXBoIEZvdXJpZXIuCi0gICAgVGhlIHJlc2VhcmNoIHVuaXQgaW4gU29mdHdhcmUsIFN5c3RlbXMsIE5ldHdvcmtzIChMU1IpIGlzIG1lbWJlciBvZiBJTUFHLgotKi8KLQotLyoKLSAqIERlcml2ZWQgZnJvbSA6Ci0gKgotICoKLSAqIGlwY3AuYyAtIFBQUCBJUCBDb250cm9sIFByb3RvY29sLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk4NC0yMDAwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBuYW1lICJDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHBlcm1pc3Npb24gb3IgYW55IGxlZ2FsCi0gKiAgICBkZXRhaWxzLCBwbGVhc2UgY29udGFjdAotICogICAgICBPZmZpY2Ugb2YgVGVjaG5vbG9neSBUcmFuc2ZlcgotICogICAgICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQotICogICAgICA1MDAwIEZvcmJlcyBBdmVudWUKLSAqICAgICAgUGl0dHNidXJnaCwgUEEgIDE1MjEzLTM4OTAKLSAqICAgICAgKDQxMikgMjY4LTQzODcsIGZheDogKDQxMikgMjY4LTczOTUKLSAqICAgICAgdGVjaC10cmFuc2ZlckBhbmRyZXcuY211LmVkdQotICoKLSAqIDQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQ29tcHV0aW5nIFNlcnZpY2VzCi0gKiAgICAgYXQgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkgKGh0dHA6Ly93d3cuY211LmVkdS9jb21wdXRpbmcvKS4iCi0gKgotICogQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi0gKiBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLSAqIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLSAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLSAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICoKLSAqICRJZDogaXB2NmNwLmMsdiAxLjIxIDIwMDUvMDgvMjUgMjM6NTk6MzQgcGF1bHVzIEV4cCAkIAotICovCi0KLSNkZWZpbmUgUkNTSUQJIiRJZDogaXB2NmNwLmMsdiAxLjIxIDIwMDUvMDgvMjUgMjM6NTk6MzQgcGF1bHVzIEV4cCAkIgotCi0vKgotICogVE9ETzogCi0gKgotICogUHJveHkgTmVpZ2hib3VyIERpc2NvdmVyeS4KLSAqCi0gKiBCZXR0ZXIgZGVmaW5lcyBmb3Igc2VsZWN0aW5nIHRoZSBvcmRlcmluZyBvZgotICogICBpbnRlcmZhY2UgdXAgLyBzZXQgYWRkcmVzcy4gKGN1cnJlbnRseSBjaGVja3MgZm9yIF9fbGludXhfXywKLSAqICAgc2luY2UgU1ZSNCAmJiAoU05JIHx8IF9fVVNMQ19fKSBkaWRuJ3Qgd29yayBwcm9wZXJseSkKLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0KLSNpbmNsdWRlICJwcHBkLmgiCi0jaW5jbHVkZSAiZnNtLmgiCi0jaW5jbHVkZSAiaXBjcC5oIgotI2luY2x1ZGUgImlwdjZjcC5oIgotI2luY2x1ZGUgIm1hZ2ljLmgiCi0jaW5jbHVkZSAicGF0aG5hbWVzLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gPSBSQ1NJRDsKLQotLyogZ2xvYmFsIHZhcnMgKi8KLWlwdjZjcF9vcHRpb25zIGlwdjZjcF93YW50b3B0aW9uc1tOVU1fUFBQXTsgICAgIC8qIE9wdGlvbnMgdGhhdCB3ZSB3YW50IHRvIHJlcXVlc3QgKi8KLWlwdjZjcF9vcHRpb25zIGlwdjZjcF9nb3RvcHRpb25zW05VTV9QUFBdOwkvKiBPcHRpb25zIHRoYXQgcGVlciBhY2snZCAqLwotaXB2NmNwX29wdGlvbnMgaXB2NmNwX2FsbG93b3B0aW9uc1tOVU1fUFBQXTsJLyogT3B0aW9ucyB3ZSBhbGxvdyBwZWVyIHRvIHJlcXVlc3QgKi8KLWlwdjZjcF9vcHRpb25zIGlwdjZjcF9oaXNvcHRpb25zW05VTV9QUFBdOwkvKiBPcHRpb25zIHRoYXQgd2UgYWNrJ2QgKi8KLWludCBub19pZmFjZWlkX25lZyA9IDA7Ci0KLS8qIGxvY2FsIHZhcnMgKi8KLXN0YXRpYyBpbnQgaXB2NmNwX2lzX3VwOwotCi0vKiBIb29rIGZvciBhIHBsdWdpbiB0byBrbm93IHdoZW4gSVB2NiBwcm90b2NvbCBoYXMgY29tZSB1cCAqLwotdm9pZCAoKmlwdjZfdXBfaG9vaykgX19QKCh2b2lkKSkgPSBOVUxMOwotCi0vKiBIb29rIGZvciBhIHBsdWdpbiB0byBrbm93IHdoZW4gSVB2NiBwcm90b2NvbCBoYXMgY29tZSBkb3duICovCi12b2lkICgqaXB2Nl9kb3duX2hvb2spIF9fUCgodm9pZCkpID0gTlVMTDsKLQotLyogTm90aWZpZXJzIGZvciB3aGVuIElQQ1B2NiBnb2VzIHVwIGFuZCBkb3duICovCi1zdHJ1Y3Qgbm90aWZpZXIgKmlwdjZfdXBfbm90aWZpZXIgPSBOVUxMOwotc3RydWN0IG5vdGlmaWVyICppcHY2X2Rvd25fbm90aWZpZXIgPSBOVUxMOwotCi0vKgotICogQ2FsbGJhY2tzIGZvciBmc20gY29kZS4gIChDSSA9IENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24pCi0gKi8KLXN0YXRpYyB2b2lkIGlwdjZjcF9yZXNldGNpIF9fUCgoZnNtICopKTsJLyogUmVzZXQgb3VyIENJICovCi1zdGF0aWMgaW50ICBpcHY2Y3BfY2lsZW4gX19QKChmc20gKikpOwkgICAgICAgIC8qIFJldHVybiBsZW5ndGggb2Ygb3VyIENJICovCi1zdGF0aWMgdm9pZCBpcHY2Y3BfYWRkY2kgX19QKChmc20gKiwgdV9jaGFyICosIGludCAqKSk7IC8qIEFkZCBvdXIgQ0kgKi8KLXN0YXRpYyBpbnQgIGlwdjZjcF9hY2tjaSBfX1AoKGZzbSAqLCB1X2NoYXIgKiwgaW50KSk7CS8qIFBlZXIgYWNrJ2Qgb3VyIENJICovCi1zdGF0aWMgaW50ICBpcHY2Y3BfbmFrY2kgX19QKChmc20gKiwgdV9jaGFyICosIGludCwgaW50KSk7LyogUGVlciBuYWsnZCBvdXIgQ0kgKi8KLXN0YXRpYyBpbnQgIGlwdjZjcF9yZWpjaSBfX1AoKGZzbSAqLCB1X2NoYXIgKiwgaW50KSk7CS8qIFBlZXIgcmVqJ2Qgb3VyIENJICovCi1zdGF0aWMgaW50ICBpcHY2Y3BfcmVxY2kgX19QKChmc20gKiwgdV9jaGFyICosIGludCAqLCBpbnQpKTsgLyogUmN2IENJICovCi1zdGF0aWMgdm9pZCBpcHY2Y3BfdXAgX19QKChmc20gKikpOwkJLyogV2UncmUgVVAgKi8KLXN0YXRpYyB2b2lkIGlwdjZjcF9kb3duIF9fUCgoZnNtICopKTsJCS8qIFdlJ3JlIERPV04gKi8KLXN0YXRpYyB2b2lkIGlwdjZjcF9maW5pc2hlZCBfX1AoKGZzbSAqKSk7CS8qIERvbid0IG5lZWQgbG93ZXIgbGF5ZXIgKi8KLQotZnNtIGlwdjZjcF9mc21bTlVNX1BQUF07CQkvKiBJUFY2Q1AgZnNtIHN0cnVjdHVyZSAqLwotCi1zdGF0aWMgZnNtX2NhbGxiYWNrcyBpcHY2Y3BfY2FsbGJhY2tzID0geyAvKiBJUFY2Q1AgY2FsbGJhY2sgcm91dGluZXMgKi8KLSAgICBpcHY2Y3BfcmVzZXRjaSwJCS8qIFJlc2V0IG91ciBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uICovCi0gICAgaXB2NmNwX2NpbGVuLAkJLyogTGVuZ3RoIG9mIG91ciBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uICovCi0gICAgaXB2NmNwX2FkZGNpLAkJLyogQWRkIG91ciBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uICovCi0gICAgaXB2NmNwX2Fja2NpLAkJLyogQUNLIG91ciBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uICovCi0gICAgaXB2NmNwX25ha2NpLAkJLyogTkFLIG91ciBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uICovCi0gICAgaXB2NmNwX3JlamNpLAkJLyogUmVqZWN0IG91ciBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uICovCi0gICAgaXB2NmNwX3JlcWNpLAkJLyogUmVxdWVzdCBwZWVyJ3MgQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbiAqLwotICAgIGlwdjZjcF91cCwJCQkvKiBDYWxsZWQgd2hlbiBmc20gcmVhY2hlcyBPUEVORUQgc3RhdGUgKi8KLSAgICBpcHY2Y3BfZG93biwJCS8qIENhbGxlZCB3aGVuIGZzbSBsZWF2ZXMgT1BFTkVEIHN0YXRlICovCi0gICAgTlVMTCwJCQkvKiBDYWxsZWQgd2hlbiB3ZSB3YW50IHRoZSBsb3dlciBsYXllciB1cCAqLwotICAgIGlwdjZjcF9maW5pc2hlZCwJCS8qIENhbGxlZCB3aGVuIHdlIHdhbnQgdGhlIGxvd2VyIGxheWVyIGRvd24gKi8KLSAgICBOVUxMLAkJCS8qIENhbGxlZCB3aGVuIFByb3RvY29sLVJlamVjdCByZWNlaXZlZCAqLwotICAgIE5VTEwsCQkJLyogUmV0cmFuc21pc3Npb24gaXMgbmVjZXNzYXJ5ICovCi0gICAgTlVMTCwJCQkvKiBDYWxsZWQgdG8gaGFuZGxlIHByb3RvY29sLXNwZWNpZmljIGNvZGVzICovCi0gICAgIklQVjZDUCIJCQkvKiBTdHJpbmcgbmFtZSBvZiBwcm90b2NvbCAqLwotfTsKLQotLyoKLSAqIENvbW1hbmQtbGluZSBvcHRpb25zLgotICovCi1zdGF0aWMgaW50IHNldGlmYWNlaWQgX19QKChjaGFyICoqYXJnKSk7Ci1zdGF0aWMgdm9pZCBwcmludGlmYWNlaWQgX19QKChvcHRpb25fdCAqLAotCQkJICAgICAgdm9pZCAoKikodm9pZCAqLCBjaGFyICosIC4uLiksIHZvaWQgKikpOwotCi1zdGF0aWMgb3B0aW9uX3QgaXB2NmNwX29wdGlvbl9saXN0W10gPSB7Ci0gICAgeyAiaXB2NiIsIG9fc3BlY2lhbCwgKHZvaWQgKilzZXRpZmFjZWlkLAotICAgICAgIlNldCBpbnRlcmZhY2UgaWRlbnRpZmllcnMgZm9yIElQVjYiLAotICAgICAgT1BUX0EyUFJJTlRFUiwgKHZvaWQgKilwcmludGlmYWNlaWQgfSwKLQotICAgIHsgIitpcHY2Iiwgb19ib29sLCAmaXB2NmNwX3Byb3RlbnQuZW5hYmxlZF9mbGFnLAotICAgICAgIkVuYWJsZSBJUHY2IGFuZCBJUHY2Q1AiLCBPUFRfUFJJTyB8IDEgfSwKLSAgICB7ICJub2lwdjYiLCBvX2Jvb2wsICZpcHY2Y3BfcHJvdGVudC5lbmFibGVkX2ZsYWcsCi0gICAgICAiRGlzYWJsZSBJUHY2IGFuZCBJUHY2Q1AiLCBPUFRfUFJJT1NVQiB9LAotICAgIHsgIi1pcHY2Iiwgb19ib29sLCAmaXB2NmNwX3Byb3RlbnQuZW5hYmxlZF9mbGFnLAotICAgICAgIkRpc2FibGUgSVB2NiBhbmQgSVB2NkNQIiwgT1BUX1BSSU9TVUIgfCBPUFRfQUxJQVMgfSwKLQotICAgIHsgImlwdjZjcC1hY2NlcHQtbG9jYWwiLCBvX2Jvb2wsICZpcHY2Y3BfYWxsb3dvcHRpb25zWzBdLmFjY2VwdF9sb2NhbCwKLSAgICAgICJBY2NlcHQgcGVlcidzIGludGVyZmFjZSBpZGVudGlmaWVyIGZvciB1cyIsIDEgfSwKLQotICAgIHsgImlwdjZjcC11c2UtaXBhZGRyIiwgb19ib29sLCAmaXB2NmNwX2FsbG93b3B0aW9uc1swXS51c2VfaXAsCi0gICAgICAiVXNlIChkZWZhdWx0KSBJUHY0IGFkZHJlc3MgYXMgaW50ZXJmYWNlIGlkZW50aWZpZXIiLCAxIH0sCi0KLSAgICB7ICJpcHY2Y3AtdXNlLXBlcnNpc3RlbnQiLCBvX2Jvb2wsICZpcHY2Y3Bfd2FudG9wdGlvbnNbMF0udXNlX3BlcnNpc3RlbnQsCi0gICAgICAiVXNlIHVuaXF1ZWx5LWF2YWlsYWJsZSBwZXJzaXN0ZW50IHZhbHVlIGZvciBsaW5rIGxvY2FsIGFkZHJlc3MiLCAxIH0sCi0KLSAgICB7ICJpcHY2Y3AtcmVzdGFydCIsIG9faW50LCAmaXB2NmNwX2ZzbVswXS50aW1lb3V0dGltZSwKLSAgICAgICJTZXQgdGltZW91dCBmb3IgSVB2NkNQIiwgT1BUX1BSSU8gfSwKLSAgICB7ICJpcHY2Y3AtbWF4LXRlcm1pbmF0ZSIsIG9faW50LCAmaXB2NmNwX2ZzbVswXS5tYXh0ZXJtdHJhbnNtaXRzLAotICAgICAgIlNldCBtYXggI3htaXRzIGZvciB0ZXJtLXJlcXMiLCBPUFRfUFJJTyB9LAotICAgIHsgImlwdjZjcC1tYXgtY29uZmlndXJlIiwgb19pbnQsICZpcHY2Y3BfZnNtWzBdLm1heGNvbmZyZXF0cmFuc21pdHMsCi0gICAgICAiU2V0IG1heCAjeG1pdHMgZm9yIGNvbmYtcmVxcyIsIE9QVF9QUklPIH0sCi0gICAgeyAiaXB2NmNwLW1heC1mYWlsdXJlIiwgb19pbnQsICZpcHY2Y3BfZnNtWzBdLm1heG5ha2xvb3BzLAotICAgICAgIlNldCBtYXggI2NvbmYtbmFrcyBmb3IgSVB2NkNQIiwgT1BUX1BSSU8gfSwKLQotICAgeyBOVUxMIH0KLX07Ci0KLQotLyoKLSAqIFByb3RvY29sIGVudHJ5IHBvaW50cyBmcm9tIG1haW4gY29kZS4KLSAqLwotc3RhdGljIHZvaWQgaXB2NmNwX2luaXQgX19QKChpbnQpKTsKLXN0YXRpYyB2b2lkIGlwdjZjcF9vcGVuIF9fUCgoaW50KSk7Ci1zdGF0aWMgdm9pZCBpcHY2Y3BfY2xvc2UgX19QKChpbnQsIGNoYXIgKikpOwotc3RhdGljIHZvaWQgaXB2NmNwX2xvd2VydXAgX19QKChpbnQpKTsKLXN0YXRpYyB2b2lkIGlwdjZjcF9sb3dlcmRvd24gX19QKChpbnQpKTsKLXN0YXRpYyB2b2lkIGlwdjZjcF9pbnB1dCBfX1AoKGludCwgdV9jaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgaXB2NmNwX3Byb3RyZWogX19QKChpbnQpKTsKLXN0YXRpYyBpbnQgIGlwdjZjcF9wcmludHBrdCBfX1AoKHVfY2hhciAqLCBpbnQsCi0JCQkgICAgICAgdm9pZCAoKikgX19QKCh2b2lkICosIGNoYXIgKiwgLi4uKSksIHZvaWQgKikpOwotc3RhdGljIHZvaWQgaXB2Nl9jaGVja19vcHRpb25zIF9fUCgodm9pZCkpOwotc3RhdGljIGludCAgaXB2Nl9kZW1hbmRfY29uZiBfX1AoKGludCkpOwotc3RhdGljIGludCAgaXB2Nl9hY3RpdmVfcGt0IF9fUCgodV9jaGFyICosIGludCkpOwotCi1zdHJ1Y3QgcHJvdGVudCBpcHY2Y3BfcHJvdGVudCA9IHsKLSAgICBQUFBfSVBWNkNQLAotICAgIGlwdjZjcF9pbml0LAotICAgIGlwdjZjcF9pbnB1dCwKLSAgICBpcHY2Y3BfcHJvdHJlaiwKLSAgICBpcHY2Y3BfbG93ZXJ1cCwKLSAgICBpcHY2Y3BfbG93ZXJkb3duLAotICAgIGlwdjZjcF9vcGVuLAotICAgIGlwdjZjcF9jbG9zZSwKLSAgICBpcHY2Y3BfcHJpbnRwa3QsCi0gICAgTlVMTCwKLSAgICAwLAotICAgICJJUFY2Q1AiLAotICAgICJJUFY2IiwKLSAgICBpcHY2Y3Bfb3B0aW9uX2xpc3QsCi0gICAgaXB2Nl9jaGVja19vcHRpb25zLAotICAgIGlwdjZfZGVtYW5kX2NvbmYsCi0gICAgaXB2Nl9hY3RpdmVfcGt0Ci19OwotCi1zdGF0aWMgdm9pZCBpcHY2Y3BfY2xlYXJfYWRkcnMgX19QKChpbnQsIGV1aTY0X3QsIGV1aTY0X3QpKTsKLXN0YXRpYyB2b2lkIGlwdjZjcF9zY3JpcHQgX19QKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGlwdjZjcF9zY3JpcHRfZG9uZSBfX1AoKHZvaWQgKikpOwotCi0vKgotICogTGVuZ3RocyBvZiBjb25maWd1cmF0aW9uIG9wdGlvbnMuCi0gKi8KLSNkZWZpbmUgQ0lMRU5fVk9JRAkyCi0jZGVmaW5lIENJTEVOX0NPTVBSRVNTCTQJLyogbGVuZ3RoIGZvciBSRkMyMDIzIGNvbXByZXNzIG9wdC4gKi8KLSNkZWZpbmUgQ0lMRU5fSUZBQ0VJRCAgIDEwCS8qIFJGQzI0NzIsIGludGVyZmFjZSBpZGVudGlmaWVyICAgICovCi0KLSNkZWZpbmUgQ09ERU5BTUUoeCkJKCh4KSA9PSBDT05GQUNLID8gIkFDSyIgOiBcCi0JCQkgKHgpID09IENPTkZOQUsgPyAiTkFLIiA6ICJSRUoiKQotCi0vKgotICogVGhpcyBzdGF0ZSB2YXJpYWJsZSBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0Ci0gKiBydW4gYW4gaXBjcC11cC9kb3duIHNjcmlwdCB3aGlsZSBvbmUgaXMgYWxyZWFkeSBydW5uaW5nLgotICovCi1zdGF0aWMgZW51bSBzY3JpcHRfc3RhdGUgewotICAgIHNfZG93biwKLSAgICBzX3VwLAotfSBpcHY2Y3Bfc2NyaXB0X3N0YXRlOwotc3RhdGljIHBpZF90IGlwdjZjcF9zY3JpcHRfcGlkOwotCi0vKgotICogc2V0aWZhY2VpZCAtIHNldCB0aGUgaW50ZXJmYWNlIGlkZW50aWZpZXJzIG1hbnVhbGx5Ci0gKi8KLXN0YXRpYyBpbnQKLXNldGlmYWNlaWQoYXJndikKLSAgICBjaGFyICoqYXJndjsKLXsKLSAgICBjaGFyICpjb21tYSwgKmFyZywgYzsKLSAgICBpcHY2Y3Bfb3B0aW9ucyAqd28gPSAmaXB2NmNwX3dhbnRvcHRpb25zWzBdOwotICAgIHN0cnVjdCBpbjZfYWRkciBhZGRyOwotICAgIHN0YXRpYyBpbnQgcHJpb19sb2NhbCwgcHJpb19yZW1vdGU7Ci0KLSNkZWZpbmUgVkFMSURJRChhKSAoICgoKGEpLnM2X2FkZHIzMlswXSA9PSAwKSAmJiAoKGEpLnM2X2FkZHIzMlsxXSA9PSAwKSkgJiYgXAotCQkJKCgoYSkuczZfYWRkcjMyWzJdICE9IDApIHx8ICgoYSkuczZfYWRkcjMyWzNdICE9IDApKSApCi0gICAgCi0gICAgYXJnID0gKmFyZ3Y7Ci0gICAgaWYgKChjb21tYSA9IHN0cmNocihhcmcsICcsJykpID09IE5VTEwpCi0JY29tbWEgPSBhcmcgKyBzdHJsZW4oYXJnKTsKLSAgICAKLSAgICAvKiAKLSAgICAgKiBJZiBjb21tYSBmaXJzdCBjaGFyYWN0ZXIsIHRoZW4gbm8gbG9jYWwgaWRlbnRpZmllcgotICAgICAqLwotICAgIGlmIChjb21tYSAhPSBhcmcpIHsKLQljID0gKmNvbW1hOwotCSpjb21tYSA9ICdcMCc7Ci0KLQlpZiAoaW5ldF9wdG9uKEFGX0lORVQ2LCBhcmcsICZhZGRyKSA9PSAwIHx8ICFWQUxJRElEKGFkZHIpKSB7Ci0JICAgIG9wdGlvbl9lcnJvcigiSWxsZWdhbCBpbnRlcmZhY2UgaWRlbnRpZmllciAobG9jYWwpOiAlcyIsIGFyZyk7Ci0JICAgIHJldHVybiAwOwotCX0KLQotCWlmIChvcHRpb25fcHJpb3JpdHkgPj0gcHJpb19sb2NhbCkgewotCSAgICBldWk2NF9jb3B5KGFkZHIuczZfYWRkcjMyWzJdLCB3by0+b3VyaWQpOwotCSAgICB3by0+b3B0X2xvY2FsID0gMTsKLQkgICAgcHJpb19sb2NhbCA9IG9wdGlvbl9wcmlvcml0eTsKLQl9Ci0JKmNvbW1hID0gYzsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiBJZiBjb21tYSBsYXN0IGNoYXJhY3RlciwgdGhlIG5vIHJlbW90ZSBpZGVudGlmaWVyCi0gICAgICovCi0gICAgaWYgKCpjb21tYSAhPSAwICYmICorK2NvbW1hICE9ICdcMCcpIHsKLQlpZiAoaW5ldF9wdG9uKEFGX0lORVQ2LCBjb21tYSwgJmFkZHIpID09IDAgfHwgIVZBTElESUQoYWRkcikpIHsKLQkgICAgb3B0aW9uX2Vycm9yKCJJbGxlZ2FsIGludGVyZmFjZSBpZGVudGlmaWVyIChyZW1vdGUpOiAlcyIsIGNvbW1hKTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCWlmIChvcHRpb25fcHJpb3JpdHkgPj0gcHJpb19yZW1vdGUpIHsKLQkgICAgZXVpNjRfY29weShhZGRyLnM2X2FkZHIzMlsyXSwgd28tPmhpc2lkKTsKLQkgICAgd28tPm9wdF9yZW1vdGUgPSAxOwotCSAgICBwcmlvX3JlbW90ZSA9IG9wdGlvbl9wcmlvcml0eTsKLQl9Ci0gICAgfQotCi0gICAgaWYgKG92ZXJyaWRlX3ZhbHVlKCIraXB2NiIsIG9wdGlvbl9wcmlvcml0eSwgb3B0aW9uX3NvdXJjZSkpCi0JaXB2NmNwX3Byb3RlbnQuZW5hYmxlZF9mbGFnID0gMTsKLSAgICByZXR1cm4gMTsKLX0KLQotY2hhciAqbGx2Nl9udG9hKGV1aTY0X3QgaWZhY2VpZCk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludGlmYWNlaWQob3B0LCBwcmludGVyLCBhcmcpCi0gICAgb3B0aW9uX3QgKm9wdDsKLSAgICB2b2lkICgqcHJpbnRlcikgX19QKCh2b2lkICosIGNoYXIgKiwgLi4uKSk7Ci0gICAgdm9pZCAqYXJnOwotewotCWlwdjZjcF9vcHRpb25zICp3byA9ICZpcHY2Y3Bfd2FudG9wdGlvbnNbMF07Ci0KLQlpZiAod28tPm9wdF9sb2NhbCkKLQkJcHJpbnRlcihhcmcsICIlcyIsIGxsdjZfbnRvYSh3by0+b3VyaWQpKTsKLQlwcmludGVyKGFyZywgIiwiKTsKLQlpZiAod28tPm9wdF9yZW1vdGUpCi0JCXByaW50ZXIoYXJnLCAiJXMiLCBsbHY2X250b2Eod28tPmhpc2lkKSk7Ci19Ci0KLS8qCi0gKiBNYWtlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbmV0d29yayBhZGRyZXNzLgotICovCi1jaGFyICoKLWxsdjZfbnRvYShpZmFjZWlkKQotICAgIGV1aTY0X3QgaWZhY2VpZDsKLXsKLSAgICBzdGF0aWMgY2hhciBiWzY0XTsKLQotICAgIHNwcmludGYoYiwgImZlODA6OiVzIiwgZXVpNjRfbnRvYShpZmFjZWlkKSk7Ci0gICAgcmV0dXJuIGI7Ci19Ci0KLQotLyoKLSAqIGlwdjZjcF9pbml0IC0gSW5pdGlhbGl6ZSBJUFY2Q1AuCi0gKi8KLXN0YXRpYyB2b2lkCi1pcHY2Y3BfaW5pdCh1bml0KQotICAgIGludCB1bml0OwotewotICAgIGZzbSAqZiA9ICZpcHY2Y3BfZnNtW3VuaXRdOwotICAgIGlwdjZjcF9vcHRpb25zICp3byA9ICZpcHY2Y3Bfd2FudG9wdGlvbnNbdW5pdF07Ci0gICAgaXB2NmNwX29wdGlvbnMgKmFvID0gJmlwdjZjcF9hbGxvd29wdGlvbnNbdW5pdF07Ci0KLSAgICBmLT51bml0ID0gdW5pdDsKLSAgICBmLT5wcm90b2NvbCA9IFBQUF9JUFY2Q1A7Ci0gICAgZi0+Y2FsbGJhY2tzID0gJmlwdjZjcF9jYWxsYmFja3M7Ci0gICAgZnNtX2luaXQoJmlwdjZjcF9mc21bdW5pdF0pOwotCi0gICAgbWVtc2V0KHdvLCAwLCBzaXplb2YoKndvKSk7Ci0gICAgbWVtc2V0KGFvLCAwLCBzaXplb2YoKmFvKSk7Ci0KLSAgICB3by0+YWNjZXB0X2xvY2FsID0gMTsKLSAgICB3by0+bmVnX2lmYWNlaWQgPSAxOwotICAgIGFvLT5uZWdfaWZhY2VpZCA9IDE7Ci0KLSNpZmRlZiBJUFY2Q1BfQ09NUAotICAgIHdvLT5uZWdfdmogPSAxOwotICAgIGFvLT5uZWdfdmogPSAxOwotICAgIHdvLT52al9wcm90b2NvbCA9IElQVjZDUF9DT01QOwotI2VuZGlmCi0KLX0KLQotCi0vKgotICogaXB2NmNwX29wZW4gLSBJUFY2Q1AgaXMgYWxsb3dlZCB0byBjb21lIHVwLgotICovCi1zdGF0aWMgdm9pZAotaXB2NmNwX29wZW4odW5pdCkKLSAgICBpbnQgdW5pdDsKLXsKLSAgICBmc21fb3BlbigmaXB2NmNwX2ZzbVt1bml0XSk7Ci19Ci0KLQotLyoKLSAqIGlwdjZjcF9jbG9zZSAtIFRha2UgSVBWNkNQIGRvd24uCi0gKi8KLXN0YXRpYyB2b2lkCi1pcHY2Y3BfY2xvc2UodW5pdCwgcmVhc29uKQotICAgIGludCB1bml0OwotICAgIGNoYXIgKnJlYXNvbjsKLXsKLSAgICBmc21fY2xvc2UoJmlwdjZjcF9mc21bdW5pdF0sIHJlYXNvbik7Ci19Ci0KLQotLyoKLSAqIGlwdjZjcF9sb3dlcnVwIC0gVGhlIGxvd2VyIGxheWVyIGlzIHVwLgotICovCi1zdGF0aWMgdm9pZAotaXB2NmNwX2xvd2VydXAodW5pdCkKLSAgICBpbnQgdW5pdDsKLXsKLSAgICBmc21fbG93ZXJ1cCgmaXB2NmNwX2ZzbVt1bml0XSk7Ci19Ci0KLQotLyoKLSAqIGlwdjZjcF9sb3dlcmRvd24gLSBUaGUgbG93ZXIgbGF5ZXIgaXMgZG93bi4KLSAqLwotc3RhdGljIHZvaWQKLWlwdjZjcF9sb3dlcmRvd24odW5pdCkKLSAgICBpbnQgdW5pdDsKLXsKLSAgICBmc21fbG93ZXJkb3duKCZpcHY2Y3BfZnNtW3VuaXRdKTsKLX0KLQotCi0vKgotICogaXB2NmNwX2lucHV0IC0gSW5wdXQgSVBWNkNQIHBhY2tldC4KLSAqLwotc3RhdGljIHZvaWQKLWlwdjZjcF9pbnB1dCh1bml0LCBwLCBsZW4pCi0gICAgaW50IHVuaXQ7Ci0gICAgdV9jaGFyICpwOwotICAgIGludCBsZW47Ci17Ci0gICAgZnNtX2lucHV0KCZpcHY2Y3BfZnNtW3VuaXRdLCBwLCBsZW4pOwotfQotCi0KLS8qCi0gKiBpcHY2Y3BfcHJvdHJlaiAtIEEgUHJvdG9jb2wtUmVqZWN0IHdhcyByZWNlaXZlZCBmb3IgSVBWNkNQLgotICoKLSAqIFByZXRlbmQgdGhlIGxvd2VyIGxheWVyIHdlbnQgZG93biwgc28gd2Ugc2h1dCB1cC4KLSAqLwotc3RhdGljIHZvaWQKLWlwdjZjcF9wcm90cmVqKHVuaXQpCi0gICAgaW50IHVuaXQ7Ci17Ci0gICAgZnNtX2xvd2VyZG93bigmaXB2NmNwX2ZzbVt1bml0XSk7Ci19Ci0KLQotLyoKLSAqIGlwdjZjcF9yZXNldGNpIC0gUmVzZXQgb3VyIENJLgotICovCi1zdGF0aWMgdm9pZAotaXB2NmNwX3Jlc2V0Y2koZikKLSAgICBmc20gKmY7Ci17Ci0gICAgaXB2NmNwX29wdGlvbnMgKndvID0gJmlwdjZjcF93YW50b3B0aW9uc1tmLT51bml0XTsKLSAgICBpcHY2Y3Bfb3B0aW9ucyAqZ28gPSAmaXB2NmNwX2dvdG9wdGlvbnNbZi0+dW5pdF07Ci0KLSAgICB3by0+cmVxX2lmYWNlaWQgPSB3by0+bmVnX2lmYWNlaWQgJiYgaXB2NmNwX2FsbG93b3B0aW9uc1tmLT51bml0XS5uZWdfaWZhY2VpZDsKLSAgICAKLSAgICBpZiAoIXdvLT5vcHRfbG9jYWwpIHsKLQlldWk2NF9tYWdpY19ueih3by0+b3VyaWQpOwotICAgIH0KLSAgICAKLSAgICAqZ28gPSAqd287Ci0gICAgZXVpNjRfemVybyhnby0+aGlzaWQpOwkvKiBsYXN0IHByb3Bvc2VkIGludGVyZmFjZSBpZGVudGlmaWVyICovCi19Ci0KLQotLyoKLSAqIGlwdjZjcF9jaWxlbiAtIFJldHVybiBsZW5ndGggb2Ygb3VyIENJLgotICovCi1zdGF0aWMgaW50Ci1pcHY2Y3BfY2lsZW4oZikKLSAgICBmc20gKmY7Ci17Ci0gICAgaXB2NmNwX29wdGlvbnMgKmdvID0gJmlwdjZjcF9nb3RvcHRpb25zW2YtPnVuaXRdOwotCi0jZGVmaW5lIExFTkNJVkoobmVnKQkJKG5lZyA/IENJTEVOX0NPTVBSRVNTIDogMCkKLSNkZWZpbmUgTEVOQ0lJRkFDRUlEKG5lZykJKG5lZyA/IENJTEVOX0lGQUNFSUQgOiAwKQotCi0gICAgcmV0dXJuIChMRU5DSUlGQUNFSUQoZ28tPm5lZ19pZmFjZWlkKSArCi0JICAgIExFTkNJVkooZ28tPm5lZ192aikpOwotfQotCi0KLS8qCi0gKiBpcHY2Y3BfYWRkY2kgLSBBZGQgb3VyIGRlc2lyZWQgQ0lzIHRvIGEgcGFja2V0LgotICovCi1zdGF0aWMgdm9pZAotaXB2NmNwX2FkZGNpKGYsIHVjcCwgbGVucCkKLSAgICBmc20gKmY7Ci0gICAgdV9jaGFyICp1Y3A7Ci0gICAgaW50ICpsZW5wOwotewotICAgIGlwdjZjcF9vcHRpb25zICpnbyA9ICZpcHY2Y3BfZ290b3B0aW9uc1tmLT51bml0XTsKLSAgICBpbnQgbGVuID0gKmxlbnA7Ci0KLSNkZWZpbmUgQUREQ0lWSihvcHQsIG5lZywgdmFsKSBcCi0gICAgaWYgKG5lZykgeyBcCi0JaW50IHZqbGVuID0gQ0lMRU5fQ09NUFJFU1M7IFwKLQlpZiAobGVuID49IHZqbGVuKSB7IFwKLQkgICAgUFVUQ0hBUihvcHQsIHVjcCk7IFwKLQkgICAgUFVUQ0hBUih2amxlbiwgdWNwKTsgXAotCSAgICBQVVRTSE9SVCh2YWwsIHVjcCk7IFwKLQkgICAgbGVuIC09IHZqbGVuOyBcCi0JfSBlbHNlIFwKLQkgICAgbmVnID0gMDsgXAotICAgIH0KLQotI2RlZmluZSBBRERDSUlGQUNFSUQob3B0LCBuZWcsIHZhbDEpIFwKLSAgICBpZiAobmVnKSB7IFwKLQlpbnQgaWRsZW4gPSBDSUxFTl9JRkFDRUlEOyBcCi0JaWYgKGxlbiA+PSBpZGxlbikgeyBcCi0JICAgIFBVVENIQVIob3B0LCB1Y3ApOyBcCi0JICAgIFBVVENIQVIoaWRsZW4sIHVjcCk7IFwKLQkgICAgZXVpNjRfcHV0KHZhbDEsIHVjcCk7IFwKLQkgICAgbGVuIC09IGlkbGVuOyBcCi0JfSBlbHNlIFwKLQkgICAgbmVnID0gMDsgXAotICAgIH0KLQotICAgIEFERENJSUZBQ0VJRChDSV9JRkFDRUlELCBnby0+bmVnX2lmYWNlaWQsIGdvLT5vdXJpZCk7Ci0KLSAgICBBRERDSVZKKENJX0NPTVBSRVNTVFlQRSwgZ28tPm5lZ192aiwgZ28tPnZqX3Byb3RvY29sKTsKLQotICAgICpsZW5wIC09IGxlbjsKLX0KLQotCi0vKgotICogaXB2NmNwX2Fja2NpIC0gQWNrIG91ciBDSXMuCi0gKgotICogUmV0dXJuczoKLSAqCTAgLSBBY2sgd2FzIGJhZC4KLSAqCTEgLSBBY2sgd2FzIGdvb2QuCi0gKi8KLXN0YXRpYyBpbnQKLWlwdjZjcF9hY2tjaShmLCBwLCBsZW4pCi0gICAgZnNtICpmOwotICAgIHVfY2hhciAqcDsKLSAgICBpbnQgbGVuOwotewotICAgIGlwdjZjcF9vcHRpb25zICpnbyA9ICZpcHY2Y3BfZ290b3B0aW9uc1tmLT51bml0XTsKLSAgICB1X3Nob3J0IGNpbGVuLCBjaXR5cGUsIGNpc2hvcnQ7Ci0gICAgZXVpNjRfdCBpZmFjZWlkOwotCi0gICAgLyoKLSAgICAgKiBDSXMgbXVzdCBiZSBpbiBleGFjdGx5IHRoZSBzYW1lIG9yZGVyIHRoYXQgd2Ugc2VudC4uLgotICAgICAqIENoZWNrIHBhY2tldCBsZW5ndGggYW5kIENJIGxlbmd0aCBhdCBlYWNoIHN0ZXAuCi0gICAgICogSWYgd2UgZmluZCBhbnkgZGV2aWF0aW9ucywgdGhlbiB0aGlzIHBhY2tldCBpcyBiYWQuCi0gICAgICovCi0KLSNkZWZpbmUgQUNLQ0lWSihvcHQsIG5lZywgdmFsKSBcCi0gICAgaWYgKG5lZykgeyBcCi0JaW50IHZqbGVuID0gQ0lMRU5fQ09NUFJFU1M7IFwKLQlpZiAoKGxlbiAtPSB2amxlbikgPCAwKSBcCi0JICAgIGdvdG8gYmFkOyBcCi0JR0VUQ0hBUihjaXR5cGUsIHApOyBcCi0JR0VUQ0hBUihjaWxlbiwgcCk7IFwKLQlpZiAoY2lsZW4gIT0gdmpsZW4gfHwgXAotCSAgICBjaXR5cGUgIT0gb3B0KSAgXAotCSAgICBnb3RvIGJhZDsgXAotCUdFVFNIT1JUKGNpc2hvcnQsIHApOyBcCi0JaWYgKGNpc2hvcnQgIT0gdmFsKSBcCi0JICAgIGdvdG8gYmFkOyBcCi0gICAgfQotCi0jZGVmaW5lIEFDS0NJSUZBQ0VJRChvcHQsIG5lZywgdmFsMSkgXAotICAgIGlmIChuZWcpIHsgXAotCWludCBpZGxlbiA9IENJTEVOX0lGQUNFSUQ7IFwKLQlpZiAoKGxlbiAtPSBpZGxlbikgPCAwKSBcCi0JICAgIGdvdG8gYmFkOyBcCi0JR0VUQ0hBUihjaXR5cGUsIHApOyBcCi0JR0VUQ0hBUihjaWxlbiwgcCk7IFwKLQlpZiAoY2lsZW4gIT0gaWRsZW4gfHwgXAotCSAgICBjaXR5cGUgIT0gb3B0KSBcCi0JICAgIGdvdG8gYmFkOyBcCi0JZXVpNjRfZ2V0KGlmYWNlaWQsIHApOyBcCi0JaWYgKCEgZXVpNjRfZXF1YWxzKHZhbDEsIGlmYWNlaWQpKSBcCi0JICAgIGdvdG8gYmFkOyBcCi0gICAgfQotCi0gICAgQUNLQ0lJRkFDRUlEKENJX0lGQUNFSUQsIGdvLT5uZWdfaWZhY2VpZCwgZ28tPm91cmlkKTsKLQotICAgIEFDS0NJVkooQ0lfQ09NUFJFU1NUWVBFLCBnby0+bmVnX3ZqLCBnby0+dmpfcHJvdG9jb2wpOwotCi0gICAgLyoKLSAgICAgKiBJZiB0aGVyZSBhcmUgYW55IHJlbWFpbmluZyBDSXMsIHRoZW4gdGhpcyBwYWNrZXQgaXMgYmFkLgotICAgICAqLwotICAgIGlmIChsZW4gIT0gMCkKLQlnb3RvIGJhZDsKLSAgICByZXR1cm4gKDEpOwotCi1iYWQ6Ci0gICAgSVBWNkNQREVCVUcoKCJpcHY2Y3BfYWNrY2k6IHJlY2VpdmVkIGJhZCBBY2shIikpOwotICAgIHJldHVybiAoMCk7Ci19Ci0KLS8qCi0gKiBpcHY2Y3BfbmFrY2kgLSBQZWVyIGhhcyBzZW50IGEgTkFLIGZvciBzb21lIG9mIG91ciBDSXMuCi0gKiBUaGlzIHNob3VsZCBub3QgbW9kaWZ5IGFueSBzdGF0ZSBpZiB0aGUgTmFrIGlzIGJhZAotICogb3IgaWYgSVBWNkNQIGlzIGluIHRoZSBPUEVORUQgc3RhdGUuCi0gKgotICogUmV0dXJuczoKLSAqCTAgLSBOYWsgd2FzIGJhZC4KLSAqCTEgLSBOYWsgd2FzIGdvb2QuCi0gKi8KLXN0YXRpYyBpbnQKLWlwdjZjcF9uYWtjaShmLCBwLCBsZW4sIHRyZWF0X2FzX3JlamVjdCkKLSAgICBmc20gKmY7Ci0gICAgdV9jaGFyICpwOwotICAgIGludCBsZW47Ci0gICAgaW50IHRyZWF0X2FzX3JlamVjdDsKLXsKLSAgICBpcHY2Y3Bfb3B0aW9ucyAqZ28gPSAmaXB2NmNwX2dvdG9wdGlvbnNbZi0+dW5pdF07Ci0gICAgdV9jaGFyIGNpdHlwZSwgY2lsZW4sICpuZXh0OwotICAgIHVfc2hvcnQgY2lzaG9ydDsKLSAgICBldWk2NF90IGlmYWNlaWQ7Ci0gICAgaXB2NmNwX29wdGlvbnMgbm87CQkvKiBvcHRpb25zIHdlJ3ZlIHNlZW4gTmFrcyBmb3IgKi8KLSAgICBpcHY2Y3Bfb3B0aW9ucyB0cnk7CQkvKiBvcHRpb25zIHRvIHJlcXVlc3QgbmV4dCB0aW1lICovCi0KLSAgICBCWkVSTygmbm8sIHNpemVvZihubykpOwotICAgIHRyeSA9ICpnbzsKLQotICAgIC8qCi0gICAgICogQW55IE5haydkIENJcyBtdXN0IGJlIGluIGV4YWN0bHkgdGhlIHNhbWUgb3JkZXIgdGhhdCB3ZSBzZW50LgotICAgICAqIENoZWNrIHBhY2tldCBsZW5ndGggYW5kIENJIGxlbmd0aCBhdCBlYWNoIHN0ZXAuCi0gICAgICogSWYgd2UgZmluZCBhbnkgZGV2aWF0aW9ucywgdGhlbiB0aGlzIHBhY2tldCBpcyBiYWQuCi0gICAgICovCi0jZGVmaW5lIE5BS0NJSUZBQ0VJRChvcHQsIG5lZywgY29kZSkgXAotICAgIGlmIChnby0+bmVnICYmIFwKLQlsZW4gPj0gKGNpbGVuID0gQ0lMRU5fSUZBQ0VJRCkgJiYgXAotCXBbMV0gPT0gY2lsZW4gJiYgXAotCXBbMF0gPT0gb3B0KSB7IFwKLQlsZW4gLT0gY2lsZW47IFwKLQlJTkNQVFIoMiwgcCk7IFwKLQlldWk2NF9nZXQoaWZhY2VpZCwgcCk7IFwKLQluby5uZWcgPSAxOyBcCi0JY29kZSBcCi0gICAgfQotCi0jZGVmaW5lIE5BS0NJVkoob3B0LCBuZWcsIGNvZGUpIFwKLSAgICBpZiAoZ28tPm5lZyAmJiBcCi0JKChjaWxlbiA9IHBbMV0pID09IENJTEVOX0NPTVBSRVNTKSAmJiBcCi0JbGVuID49IGNpbGVuICYmIFwKLQlwWzBdID09IG9wdCkgeyBcCi0JbGVuIC09IGNpbGVuOyBcCi0JSU5DUFRSKDIsIHApOyBcCi0JR0VUU0hPUlQoY2lzaG9ydCwgcCk7IFwKLQluby5uZWcgPSAxOyBcCi0gICAgICAgIGNvZGUgXAotICAgIH0KLQotICAgIC8qCi0gICAgICogQWNjZXB0IHRoZSBwZWVyJ3MgaWRlYSBvZiB7b3VyLGhpc30gaW50ZXJmYWNlIGlkZW50aWZpZXIsIGlmIGRpZmZlcmVudAotICAgICAqIGZyb20gb3VyIGlkZWEsIG9ubHkgaWYgdGhlIGFjY2VwdF97bG9jYWwscmVtb3RlfSBmbGFnIGlzIHNldC4KLSAgICAgKi8KLSAgICBOQUtDSUlGQUNFSUQoQ0lfSUZBQ0VJRCwgbmVnX2lmYWNlaWQsCi0JCSBpZiAodHJlYXRfYXNfcmVqZWN0KSB7Ci0JCSAgICAgdHJ5Lm5lZ19pZmFjZWlkID0gMDsKLQkJIH0gZWxzZSBpZiAoZ28tPmFjY2VwdF9sb2NhbCkgewotCQkgICAgIHdoaWxlIChldWk2NF9pc3plcm8oaWZhY2VpZCkgfHwgCi0JCQkgICAgZXVpNjRfZXF1YWxzKGlmYWNlaWQsIGdvLT5oaXNpZCkpIC8qIGJhZCBsdWNrICovCi0JCQkgZXVpNjRfbWFnaWMoaWZhY2VpZCk7Ci0JCSAgICAgdHJ5Lm91cmlkID0gaWZhY2VpZDsKLQkJICAgICBJUFY2Q1BERUJVRygoImxvY2FsIExMIGFkZHJlc3MgJXMiLCBsbHY2X250b2EoaWZhY2VpZCkpKTsKLQkJIH0KLQkJICk7Ci0KLSNpZmRlZiBJUFY2Q1BfQ09NUAotICAgIE5BS0NJVkooQ0lfQ09NUFJFU1NUWVBFLCBuZWdfdmosCi0JICAgIHsKLQkJaWYgKGNpc2hvcnQgPT0gSVBWNkNQX0NPTVAgJiYgIXRyZWF0X2FzX3JlamVjdCkgewotCQkgICAgdHJ5LnZqX3Byb3RvY29sID0gY2lzaG9ydDsKLQkJfSBlbHNlIHsKLQkJICAgIHRyeS5uZWdfdmogPSAwOwotCQl9Ci0JICAgIH0KLQkgICAgKTsKLSNlbHNlCi0gICAgTkFLQ0lWSihDSV9DT01QUkVTU1RZUEUsIG5lZ192aiwKLQkgICAgewotCQl0cnkubmVnX3ZqID0gMDsKLQkgICAgfQotCSAgICApOwotI2VuZGlmCi0KLSAgICAvKgotICAgICAqIFRoZXJlIG1heSBiZSByZW1haW5pbmcgQ0lzLCBpZiB0aGUgcGVlciBpcyByZXF1ZXN0aW5nIG5lZ290aWF0aW9uCi0gICAgICogb24gYW4gb3B0aW9uIHRoYXQgd2UgZGlkbid0IGluY2x1ZGUgaW4gb3VyIHJlcXVlc3QgcGFja2V0LgotICAgICAqIElmIHRoZXkgd2FudCB0byBuZWdvdGlhdGUgYWJvdXQgaW50ZXJmYWNlIGlkZW50aWZpZXIsIHdlIGNvbXBseS4KLSAgICAgKiBJZiB0aGV5IHdhbnQgdXMgdG8gYXNrIGZvciBjb21wcmVzc2lvbiwgd2UgcmVmdXNlLgotICAgICAqLwotICAgIHdoaWxlIChsZW4gPj0gQ0lMRU5fVk9JRCkgewotCUdFVENIQVIoY2l0eXBlLCBwKTsKLQlHRVRDSEFSKGNpbGVuLCBwKTsKLQlpZiAoIGNpbGVuIDwgQ0lMRU5fVk9JRCB8fCAobGVuIC09IGNpbGVuKSA8IDAgKQotCSAgICBnb3RvIGJhZDsKLQluZXh0ID0gcCArIGNpbGVuIC0gMjsKLQotCXN3aXRjaCAoY2l0eXBlKSB7Ci0JY2FzZSBDSV9DT01QUkVTU1RZUEU6Ci0JICAgIGlmIChnby0+bmVnX3ZqIHx8IG5vLm5lZ192aiB8fAotCQkoY2lsZW4gIT0gQ0lMRU5fQ09NUFJFU1MpKQotCQlnb3RvIGJhZDsKLQkgICAgbm8ubmVnX3ZqID0gMTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDSV9JRkFDRUlEOgotCSAgICBpZiAoZ28tPm5lZ19pZmFjZWlkIHx8IG5vLm5lZ19pZmFjZWlkIHx8IGNpbGVuICE9IENJTEVOX0lGQUNFSUQpCi0JCWdvdG8gYmFkOwotCSAgICB0cnkubmVnX2lmYWNlaWQgPSAxOwotCSAgICBldWk2NF9nZXQoaWZhY2VpZCwgcCk7Ci0JICAgIGlmIChnby0+YWNjZXB0X2xvY2FsKSB7Ci0JCXdoaWxlIChldWk2NF9pc3plcm8oaWZhY2VpZCkgfHwgCi0JCSAgICAgICBldWk2NF9lcXVhbHMoaWZhY2VpZCwgZ28tPmhpc2lkKSkgLyogYmFkIGx1Y2sgKi8KLQkJICAgIGV1aTY0X21hZ2ljKGlmYWNlaWQpOwotCQl0cnkub3VyaWQgPSBpZmFjZWlkOwotCSAgICB9Ci0JICAgIG5vLm5lZ19pZmFjZWlkID0gMTsKLQkgICAgYnJlYWs7Ci0JfQotCXAgPSBuZXh0OwotICAgIH0KLQotICAgIC8qIElmIHRoZXJlIGlzIHN0aWxsIGFueXRoaW5nIGxlZnQsIHRoaXMgcGFja2V0IGlzIGJhZC4gKi8KLSAgICBpZiAobGVuICE9IDApCi0JZ290byBiYWQ7Ci0KLSAgICAvKgotICAgICAqIE9LLCB0aGUgTmFrIGlzIGdvb2QuICBOb3cgd2UgY2FuIHVwZGF0ZSBzdGF0ZS4KLSAgICAgKi8KLSAgICBpZiAoZi0+c3RhdGUgIT0gT1BFTkVEKQotCSpnbyA9IHRyeTsKLQotICAgIHJldHVybiAxOwotCi1iYWQ6Ci0gICAgSVBWNkNQREVCVUcoKCJpcHY2Y3BfbmFrY2k6IHJlY2VpdmVkIGJhZCBOYWshIikpOwotICAgIHJldHVybiAwOwotfQotCi0KLS8qCi0gKiBpcHY2Y3BfcmVqY2kgLSBSZWplY3Qgc29tZSBvZiBvdXIgQ0lzLgotICovCi1zdGF0aWMgaW50Ci1pcHY2Y3BfcmVqY2koZiwgcCwgbGVuKQotICAgIGZzbSAqZjsKLSAgICB1X2NoYXIgKnA7Ci0gICAgaW50IGxlbjsKLXsKLSAgICBpcHY2Y3Bfb3B0aW9ucyAqZ28gPSAmaXB2NmNwX2dvdG9wdGlvbnNbZi0+dW5pdF07Ci0gICAgdV9jaGFyIGNpbGVuOwotICAgIHVfc2hvcnQgY2lzaG9ydDsKLSAgICBldWk2NF90IGlmYWNlaWQ7Ci0gICAgaXB2NmNwX29wdGlvbnMgdHJ5OwkJLyogb3B0aW9ucyB0byByZXF1ZXN0IG5leHQgdGltZSAqLwotCi0gICAgdHJ5ID0gKmdvOwotICAgIC8qCi0gICAgICogQW55IFJlamVjdGVkIENJcyBtdXN0IGJlIGluIGV4YWN0bHkgdGhlIHNhbWUgb3JkZXIgdGhhdCB3ZSBzZW50LgotICAgICAqIENoZWNrIHBhY2tldCBsZW5ndGggYW5kIENJIGxlbmd0aCBhdCBlYWNoIHN0ZXAuCi0gICAgICogSWYgd2UgZmluZCBhbnkgZGV2aWF0aW9ucywgdGhlbiB0aGlzIHBhY2tldCBpcyBiYWQuCi0gICAgICovCi0jZGVmaW5lIFJFSkNJSUZBQ0VJRChvcHQsIG5lZywgdmFsMSkgXAotICAgIGlmIChnby0+bmVnICYmIFwKLQlsZW4gPj0gKGNpbGVuID0gQ0lMRU5fSUZBQ0VJRCkgJiYgXAotCXBbMV0gPT0gY2lsZW4gJiYgXAotCXBbMF0gPT0gb3B0KSB7IFwKLQlsZW4gLT0gY2lsZW47IFwKLQlJTkNQVFIoMiwgcCk7IFwKLQlldWk2NF9nZXQoaWZhY2VpZCwgcCk7IFwKLQkvKiBDaGVjayByZWplY3RlZCB2YWx1ZS4gKi8gXAotCWlmICghIGV1aTY0X2VxdWFscyhpZmFjZWlkLCB2YWwxKSkgXAotCSAgICBnb3RvIGJhZDsgXAotCXRyeS5uZWcgPSAwOyBcCi0gICAgfQotCi0jZGVmaW5lIFJFSkNJVkoob3B0LCBuZWcsIHZhbCkgXAotICAgIGlmIChnby0+bmVnICYmIFwKLQlwWzFdID09IENJTEVOX0NPTVBSRVNTICYmIFwKLQlsZW4gPj0gcFsxXSAmJiBcCi0JcFswXSA9PSBvcHQpIHsgXAotCWxlbiAtPSBwWzFdOyBcCi0JSU5DUFRSKDIsIHApOyBcCi0JR0VUU0hPUlQoY2lzaG9ydCwgcCk7IFwKLQkvKiBDaGVjayByZWplY3RlZCB2YWx1ZS4gKi8gIFwKLQlpZiAoY2lzaG9ydCAhPSB2YWwpIFwKLQkgICAgZ290byBiYWQ7IFwKLQl0cnkubmVnID0gMDsgXAotICAgICB9Ci0KLSAgICBSRUpDSUlGQUNFSUQoQ0lfSUZBQ0VJRCwgbmVnX2lmYWNlaWQsIGdvLT5vdXJpZCk7Ci0KLSAgICBSRUpDSVZKKENJX0NPTVBSRVNTVFlQRSwgbmVnX3ZqLCBnby0+dmpfcHJvdG9jb2wpOwotCi0gICAgLyoKLSAgICAgKiBJZiB0aGVyZSBhcmUgYW55IHJlbWFpbmluZyBDSXMsIHRoZW4gdGhpcyBwYWNrZXQgaXMgYmFkLgotICAgICAqLwotICAgIGlmIChsZW4gIT0gMCkKLQlnb3RvIGJhZDsKLSAgICAvKgotICAgICAqIE5vdyB3ZSBjYW4gdXBkYXRlIHN0YXRlLgotICAgICAqLwotICAgIGlmIChmLT5zdGF0ZSAhPSBPUEVORUQpCi0JKmdvID0gdHJ5OwotICAgIHJldHVybiAxOwotCi1iYWQ6Ci0gICAgSVBWNkNQREVCVUcoKCJpcHY2Y3BfcmVqY2k6IHJlY2VpdmVkIGJhZCBSZWplY3QhIikpOwotICAgIHJldHVybiAwOwotfQotCi0KLS8qCi0gKiBpcHY2Y3BfcmVxY2kgLSBDaGVjayB0aGUgcGVlcidzIHJlcXVlc3RlZCBDSXMgYW5kIHNlbmQgYXBwcm9wcmlhdGUgcmVzcG9uc2UuCi0gKgotICogUmV0dXJuczogQ09ORkFDSywgQ09ORk5BSyBvciBDT05GUkVKIGFuZCBpbnB1dCBwYWNrZXQgbW9kaWZpZWQKLSAqIGFwcHJvcHJpYXRlbHkuICBJZiByZWplY3RfaWZfZGlzYWdyZWUgaXMgbm9uLXplcm8sIGRvZXNuJ3QgcmV0dXJuCi0gKiBDT05GTkFLOyByZXR1cm5zIENPTkZSRUogaWYgaXQgY2FuJ3QgcmV0dXJuIENPTkZBQ0suCi0gKi8KLXN0YXRpYyBpbnQKLWlwdjZjcF9yZXFjaShmLCBpbnAsIGxlbiwgcmVqZWN0X2lmX2Rpc2FncmVlKQotICAgIGZzbSAqZjsKLSAgICB1X2NoYXIgKmlucDsJCS8qIFJlcXVlc3RlZCBDSXMgKi8KLSAgICBpbnQgKmxlbjsJCQkvKiBMZW5ndGggb2YgcmVxdWVzdGVkIENJcyAqLwotICAgIGludCByZWplY3RfaWZfZGlzYWdyZWU7Ci17Ci0gICAgaXB2NmNwX29wdGlvbnMgKndvID0gJmlwdjZjcF93YW50b3B0aW9uc1tmLT51bml0XTsKLSAgICBpcHY2Y3Bfb3B0aW9ucyAqaG8gPSAmaXB2NmNwX2hpc29wdGlvbnNbZi0+dW5pdF07Ci0gICAgaXB2NmNwX29wdGlvbnMgKmFvID0gJmlwdjZjcF9hbGxvd29wdGlvbnNbZi0+dW5pdF07Ci0gICAgaXB2NmNwX29wdGlvbnMgKmdvID0gJmlwdjZjcF9nb3RvcHRpb25zW2YtPnVuaXRdOwotICAgIHVfY2hhciAqY2lwLCAqbmV4dDsJCS8qIFBvaW50ZXIgdG8gY3VycmVudCBhbmQgbmV4dCBDSXMgKi8KLSAgICB1X3Nob3J0IGNpbGVuLCBjaXR5cGU7CS8qIFBhcnNlZCBsZW4sIHR5cGUgKi8KLSAgICB1X3Nob3J0IGNpc2hvcnQ7CQkvKiBQYXJzZWQgc2hvcnQgdmFsdWUgKi8KLSAgICBldWk2NF90IGlmYWNlaWQ7CQkvKiBQYXJzZWQgaW50ZXJmYWNlIGlkZW50aWZpZXIgKi8KLSAgICBpbnQgcmMgPSBDT05GQUNLOwkJLyogRmluYWwgcGFja2V0IHJldHVybiBjb2RlICovCi0gICAgaW50IG9yYzsJCQkvKiBJbmRpdmlkdWFsIG9wdGlvbiByZXR1cm4gY29kZSAqLwotICAgIHVfY2hhciAqcDsJCQkvKiBQb2ludGVyIHRvIG5leHQgY2hhciB0byBwYXJzZSAqLwotICAgIHVfY2hhciAqdWNwID0gaW5wOwkJLyogUG9pbnRlciB0byBjdXJyZW50IG91dHB1dCBjaGFyICovCi0gICAgaW50IGwgPSAqbGVuOwkJLyogTGVuZ3RoIGxlZnQgKi8KLQotICAgIC8qCi0gICAgICogUmVzZXQgYWxsIGhpcyBvcHRpb25zLgotICAgICAqLwotICAgIEJaRVJPKGhvLCBzaXplb2YoKmhvKSk7Ci0gICAgCi0gICAgLyoKLSAgICAgKiBQcm9jZXNzIGFsbCBoaXMgb3B0aW9ucy4KLSAgICAgKi8KLSAgICBuZXh0ID0gaW5wOwotICAgIHdoaWxlIChsKSB7Ci0Jb3JjID0gQ09ORkFDSzsJCQkvKiBBc3N1bWUgc3VjY2VzcyAqLwotCWNpcCA9IHAgPSBuZXh0OwkJCS8qIFJlbWVtYmVyIGJlZ2luaW5nIG9mIENJICovCi0JaWYgKGwgPCAyIHx8CQkJLyogTm90IGVub3VnaCBkYXRhIGZvciBDSSBoZWFkZXIgb3IgKi8KLQkgICAgcFsxXSA8IDIgfHwJCQkvKiAgQ0kgbGVuZ3RoIHRvbyBzbWFsbCBvciAqLwotCSAgICBwWzFdID4gbCkgewkJCS8qICBDSSBsZW5ndGggdG9vIGJpZz8gKi8KLQkgICAgSVBWNkNQREVCVUcoKCJpcHY2Y3BfcmVxY2k6IGJhZCBDSSBsZW5ndGghIikpOwotCSAgICBvcmMgPSBDT05GUkVKOwkJLyogUmVqZWN0IGJhZCBDSSAqLwotCSAgICBjaWxlbiA9IGw7CQkJLyogUmVqZWN0IHRpbGwgZW5kIG9mIHBhY2tldCAqLwotCSAgICBsID0gMDsJCQkvKiBEb24ndCBsb29wIGFnYWluICovCi0JICAgIGdvdG8gZW5kc3dpdGNoOwotCX0KLQlHRVRDSEFSKGNpdHlwZSwgcCk7CQkvKiBQYXJzZSBDSSB0eXBlICovCi0JR0VUQ0hBUihjaWxlbiwgcCk7CQkvKiBQYXJzZSBDSSBsZW5ndGggKi8KLQlsIC09IGNpbGVuOwkJCS8qIEFkanVzdCByZW1haW5pbmcgbGVuZ3RoICovCi0JbmV4dCArPSBjaWxlbjsJCQkvKiBTdGVwIHRvIG5leHQgQ0kgKi8KLQotCXN3aXRjaCAoY2l0eXBlKSB7CQkvKiBDaGVjayBDSSB0eXBlICovCi0JY2FzZSBDSV9JRkFDRUlEOgotCSAgICBJUFY2Q1BERUJVRygoImlwdjZjcDogcmVjZWl2ZWQgaW50ZXJmYWNlIGlkZW50aWZpZXIgIikpOwotCi0JICAgIGlmICghYW8tPm5lZ19pZmFjZWlkIHx8Ci0JCWNpbGVuICE9IENJTEVOX0lGQUNFSUQpIHsJLyogQ2hlY2sgQ0kgbGVuZ3RoICovCi0JCW9yYyA9IENPTkZSRUo7CQkvKiBSZWplY3QgQ0kgKi8KLQkJYnJlYWs7Ci0JICAgIH0KLQotCSAgICAvKgotCSAgICAgKiBJZiBoZSBoYXMgbm8gaW50ZXJmYWNlIGlkZW50aWZpZXIsIG9yIGlmIHdlIGJvdGggaGF2ZSBzYW1lIAotCSAgICAgKiBpZGVudGlmaWVyIHRoZW4gTkFLIGl0IHdpdGggbmV3IGlkZWEuCi0JICAgICAqIEluIHBhcnRpY3VsYXIsIGlmIHdlIGRvbid0IGtub3cgaGlzIGlkZW50aWZpZXIsIGJ1dCBoZSBkb2VzLAotCSAgICAgKiB0aGVuIGFjY2VwdCBpdC4KLQkgICAgICovCi0JICAgIGV1aTY0X2dldChpZmFjZWlkLCBwKTsKLQkgICAgSVBWNkNQREVCVUcoKCIoJXMpIiwgbGx2Nl9udG9hKGlmYWNlaWQpKSk7Ci0JICAgIGlmIChldWk2NF9pc3plcm8oaWZhY2VpZCkgJiYgZXVpNjRfaXN6ZXJvKGdvLT5vdXJpZCkpIHsKLQkJb3JjID0gQ09ORlJFSjsJCS8qIFJlamVjdCBDSSAqLwotCQlicmVhazsKLQkgICAgfQotCSAgICBpZiAoIWV1aTY0X2lzemVybyh3by0+aGlzaWQpICYmIAotCQkhZXVpNjRfZXF1YWxzKGlmYWNlaWQsIHdvLT5oaXNpZCkgJiYgCi0JCWV1aTY0X2lzemVybyhnby0+aGlzaWQpKSB7Ci0JCSAgICAKLQkJb3JjID0gQ09ORk5BSzsKLQkJaWZhY2VpZCA9IHdvLT5oaXNpZDsKLQkJZ28tPmhpc2lkID0gaWZhY2VpZDsKLQkJREVDUFRSKHNpemVvZihpZmFjZWlkKSwgcCk7Ci0JCWV1aTY0X3B1dChpZmFjZWlkLCBwKTsKLQkgICAgfSBlbHNlCi0JICAgIGlmIChldWk2NF9pc3plcm8oaWZhY2VpZCkgfHwgZXVpNjRfZXF1YWxzKGlmYWNlaWQsIGdvLT5vdXJpZCkpIHsKLQkJb3JjID0gQ09ORk5BSzsKLQkJaWYgKGV1aTY0X2lzemVybyhnby0+aGlzaWQpKQkvKiBmaXJzdCB0aW1lLCB0cnkgb3B0aW9uICovCi0JCSAgICBpZmFjZWlkID0gd28tPmhpc2lkOwotCQl3aGlsZSAoZXVpNjRfaXN6ZXJvKGlmYWNlaWQpIHx8IAotCQkgICAgICAgZXVpNjRfZXF1YWxzKGlmYWNlaWQsIGdvLT5vdXJpZCkpIC8qIGJhZCBsdWNrICovCi0JCSAgICBldWk2NF9tYWdpYyhpZmFjZWlkKTsKLQkJZ28tPmhpc2lkID0gaWZhY2VpZDsKLQkJREVDUFRSKHNpemVvZihpZmFjZWlkKSwgcCk7Ci0JCWV1aTY0X3B1dChpZmFjZWlkLCBwKTsKLQkgICAgfQotCi0JICAgIGhvLT5uZWdfaWZhY2VpZCA9IDE7Ci0JICAgIGhvLT5oaXNpZCA9IGlmYWNlaWQ7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBDSV9DT01QUkVTU1RZUEU6Ci0JICAgIElQVjZDUERFQlVHKCgiaXB2NmNwOiByZWNlaXZlZCBDT01QUkVTU1RZUEUgIikpOwotCSAgICBpZiAoIWFvLT5uZWdfdmogfHwKLQkJKGNpbGVuICE9IENJTEVOX0NPTVBSRVNTKSkgewotCQlvcmMgPSBDT05GUkVKOwotCQlicmVhazsKLQkgICAgfQotCSAgICBHRVRTSE9SVChjaXNob3J0LCBwKTsKLQkgICAgSVBWNkNQREVCVUcoKCIoJWQpIiwgY2lzaG9ydCkpOwotCi0jaWZkZWYgSVBWNkNQX0NPTVAKLQkgICAgaWYgKCEoY2lzaG9ydCA9PSBJUFY2Q1BfQ09NUCkpIHsKLQkJb3JjID0gQ09ORlJFSjsKLQkJYnJlYWs7Ci0JICAgIH0KLQotCSAgICBoby0+bmVnX3ZqID0gMTsKLQkgICAgaG8tPnZqX3Byb3RvY29sID0gY2lzaG9ydDsKLQkgICAgYnJlYWs7Ci0jZWxzZQotCSAgICBvcmMgPSBDT05GUkVKOwotCSAgICBicmVhazsKLSNlbmRpZgotCi0JZGVmYXVsdDoKLQkgICAgb3JjID0gQ09ORlJFSjsKLQkgICAgYnJlYWs7Ci0JfQotCi1lbmRzd2l0Y2g6Ci0JSVBWNkNQREVCVUcoKCIgKCVzKVxuIiwgQ09ERU5BTUUob3JjKSkpOwotCi0JaWYgKG9yYyA9PSBDT05GQUNLICYmCQkvKiBHb29kIENJICovCi0JICAgIHJjICE9IENPTkZBQ0spCQkvKiAgYnV0IHByaW9yIENJIHdhc250PyAqLwotCSAgICBjb250aW51ZTsJCQkvKiBEb24ndCBzZW5kIHRoaXMgb25lICovCi0KLQlpZiAob3JjID09IENPTkZOQUspIHsJCS8qIE5hayB0aGlzIENJPyAqLwotCSAgICBpZiAocmVqZWN0X2lmX2Rpc2FncmVlKQkvKiBHZXR0aW5nIGZlZCB1cCB3aXRoIHNlbmRpbmcgTkFLcz8gKi8KLQkJb3JjID0gQ09ORlJFSjsJCS8qIEdldCB0b3VnaCBpZiBzbyAqLwotCSAgICBlbHNlIHsKLQkJaWYgKHJjID09IENPTkZSRUopCS8qIFJlamVjdGluZyBwcmlvciBDST8gKi8KLQkJICAgIGNvbnRpbnVlOwkJLyogRG9uJ3Qgc2VuZCB0aGlzIG9uZSAqLwotCQlpZiAocmMgPT0gQ09ORkFDSykgewkvKiBBY2snZCBhbGwgcHJpb3IgQ0lzPyAqLwotCQkgICAgcmMgPSBDT05GTkFLOwkvKiBOb3QgYW55bW9yZS4uLiAqLwotCQkgICAgdWNwID0gaW5wOwkJLyogQmFja3VwICovCi0JCX0KLQkgICAgfQotCX0KLQotCWlmIChvcmMgPT0gQ09ORlJFSiAmJgkJLyogUmVqZWN0IHRoaXMgQ0kgKi8KLQkgICAgcmMgIT0gQ09ORlJFSikgewkJLyogIGJ1dCBubyBwcmlvciBvbmVzPyAqLwotCSAgICByYyA9IENPTkZSRUo7Ci0JICAgIHVjcCA9IGlucDsJCQkvKiBCYWNrdXAgKi8KLQl9Ci0KLQkvKiBOZWVkIHRvIG1vdmUgQ0k/ICovCi0JaWYgKHVjcCAhPSBjaXApCi0JICAgIEJDT1BZKGNpcCwgdWNwLCBjaWxlbik7CS8qIE1vdmUgaXQgKi8KLQotCS8qIFVwZGF0ZSBvdXRwdXQgcG9pbnRlciAqLwotCUlOQ1BUUihjaWxlbiwgdWNwKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIElmIHdlIGFyZW4ndCByZWplY3RpbmcgdGhpcyBwYWNrZXQsIGFuZCB3ZSB3YW50IHRvIG5lZ290aWF0ZQotICAgICAqIHRoZWlyIGlkZW50aWZpZXIgYW5kIHRoZXkgZGlkbid0IHNlbmQgdGhlaXIgaWRlbnRpZmllciwgdGhlbiB3ZQotICAgICAqIHNlbmQgYSBOQUsgd2l0aCBhIENJX0lGQUNFSUQgb3B0aW9uIGFwcGVuZGVkLiAgV2UgYXNzdW1lIHRoZQotICAgICAqIGlucHV0IGJ1ZmZlciBpcyBsb25nIGVub3VnaCB0aGF0IHdlIGNhbiBhcHBlbmQgdGhlIGV4dHJhCi0gICAgICogb3B0aW9uIHNhZmVseS4KLSAgICAgKi8KLSAgICBpZiAocmMgIT0gQ09ORlJFSiAmJiAhaG8tPm5lZ19pZmFjZWlkICYmCi0Jd28tPnJlcV9pZmFjZWlkICYmICFyZWplY3RfaWZfZGlzYWdyZWUpIHsKLQlpZiAocmMgPT0gQ09ORkFDSykgewotCSAgICByYyA9IENPTkZOQUs7Ci0JICAgIHVjcCA9IGlucDsJCQkJLyogcmVzZXQgcG9pbnRlciAqLwotCSAgICB3by0+cmVxX2lmYWNlaWQgPSAwOwkJLyogZG9uJ3QgYXNrIGFnYWluICovCi0JfQotCVBVVENIQVIoQ0lfSUZBQ0VJRCwgdWNwKTsKLQlQVVRDSEFSKENJTEVOX0lGQUNFSUQsIHVjcCk7Ci0JZXVpNjRfcHV0KHdvLT5oaXNpZCwgdWNwKTsKLSAgICB9Ci0KLSAgICAqbGVuID0gdWNwIC0gaW5wOwkJCS8qIENvbXB1dGUgb3V0cHV0IGxlbmd0aCAqLwotICAgIElQVjZDUERFQlVHKCgiaXB2NmNwOiByZXR1cm5pbmcgQ29uZmlndXJlLSVzIiwgQ09ERU5BTUUocmMpKSk7Ci0gICAgcmV0dXJuIChyYyk7CQkJLyogUmV0dXJuIGZpbmFsIGNvZGUgKi8KLX0KLQotCi0vKgotICogaXB2Nl9jaGVja19vcHRpb25zIC0gY2hlY2sgdGhhdCBhbnkgSVAtcmVsYXRlZCBvcHRpb25zIGFyZSBPSywKLSAqIGFuZCBhc3NpZ24gYXBwcm9wcmlhdGUgZGVmYXVsdHMuCi0gKi8KLXN0YXRpYyB2b2lkCi1pcHY2X2NoZWNrX29wdGlvbnMoKQotewotICAgIGlwdjZjcF9vcHRpb25zICp3byA9ICZpcHY2Y3Bfd2FudG9wdGlvbnNbMF07Ci0KLSAgICBpZiAoIWlwdjZjcF9wcm90ZW50LmVuYWJsZWRfZmxhZykKLQlyZXR1cm47Ci0KLSAgICAvKgotICAgICAqIFBlcnNpc3RlbnQgbGluay1sb2NhbCBpZCBpcyBvbmx5IHVzZWQgd2hlbiB1c2VyIGhhcyBub3QgZXhwbGljaXRseQotICAgICAqIGNvbmZpZ3VyZS9oYXJkLWNvZGUgdGhlIGlkCi0gICAgICovCi0gICAgaWYgKCh3by0+dXNlX3BlcnNpc3RlbnQpICYmICghd28tPm9wdF9sb2NhbCkgJiYgKCF3by0+b3B0X3JlbW90ZSkpIHsKLQotCS8qIAotCSAqIE9uIHN5c3RlbXMgd2hlcmUgdGhlcmUgYXJlIG5vIEV0aGVybmV0IGludGVyZmFjZXMgdXNlZCwgdGhlcmUKLQkgKiBtYXkgYmUgb3RoZXIgd2F5cyB0byBvYnRhaW4gYSBwZXJzaXN0ZW50IGlkLiBSaWdodCBub3csIGl0Ci0JICogd2lsbCBmYWxsIGJhY2sgdG8gdXNpbmcgbWFnaWMgW3NlZSBldWk2NF9tYWdpY10gYmVsb3cgd2hlbgotCSAqIGFuIEVVSS00OCBmcm9tIE1BQyBhZGRyZXNzIGNhbid0IGJlIG9idGFpbmVkLiBPdGhlciBwb3NzaWJpbGl0aWVzCi0JICogaW5jbHVkZSBvYnRhaW5pbmcgRUVQUk9NIHNlcmlhbCBudW1iZXJzLCBvciBzb21lIG90aGVyIHVuaXF1ZQotCSAqIHlldCBwZXJzaXN0ZW50IG51bWJlci4gT24gU3BhcmMgcGxhdGZvcm1zLCB0aGlzIGlzIHBvc3NpYmxlLAotCSAqIGJ1dCB0b28gYmFkIHRoZXJlJ3Mgbm8gc3RhbmRhcmRzIHlldCBmb3IgeDg2IG1hY2hpbmVzLgotCSAqLwotCWlmIChldGhlcl90b19ldWk2NCgmd28tPm91cmlkKSkgewotCSAgICB3by0+b3B0X2xvY2FsID0gMTsKLQl9Ci0gICAgfQotCi0gICAgaWYgKCF3by0+b3B0X2xvY2FsKSB7CS8qIGluaXQgaW50ZXJmYWNlIGlkZW50aWZpZXIgKi8KLQlpZiAod28tPnVzZV9pcCAmJiBldWk2NF9pc3plcm8od28tPm91cmlkKSkgewotCSAgICBldWk2NF9zZXRsbzMyKHdvLT5vdXJpZCwgbnRvaGwoaXBjcF93YW50b3B0aW9uc1swXS5vdXJhZGRyKSk7Ci0JICAgIGlmICghZXVpNjRfaXN6ZXJvKHdvLT5vdXJpZCkpCi0JCXdvLT5vcHRfbG9jYWwgPSAxOwotCX0KLQkKLQl3aGlsZSAoZXVpNjRfaXN6ZXJvKHdvLT5vdXJpZCkpCi0JICAgIGV1aTY0X21hZ2ljKHdvLT5vdXJpZCk7Ci0gICAgfQotCi0gICAgaWYgKCF3by0+b3B0X3JlbW90ZSkgewotCWlmICh3by0+dXNlX2lwICYmIGV1aTY0X2lzemVybyh3by0+aGlzaWQpKSB7Ci0JICAgIGV1aTY0X3NldGxvMzIod28tPmhpc2lkLCBudG9obChpcGNwX3dhbnRvcHRpb25zWzBdLmhpc2FkZHIpKTsKLQkgICAgaWYgKCFldWk2NF9pc3plcm8od28tPmhpc2lkKSkKLQkJd28tPm9wdF9yZW1vdGUgPSAxOwotCX0KLSAgICB9Ci0KLSAgICBpZiAoZGVtYW5kICYmIChldWk2NF9pc3plcm8od28tPm91cmlkKSB8fCBldWk2NF9pc3plcm8od28tPmhpc2lkKSkpIHsKLQlvcHRpb25fZXJyb3IoImxvY2FsL3JlbW90ZSBMTCBhZGRyZXNzIHJlcXVpcmVkIGZvciBkZW1hbmQtZGlhbGxpbmdcbiIpOwotCWV4aXQoRVhJVF9PUFRJT05fRVJST1IpOwotICAgIH0KLX0KLQotCi0vKgotICogaXB2Nl9kZW1hbmRfY29uZiAtIGNvbmZpZ3VyZSB0aGUgaW50ZXJmYWNlIGFzIHRob3VnaAotICogSVBWNkNQIHdlcmUgdXAsIGZvciB1c2Ugd2l0aCBkaWFsLW9uLWRlbWFuZC4KLSAqLwotc3RhdGljIGludAotaXB2Nl9kZW1hbmRfY29uZih1KQotICAgIGludCB1OwotewotICAgIGlwdjZjcF9vcHRpb25zICp3byA9ICZpcHY2Y3Bfd2FudG9wdGlvbnNbdV07Ci0KLSAgICBpZiAoIXNpZjZ1cCh1KSkKLQlyZXR1cm4gMDsKLSAgICBpZiAoIXNpZjZhZGRyKHUsIHdvLT5vdXJpZCwgd28tPmhpc2lkKSkKLQlyZXR1cm4gMDsKLSNpZiAhZGVmaW5lZChfX2xpbnV4X18pICYmICEoZGVmaW5lZChTVlI0KSAmJiAoZGVmaW5lZChTTkkpIHx8IGRlZmluZWQoX19VU0xDX18pKSkKLSAgICBpZiAoIXNpZnVwKHUpKQotCXJldHVybiAwOwotI2VuZGlmCi0gICAgaWYgKCFzaWZucG1vZGUodSwgUFBQX0lQVjYsIE5QTU9ERV9RVUVVRSkpCi0JcmV0dXJuIDA7Ci0KLSAgICBub3RpY2UoImlwdjZfZGVtYW5kX2NvbmYiKTsKLSAgICBub3RpY2UoImxvY2FsICBMTCBhZGRyZXNzICVzIiwgbGx2Nl9udG9hKHdvLT5vdXJpZCkpOwotICAgIG5vdGljZSgicmVtb3RlIExMIGFkZHJlc3MgJXMiLCBsbHY2X250b2Eod28tPmhpc2lkKSk7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotCi0vKgotICogaXB2NmNwX3VwIC0gSVBWNkNQIGhhcyBjb21lIFVQLgotICoKLSAqIENvbmZpZ3VyZSB0aGUgSVB2NiBuZXR3b3JrIGludGVyZmFjZSBhcHByb3ByaWF0ZWx5IGFuZCBicmluZyBpdCB1cC4KLSAqLwotc3RhdGljIHZvaWQKLWlwdjZjcF91cChmKQotICAgIGZzbSAqZjsKLXsKLSAgICBpcHY2Y3Bfb3B0aW9ucyAqaG8gPSAmaXB2NmNwX2hpc29wdGlvbnNbZi0+dW5pdF07Ci0gICAgaXB2NmNwX29wdGlvbnMgKmdvID0gJmlwdjZjcF9nb3RvcHRpb25zW2YtPnVuaXRdOwotICAgIGlwdjZjcF9vcHRpb25zICp3byA9ICZpcHY2Y3Bfd2FudG9wdGlvbnNbZi0+dW5pdF07Ci0KLSAgICBJUFY2Q1BERUJVRygoImlwdjZjcDogdXAiKSk7Ci0KLSAgICAvKgotICAgICAqIFdlIG11c3QgaGF2ZSBhIG5vbi16ZXJvIExMIGFkZHJlc3MgZm9yIGJvdGggZW5kcyBvZiB0aGUgbGluay4KLSAgICAgKi8KLSAgICBpZiAoIWhvLT5uZWdfaWZhY2VpZCkKLQloby0+aGlzaWQgPSB3by0+aGlzaWQ7Ci0KLSAgICBpZighbm9faWZhY2VpZF9uZWcpIHsKLQlpZiAoZXVpNjRfaXN6ZXJvKGhvLT5oaXNpZCkpIHsKLQkgICAgZXJyb3IoIkNvdWxkIG5vdCBkZXRlcm1pbmUgcmVtb3RlIExMIGFkZHJlc3MiKTsKLQkgICAgaXB2NmNwX2Nsb3NlKGYtPnVuaXQsICJDb3VsZCBub3QgZGV0ZXJtaW5lIHJlbW90ZSBMTCBhZGRyZXNzIik7Ci0JICAgIHJldHVybjsKLQl9Ci0JaWYgKGV1aTY0X2lzemVybyhnby0+b3VyaWQpKSB7Ci0JICAgIGVycm9yKCJDb3VsZCBub3QgZGV0ZXJtaW5lIGxvY2FsIExMIGFkZHJlc3MiKTsKLQkgICAgaXB2NmNwX2Nsb3NlKGYtPnVuaXQsICJDb3VsZCBub3QgZGV0ZXJtaW5lIGxvY2FsIExMIGFkZHJlc3MiKTsKLQkgICAgcmV0dXJuOwotCX0KLQlpZiAoZXVpNjRfZXF1YWxzKGdvLT5vdXJpZCwgaG8tPmhpc2lkKSkgewotCSAgICBlcnJvcigibG9jYWwgYW5kIHJlbW90ZSBMTCBhZGRyZXNzZXMgYXJlIGVxdWFsIik7Ci0JICAgIGlwdjZjcF9jbG9zZShmLT51bml0LCAibG9jYWwgYW5kIHJlbW90ZSBMTCBhZGRyZXNzZXMgYXJlIGVxdWFsIik7Ci0JICAgIHJldHVybjsKLQl9Ci0gICAgfQotICAgIHNjcmlwdF9zZXRlbnYoIkxMTE9DQUwiLCBsbHY2X250b2EoZ28tPm91cmlkKSwgMCk7Ci0gICAgc2NyaXB0X3NldGVudigiTExSRU1PVEUiLCBsbHY2X250b2EoaG8tPmhpc2lkKSwgMCk7Ci0KLSNpZmRlZiBJUFY2Q1BfQ09NUAotICAgIC8qIHNldCB0Y3AgY29tcHJlc3Npb24gKi8KLSAgICBzaWY2Y29tcChmLT51bml0LCBoby0+bmVnX3ZqKTsKLSNlbmRpZgotCi0gICAgLyoKLSAgICAgKiBJZiB3ZSBhcmUgZG9pbmcgZGlhbC1vbi1kZW1hbmQsIHRoZSBpbnRlcmZhY2UgaXMgYWxyZWFkeQotICAgICAqIGNvbmZpZ3VyZWQsIHNvIHdlIHB1dCBvdXQgYW55IHNhdmVkLXVwIHBhY2tldHMsIHRoZW4gc2V0IHRoZQotICAgICAqIGludGVyZmFjZSB0byBwYXNzIElQdjYgcGFja2V0cy4KLSAgICAgKi8KLSAgICBpZiAoZGVtYW5kKSB7Ci0JaWYgKCEgZXVpNjRfZXF1YWxzKGdvLT5vdXJpZCwgd28tPm91cmlkKSB8fCAKLQkgICAgISBldWk2NF9lcXVhbHMoaG8tPmhpc2lkLCB3by0+aGlzaWQpKSB7Ci0JICAgIGlmICghIGV1aTY0X2VxdWFscyhnby0+b3VyaWQsIHdvLT5vdXJpZCkpCi0JCXdhcm4oIkxvY2FsIExMIGFkZHJlc3MgY2hhbmdlZCB0byAlcyIsIAotCQkgICAgIGxsdjZfbnRvYShnby0+b3VyaWQpKTsKLQkgICAgaWYgKCEgZXVpNjRfZXF1YWxzKGhvLT5oaXNpZCwgd28tPmhpc2lkKSkKLQkJd2FybigiUmVtb3RlIExMIGFkZHJlc3MgY2hhbmdlZCB0byAlcyIsIAotCQkgICAgIGxsdjZfbnRvYShoby0+aGlzaWQpKTsKLQkgICAgaXB2NmNwX2NsZWFyX2FkZHJzKGYtPnVuaXQsIGdvLT5vdXJpZCwgaG8tPmhpc2lkKTsKLQotCSAgICAvKiBTZXQgdGhlIGludGVyZmFjZSB0byB0aGUgbmV3IGFkZHJlc3NlcyAqLwotCSAgICBpZiAoIXNpZjZhZGRyKGYtPnVuaXQsIGdvLT5vdXJpZCwgaG8tPmhpc2lkKSkgewotCQlpZiAoZGVidWcpCi0JCSAgICB3YXJuKCJzaWY2YWRkciBmYWlsZWQiKTsKLQkJaXB2NmNwX2Nsb3NlKGYtPnVuaXQsICJJbnRlcmZhY2UgY29uZmlndXJhdGlvbiBmYWlsZWQiKTsKLQkJcmV0dXJuOwotCSAgICB9Ci0KLQl9Ci0JZGVtYW5kX3JleG1pdChQUFBfSVBWNik7Ci0Jc2lmbnBtb2RlKGYtPnVuaXQsIFBQUF9JUFY2LCBOUE1PREVfUEFTUyk7Ci0KLSAgICB9IGVsc2UgewotCS8qIGJyaW5nIHRoZSBpbnRlcmZhY2UgdXAgZm9yIElQdjYgKi8KLQlpZiAoIXNpZjZ1cChmLT51bml0KSkgewotCSAgICBpZiAoZGVidWcpCi0JCXdhcm4oInNpZjZ1cCBmYWlsZWQgKElQVjYpIik7Ci0JICAgIGlwdjZjcF9jbG9zZShmLT51bml0LCAiSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gZmFpbGVkIik7Ci0JICAgIHJldHVybjsKLQl9Ci0KLQlpZiAoIXNpZjZhZGRyKGYtPnVuaXQsIGdvLT5vdXJpZCwgaG8tPmhpc2lkKSkgewotCSAgICBpZiAoZGVidWcpCi0JCXdhcm4oInNpZjZhZGRyIGZhaWxlZCIpOwotCSAgICBpcHY2Y3BfY2xvc2UoZi0+dW5pdCwgIkludGVyZmFjZSBjb25maWd1cmF0aW9uIGZhaWxlZCIpOwotCSAgICByZXR1cm47Ci0JfQotCXNpZm5wbW9kZShmLT51bml0LCBQUFBfSVBWNiwgTlBNT0RFX1BBU1MpOwotCi0Jbm90aWNlKCJsb2NhbCAgTEwgYWRkcmVzcyAlcyIsIGxsdjZfbnRvYShnby0+b3VyaWQpKTsKLQlub3RpY2UoInJlbW90ZSBMTCBhZGRyZXNzICVzIiwgbGx2Nl9udG9hKGhvLT5oaXNpZCkpOwotICAgIH0KLQotICAgIG5wX3VwKGYtPnVuaXQsIFBQUF9JUFY2KTsKLSAgICBpcHY2Y3BfaXNfdXAgPSAxOwotCi0gICAgbm90aWZ5KGlwdjZfdXBfbm90aWZpZXIsIDApOwotICAgIGlmIChpcHY2X3VwX2hvb2spCi0gICAgICAgaXB2Nl91cF9ob29rKCk7Ci0KLSAgICAvKgotICAgICAqIEV4ZWN1dGUgdGhlIGlwdjYtdXAgc2NyaXB0LCBsaWtlIHRoaXM6Ci0gICAgICoJL2V0Yy9wcHAvaXB2Ni11cCBpbnRlcmZhY2UgdHR5IHNwZWVkIGxvY2FsLUxMIHJlbW90ZS1MTAotICAgICAqLwotICAgIGlmIChpcHY2Y3Bfc2NyaXB0X3N0YXRlID09IHNfZG93biAmJiBpcHY2Y3Bfc2NyaXB0X3BpZCA9PSAwKSB7Ci0JaXB2NmNwX3NjcmlwdF9zdGF0ZSA9IHNfdXA7Ci0JaXB2NmNwX3NjcmlwdChfUEFUSF9JUFY2VVApOwotICAgIH0KLX0KLQotCi0vKgotICogaXB2NmNwX2Rvd24gLSBJUFY2Q1AgaGFzIGdvbmUgRE9XTi4KLSAqCi0gKiBUYWtlIHRoZSBJUHY2IG5ldHdvcmsgaW50ZXJmYWNlIGRvd24sIGNsZWFyIGl0cyBhZGRyZXNzZXMKLSAqIGFuZCBkZWxldGUgcm91dGVzIHRocm91Z2ggaXQuCi0gKi8KLXN0YXRpYyB2b2lkCi1pcHY2Y3BfZG93bihmKQotICAgIGZzbSAqZjsKLXsKLSAgICBJUFY2Q1BERUJVRygoImlwdjZjcDogZG93biIpKTsKLSAgICB1cGRhdGVfbGlua19zdGF0cyhmLT51bml0KTsKLSAgICBub3RpZnkoaXB2Nl9kb3duX25vdGlmaWVyLCAwKTsKLSAgICBpZiAoaXB2Nl9kb3duX2hvb2spCi0gICAgICAgaXB2Nl9kb3duX2hvb2soKTsKLSAgICBpZiAoaXB2NmNwX2lzX3VwKSB7Ci0JaXB2NmNwX2lzX3VwID0gMDsKLQlucF9kb3duKGYtPnVuaXQsIFBQUF9JUFY2KTsKLSAgICB9Ci0jaWZkZWYgSVBWNkNQX0NPTVAKLSAgICBzaWY2Y29tcChmLT51bml0LCAwKTsKLSNlbmRpZgotCi0gICAgLyoKLSAgICAgKiBJZiB3ZSBhcmUgZG9pbmcgZGlhbC1vbi1kZW1hbmQsIHNldCB0aGUgaW50ZXJmYWNlCi0gICAgICogdG8gcXVldWUgdXAgb3V0Z29pbmcgcGFja2V0cyAoZm9yIG5vdykuCi0gICAgICovCi0gICAgaWYgKGRlbWFuZCkgewotCXNpZm5wbW9kZShmLT51bml0LCBQUFBfSVBWNiwgTlBNT0RFX1FVRVVFKTsKLSAgICB9IGVsc2UgewotCXNpZm5wbW9kZShmLT51bml0LCBQUFBfSVBWNiwgTlBNT0RFX0RST1ApOwotI2lmICFkZWZpbmVkKF9fbGludXhfXykgJiYgIShkZWZpbmVkKFNWUjQpICYmIChkZWZpbmVkKFNOSSkgfHwgZGVmaW5lZChfX1VTTEMpKSkKLQlzaWY2ZG93bihmLT51bml0KTsKLSNlbmRpZgotCWlwdjZjcF9jbGVhcl9hZGRycyhmLT51bml0LCAKLQkJCSAgIGlwdjZjcF9nb3RvcHRpb25zW2YtPnVuaXRdLm91cmlkLAotCQkJICAgaXB2NmNwX2hpc29wdGlvbnNbZi0+dW5pdF0uaGlzaWQpOwotI2lmIGRlZmluZWQoX19saW51eF9fKQotCXNpZjZkb3duKGYtPnVuaXQpOwotI2VsaWYgZGVmaW5lZChTVlI0KSAmJiAoZGVmaW5lZChTTkkpIHx8IGRlZmluZWQoX19VU0xDKSkKLQlzaWZkb3duKGYtPnVuaXQpOwotI2VuZGlmCi0gICAgfQotCi0gICAgLyogRXhlY3V0ZSB0aGUgaXB2Ni1kb3duIHNjcmlwdCAqLwotICAgIGlmIChpcHY2Y3Bfc2NyaXB0X3N0YXRlID09IHNfdXAgJiYgaXB2NmNwX3NjcmlwdF9waWQgPT0gMCkgewotCWlwdjZjcF9zY3JpcHRfc3RhdGUgPSBzX2Rvd247Ci0JaXB2NmNwX3NjcmlwdChfUEFUSF9JUFY2RE9XTik7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBpcHY2Y3BfY2xlYXJfYWRkcnMoKSAtIGNsZWFyIHRoZSBpbnRlcmZhY2UgYWRkcmVzc2VzLCByb3V0ZXMsCi0gKiBwcm94eSBuZWlnaGJvdXIgZGlzY292ZXJ5IGVudHJpZXMsIGV0Yy4KLSAqLwotc3RhdGljIHZvaWQKLWlwdjZjcF9jbGVhcl9hZGRycyh1bml0LCBvdXJpZCwgaGlzaWQpCi0gICAgaW50IHVuaXQ7Ci0gICAgZXVpNjRfdCBvdXJpZDsKLSAgICBldWk2NF90IGhpc2lkOwotewotICAgIGNpZjZhZGRyKHVuaXQsIG91cmlkLCBoaXNpZCk7Ci19Ci0KLQotLyoKLSAqIGlwdjZjcF9maW5pc2hlZCAtIHBvc3NpYmx5IHNodXQgZG93biB0aGUgbG93ZXIgbGF5ZXJzLgotICovCi1zdGF0aWMgdm9pZAotaXB2NmNwX2ZpbmlzaGVkKGYpCi0gICAgZnNtICpmOwotewotICAgIG5wX2ZpbmlzaGVkKGYtPnVuaXQsIFBQUF9JUFY2KTsKLX0KLQotCi0vKgotICogaXB2NmNwX3NjcmlwdF9kb25lIC0gY2FsbGVkIHdoZW4gdGhlIGlwdjYtdXAgb3IgaXB2Ni1kb3duIHNjcmlwdAotICogaGFzIGZpbmlzaGVkLgotICovCi1zdGF0aWMgdm9pZAotaXB2NmNwX3NjcmlwdF9kb25lKGFyZykKLSAgICB2b2lkICphcmc7Ci17Ci0gICAgaXB2NmNwX3NjcmlwdF9waWQgPSAwOwotICAgIHN3aXRjaCAoaXB2NmNwX3NjcmlwdF9zdGF0ZSkgewotICAgIGNhc2Ugc191cDoKLQlpZiAoaXB2NmNwX2ZzbVswXS5zdGF0ZSAhPSBPUEVORUQpIHsKLQkgICAgaXB2NmNwX3NjcmlwdF9zdGF0ZSA9IHNfZG93bjsKLQkgICAgaXB2NmNwX3NjcmlwdChfUEFUSF9JUFY2RE9XTik7Ci0JfQotCWJyZWFrOwotICAgIGNhc2Ugc19kb3duOgotCWlmIChpcHY2Y3BfZnNtWzBdLnN0YXRlID09IE9QRU5FRCkgewotCSAgICBpcHY2Y3Bfc2NyaXB0X3N0YXRlID0gc191cDsKLQkgICAgaXB2NmNwX3NjcmlwdChfUEFUSF9JUFY2VVApOwotCX0KLQlicmVhazsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIGlwdjZjcF9zY3JpcHQgLSBFeGVjdXRlIGEgc2NyaXB0IHdpdGggYXJndW1lbnRzCi0gKiBpbnRlcmZhY2UtbmFtZSB0dHktbmFtZSBzcGVlZCBsb2NhbC1MTCByZW1vdGUtTEwuCi0gKi8KLXN0YXRpYyB2b2lkCi1pcHY2Y3Bfc2NyaXB0KHNjcmlwdCkKLSAgICBjaGFyICpzY3JpcHQ7Ci17Ci0gICAgY2hhciBzdHJzcGVlZFszMl0sIHN0cmxvY2FsWzMyXSwgc3RycmVtb3RlWzMyXTsKLSAgICBjaGFyICphcmd2WzhdOwotCi0gICAgc3ByaW50ZihzdHJzcGVlZCwgIiVkIiwgYmF1ZF9yYXRlKTsKLSAgICBzdHJjcHkoc3RybG9jYWwsIGxsdjZfbnRvYShpcHY2Y3BfZ290b3B0aW9uc1swXS5vdXJpZCkpOwotICAgIHN0cmNweShzdHJyZW1vdGUsIGxsdjZfbnRvYShpcHY2Y3BfaGlzb3B0aW9uc1swXS5oaXNpZCkpOwotCi0gICAgYXJndlswXSA9IHNjcmlwdDsKLSAgICBhcmd2WzFdID0gaWZuYW1lOwotICAgIGFyZ3ZbMl0gPSBkZXZuYW07Ci0gICAgYXJndlszXSA9IHN0cnNwZWVkOwotICAgIGFyZ3ZbNF0gPSBzdHJsb2NhbDsKLSAgICBhcmd2WzVdID0gc3RycmVtb3RlOwotICAgIGFyZ3ZbNl0gPSBpcHBhcmFtOwotICAgIGFyZ3ZbN10gPSBOVUxMOwotCi0gICAgaXB2NmNwX3NjcmlwdF9waWQgPSBydW5fcHJvZ3JhbShzY3JpcHQsIGFyZ3YsIDAsIGlwdjZjcF9zY3JpcHRfZG9uZSwKLQkJCQkgICAgTlVMTCwgMCk7Ci19Ci0KLS8qCi0gKiBpcHY2Y3BfcHJpbnRwa3QgLSBwcmludCB0aGUgY29udGVudHMgb2YgYW4gSVBWNkNQIHBhY2tldC4KLSAqLwotc3RhdGljIGNoYXIgKmlwdjZjcF9jb2RlbmFtZXNbXSA9IHsKLSAgICAiQ29uZlJlcSIsICJDb25mQWNrIiwgIkNvbmZOYWsiLCAiQ29uZlJlaiIsCi0gICAgIlRlcm1SZXEiLCAiVGVybUFjayIsICJDb2RlUmVqIgotfTsKLQotc3RhdGljIGludAotaXB2NmNwX3ByaW50cGt0KHAsIHBsZW4sIHByaW50ZXIsIGFyZykKLSAgICB1X2NoYXIgKnA7Ci0gICAgaW50IHBsZW47Ci0gICAgdm9pZCAoKnByaW50ZXIpIF9fUCgodm9pZCAqLCBjaGFyICosIC4uLikpOwotICAgIHZvaWQgKmFyZzsKLXsKLSAgICBpbnQgY29kZSwgaWQsIGxlbiwgb2xlbjsKLSAgICB1X2NoYXIgKnBzdGFydCwgKm9wdGVuZDsKLSAgICB1X3Nob3J0IGNpc2hvcnQ7Ci0gICAgZXVpNjRfdCBpZmFjZWlkOwotCi0gICAgaWYgKHBsZW4gPCBIRUFERVJMRU4pCi0JcmV0dXJuIDA7Ci0gICAgcHN0YXJ0ID0gcDsKLSAgICBHRVRDSEFSKGNvZGUsIHApOwotICAgIEdFVENIQVIoaWQsIHApOwotICAgIEdFVFNIT1JUKGxlbiwgcCk7Ci0gICAgaWYgKGxlbiA8IEhFQURFUkxFTiB8fCBsZW4gPiBwbGVuKQotCXJldHVybiAwOwotCi0gICAgaWYgKGNvZGUgPj0gMSAmJiBjb2RlIDw9IHNpemVvZihpcHY2Y3BfY29kZW5hbWVzKSAvIHNpemVvZihjaGFyICopKQotCXByaW50ZXIoYXJnLCAiICVzIiwgaXB2NmNwX2NvZGVuYW1lc1tjb2RlLTFdKTsKLSAgICBlbHNlCi0JcHJpbnRlcihhcmcsICIgY29kZT0weCV4IiwgY29kZSk7Ci0gICAgcHJpbnRlcihhcmcsICIgaWQ9MHgleCIsIGlkKTsKLSAgICBsZW4gLT0gSEVBREVSTEVOOwotICAgIHN3aXRjaCAoY29kZSkgewotICAgIGNhc2UgQ09ORlJFUToKLSAgICBjYXNlIENPTkZBQ0s6Ci0gICAgY2FzZSBDT05GTkFLOgotICAgIGNhc2UgQ09ORlJFSjoKLQkvKiBwcmludCBvcHRpb24gbGlzdCAqLwotCXdoaWxlIChsZW4gPj0gMikgewotCSAgICBHRVRDSEFSKGNvZGUsIHApOwotCSAgICBHRVRDSEFSKG9sZW4sIHApOwotCSAgICBwIC09IDI7Ci0JICAgIGlmIChvbGVuIDwgMiB8fCBvbGVuID4gbGVuKSB7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIHByaW50ZXIoYXJnLCAiIDwiKTsKLQkgICAgbGVuIC09IG9sZW47Ci0JICAgIG9wdGVuZCA9IHAgKyBvbGVuOwotCSAgICBzd2l0Y2ggKGNvZGUpIHsKLQkgICAgY2FzZSBDSV9DT01QUkVTU1RZUEU6Ci0JCWlmIChvbGVuID49IENJTEVOX0NPTVBSRVNTKSB7Ci0JCSAgICBwICs9IDI7Ci0JCSAgICBHRVRTSE9SVChjaXNob3J0LCBwKTsKLQkJICAgIHByaW50ZXIoYXJnLCAiY29tcHJlc3MgIik7Ci0JCSAgICBwcmludGVyKGFyZywgIjB4JXgiLCBjaXNob3J0KTsKLQkJfQotCQlicmVhazsKLQkgICAgY2FzZSBDSV9JRkFDRUlEOgotCQlpZiAob2xlbiA9PSBDSUxFTl9JRkFDRUlEKSB7Ci0JCSAgICBwICs9IDI7Ci0JCSAgICBldWk2NF9nZXQoaWZhY2VpZCwgcCk7Ci0JCSAgICBwcmludGVyKGFyZywgImFkZHIgJXMiLCBsbHY2X250b2EoaWZhY2VpZCkpOwotCQl9Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIHdoaWxlIChwIDwgb3B0ZW5kKSB7Ci0JCUdFVENIQVIoY29kZSwgcCk7Ci0JCXByaW50ZXIoYXJnLCAiICUuMngiLCBjb2RlKTsKLQkgICAgfQotCSAgICBwcmludGVyKGFyZywgIj4iKTsKLQl9Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIFRFUk1BQ0s6Ci0gICAgY2FzZSBURVJNUkVROgotCWlmIChsZW4gPiAwICYmICpwID49ICcgJyAmJiAqcCA8IDB4N2YpIHsKLQkgICAgcHJpbnRlcihhcmcsICIgIik7Ci0JICAgIHByaW50X3N0cmluZygoY2hhciAqKXAsIGxlbiwgcHJpbnRlciwgYXJnKTsKLQkgICAgcCArPSBsZW47Ci0JICAgIGxlbiA9IDA7Ci0JfQotCWJyZWFrOwotICAgIH0KLQotICAgIC8qIHByaW50IHRoZSByZXN0IG9mIHRoZSBieXRlcyBpbiB0aGUgcGFja2V0ICovCi0gICAgZm9yICg7IGxlbiA+IDA7IC0tbGVuKSB7Ci0JR0VUQ0hBUihjb2RlLCBwKTsKLQlwcmludGVyKGFyZywgIiAlLjJ4IiwgY29kZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHAgLSBwc3RhcnQ7Ci19Ci0KLS8qCi0gKiBpcHY2X2FjdGl2ZV9wa3QgLSBzZWUgaWYgdGhpcyBJUCBwYWNrZXQgaXMgd29ydGggYnJpbmdpbmcgdGhlIGxpbmsgdXAgZm9yLgotICogV2UgZG9uJ3QgYnJpbmcgdGhlIGxpbmsgdXAgZm9yIElQIGZyYWdtZW50cyBvciBmb3IgVENQIEZJTiBwYWNrZXRzCi0gKiB3aXRoIG5vIGRhdGEuCi0gKi8KLSNkZWZpbmUgSVA2X0hEUkxFTgk0MAkvKiBieXRlcyAqLwotI2RlZmluZSBJUDZfTkhEUl9GUkFHCTQ0CS8qIGZyYWdtZW50IElQdjYgaGVhZGVyICovCi0jZGVmaW5lIFRDUF9IRFJMRU4JMjAKLSNkZWZpbmUgVEhfRklOCQkweDAxCi0KLS8qCi0gKiBXZSB1c2UgdGhlc2UgbWFjcm9zIGJlY2F1c2UgdGhlIElQIGhlYWRlciBtYXkgYmUgYXQgYW4gb2RkIGFkZHJlc3MsCi0gKiBhbmQgc29tZSBjb21waWxlcnMgbWlnaHQgdXNlIHdvcmQgbG9hZHMgdG8gZ2V0IHRoX29mZiBvciBpcF9obC4KLSAqLwotCi0jZGVmaW5lIGdldF9pcDZuaCh4KQkoKCh1bnNpZ25lZCBjaGFyICopKHgpKVs2XSkKLSNkZWZpbmUgZ2V0X3RjcG9mZih4KQkoKCh1bnNpZ25lZCBjaGFyICopKHgpKVsxMl0gPj4gNCkKLSNkZWZpbmUgZ2V0X3RjcGZsYWdzKHgpCSgoKHVuc2lnbmVkIGNoYXIgKikoeCkpWzEzXSkKLQotc3RhdGljIGludAotaXB2Nl9hY3RpdmVfcGt0KHBrdCwgbGVuKQotICAgIHVfY2hhciAqcGt0OwotICAgIGludCBsZW47Ci17Ci0gICAgdV9jaGFyICp0Y3A7Ci0KLSAgICBsZW4gLT0gUFBQX0hEUkxFTjsKLSAgICBwa3QgKz0gUFBQX0hEUkxFTjsKLSAgICBpZiAobGVuIDwgSVA2X0hEUkxFTikKLQlyZXR1cm4gMDsKLSAgICBpZiAoZ2V0X2lwNm5oKHBrdCkgPT0gSVA2X05IRFJfRlJBRykKLQlyZXR1cm4gMDsKLSAgICBpZiAoZ2V0X2lwNm5oKHBrdCkgIT0gSVBQUk9UT19UQ1ApCi0JcmV0dXJuIDE7Ci0gICAgaWYgKGxlbiA8IElQNl9IRFJMRU4gKyBUQ1BfSERSTEVOKQotCXJldHVybiAwOwotICAgIHRjcCA9IHBrdCArIElQNl9IRFJMRU47Ci0gICAgaWYgKChnZXRfdGNwZmxhZ3ModGNwKSAmIFRIX0ZJTikgIT0gMCAmJiBsZW4gPT0gSVA2X0hEUkxFTiArIGdldF90Y3BvZmYodGNwKSAqIDQpCi0JcmV0dXJuIDA7Ci0gICAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9wcHBkL2lwdjZjcC5oIGIvcHBwZC9pcHY2Y3AuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0YzA2ZC4uMDAwMDAwMAotLS0gYS9wcHBkL2lwdjZjcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKiBpcHY2Y3AuaCAtIFBQUCBJUFY2IENvbnRyb2wgUHJvdG9jb2wuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFRvbW1pIEtvbXVsYWluZW4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBuYW1lKHMpIG9mIHRoZSBhdXRob3JzIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiA0LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFRvbW1pIEtvbXVsYWluZW4KLSAqICAgICA8VG9tbWkuS29tdWxhaW5lbkBpa2kuZmk+Ii4KLSAqCi0gKiBUSEUgQVVUSE9SUyBPRiBUSElTIFNPRlRXQVJFIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi0gKiBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLSAqIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLSAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLSAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICoKLSAqLwotCi0vKiAgT3JpZ2luYWwgdmVyc2lvbiwgYmFzZWQgb24gUkZDMjAyMyA6Ci0KLSAgICBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYsIDE5OTcgRnJhbmNpcy5EdXBvbnRAaW5yaWEuZnIsIElOUklBIFJvY3F1ZW5jb3VydCwKLSAgICBBbGFpbi5EdXJhbmRAaW1hZy5mciwgSU1BRywKLSAgICBKZWFuLUx1Yy5SaWNoaWVyQGltYWcuZnIsIElNQUctTFNSLgotCi0gICAgQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5IEZyYW5jaXMuRHVwb250QGlucmlhLmZyLCBHSUUgRFlBREUsCi0gICAgQWxhaW4uRHVyYW5kQGltYWcuZnIsIElNQUcsCi0gICAgSmVhbi1MdWMuUmljaGllckBpbWFnLmZyLCBJTUFHLUxTUi4KLQotICAgIENlIHRyYXZhaWwgYSDpdOkgZmFpdCBhdSBzZWluIGR1IEdJRSBEWUFERSAoR3JvdXBlbWVudCBkJ0ludOly6nQKLSAgICDJY29ub21pcXVlIGF5YW50IHBvdXIgbWVtYnJlcyBCVUxMIFMuQS4gZXQgbCdJTlJJQSkuCi0KLSAgICBDZSBsb2dpY2llbCBpbmZvcm1hdGlxdWUgZXN0IGRpc3BvbmlibGUgYXV4IGNvbmRpdGlvbnMKLSAgICB1c3VlbGxlcyBkYW5zIGxhIHJlY2hlcmNoZSwgYydlc3Qt4C1kaXJlIHF1J2lsIHBldXQKLSAgICDqdHJlIHV0aWxpc+ksIGNvcGnpLCBtb2RpZmnpLCBkaXN0cmlidekg4CBsJ3VuaXF1ZQotICAgIGNvbmRpdGlvbiBxdWUgY2UgdGV4dGUgc29pdCBjb25zZXJ26SBhZmluIHF1ZQotICAgIGwnb3JpZ2luZSBkZSBjZSBsb2dpY2llbCBzb2l0IHJlY29ubnVlLgotCi0gICAgTGUgbm9tIGRlIGwnSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZQotICAgIGV0IGVuIEF1dG9tYXRpcXVlIChJTlJJQSksIGRlIGwnSU1BRywgb3UgZCd1bmUgcGVyc29ubmUgbW9yYWxlCi0gICAgb3UgcGh5c2lxdWUgYXlhbnQgcGFydGljaXDpIOAgbCfpbGFib3JhdGlvbiBkZSBjZSBsb2dpY2llbCBuZSBwZXV0Ci0gICAg6nRyZSB1dGlsaXPpIHNhbnMgc29uIGFjY29yZCBwculhbGFibGUgZXhwbGljaXRlLgotCi0gICAgQ2UgbG9naWNpZWwgZXN0IGZvdXJuaSB0ZWwgcXVlbCBzYW5zIGF1Y3VuZSBnYXJhbnRpZSwKLSAgICBzdXBwb3J0IG91IHJlc3BvbnNhYmlsaXTpIGQnYXVjdW5lIHNvcnRlLgotICAgIENlIGxvZ2ljaWVsIGVzdCBk6XJpdukgZGUgc291cmNlcyBkJ29yaWdpbmUKLSAgICAiVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhIGF0IEJlcmtlbGV5IiBldAotICAgICJEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiIgY291dmVydGVzIHBhciBkZXMgY29weXJpZ2h0cy4KLQotICAgIEwnSW5zdGl0dXQgZCdJbmZvcm1hdGlxdWUgZXQgZGUgTWF0aOltYXRpcXVlcyBBcHBsaXF16WVzIGRlIEdyZW5vYmxlIChJTUFHKQotICAgIGVzdCB1bmUgZulk6XJhdGlvbiBkJ3VuaXTpcyBtaXh0ZXMgZGUgcmVjaGVyY2hlIGR1IENOUlMsIGRlIGwnSW5zdGl0dXQgTmF0aW9uYWwKLSAgICBQb2x5dGVjaG5pcXVlIGRlIEdyZW5vYmxlIGV0IGRlIGwnVW5pdmVyc2l06SBKb3NlcGggRm91cmllciByZWdyb3VwYW50Ci0gICAgc2VwdCBsYWJvcmF0b2lyZXMgZG9udCBsZSBsYWJvcmF0b2lyZSBMb2dpY2llbHMsIFN5c3TobWVzLCBS6XNlYXV4IChMU1IpLgotCi0gICAgVGhpcyB3b3JrIGhhcyBiZWVuIGRvbmUgaW4gdGhlIGNvbnRleHQgb2YgR0lFIERZQURFIChqb2ludCBSICYgRCB2ZW50dXJlCi0gICAgYmV0d2VlbiBCVUxMIFMuQS4gYW5kIElOUklBKS4KLQotICAgIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHdpdGggdXN1YWwgInJlc2VhcmNoIiB0ZXJtcwotICAgIHdpdGggdGhlIGFpbSBvZiByZXRhaW4gY3JlZGl0cyBvZiB0aGUgc29mdHdhcmUuIAotICAgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gICAgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gICAgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcywKLSAgICBhbmQgdGhlIG5hbWUgb2YgSU5SSUEsIElNQUcsIG9yIGFueSBjb250cmlidXRvciBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZwotICAgIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIHRoaXMgbWF0ZXJpYWwgd2l0aG91dCB0aGUgcHJpb3IgZXhwbGljaXQKLSAgICBwZXJtaXNzaW9uLiBUaGUgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGFueQotICAgIHdhcnJhbnRpZXMsIHN1cHBvcnQgb3IgbGlhYmlsaXRpZXMgb2YgYW55IGtpbmQuCi0gICAgVGhpcyBzb2Z0d2FyZSBpcyBkZXJpdmVkIGZyb20gc291cmNlIGNvZGUgZnJvbQotICAgICJVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEgYXQgQmVya2VsZXkiIGFuZAotICAgICJEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiIgcHJvdGVjdGVkIGJ5IGNvcHlyaWdodHMuCi0KLSAgICBHcmVub2JsZSdzIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlIGFuZCBBcHBsaWVkIE1hdGhlbWF0aWNzIChJTUFHKQotICAgIGlzIGEgZmVkZXJhdGlvbiBvZiBzZXZlbiByZXNlYXJjaCB1bml0cyBmdW5kZWQgYnkgdGhlIENOUlMsIE5hdGlvbmFsCi0gICAgUG9seXRlY2huaWMgSW5zdGl0dXRlIG9mIEdyZW5vYmxlIGFuZCBVbml2ZXJzaXR5IEpvc2VwaCBGb3VyaWVyLgotICAgIFRoZSByZXNlYXJjaCB1bml0IGluIFNvZnR3YXJlLCBTeXN0ZW1zLCBOZXR3b3JrcyAoTFNSKSBpcyBtZW1iZXIgb2YgSU1BRy4KLSovCi0KLS8qCi0gKiBEZXJpdmVkIGZyb20gOgotICoKLSAqCi0gKiBpcGNwLmggLSBJUCBDb250cm9sIFByb3RvY29sIGRlZmluaXRpb25zLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk4NC0yMDAwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBuYW1lICJDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHBlcm1pc3Npb24gb3IgYW55IGxlZ2FsCi0gKiAgICBkZXRhaWxzLCBwbGVhc2UgY29udGFjdAotICogICAgICBPZmZpY2Ugb2YgVGVjaG5vbG9neSBUcmFuc2ZlcgotICogICAgICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQotICogICAgICA1MDAwIEZvcmJlcyBBdmVudWUKLSAqICAgICAgUGl0dHNidXJnaCwgUEEgIDE1MjEzLTM4OTAKLSAqICAgICAgKDQxMikgMjY4LTQzODcsIGZheDogKDQxMikgMjY4LTczOTUKLSAqICAgICAgdGVjaC10cmFuc2ZlckBhbmRyZXcuY211LmVkdQotICoKLSAqIDQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQ29tcHV0aW5nIFNlcnZpY2VzCi0gKiAgICAgYXQgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkgKGh0dHA6Ly93d3cuY211LmVkdS9jb21wdXRpbmcvKS4iCi0gKgotICogQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi0gKiBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLSAqIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLSAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLSAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICoKLSAqICRJZDogaXB2NmNwLmgsdiAxLjcgMjAwMi8xMi8wNCAyMzowMzozMiBwYXVsdXMgRXhwICQKLSAqLwotCi0vKgotICogT3B0aW9ucy4KLSAqLwotI2RlZmluZSBDSV9JRkFDRUlECTEJLyogSW50ZXJmYWNlIElkZW50aWZpZXIgKi8KLSNkZWZpbmUgQ0lfQ09NUFJFU1NUWVBFCTIJLyogQ29tcHJlc3Npb24gVHlwZSAgICAgKi8KLQotLyogTm8gY29tcHJlc3Npb24gdHlwZXMgeWV0IGRlZmluZWQuCi0gKiNkZWZpbmUgSVBWNkNQX0NPTVAJMHgwMDRmCi0gKi8KLXR5cGVkZWYgc3RydWN0IGlwdjZjcF9vcHRpb25zIHsKLSAgICBpbnQgbmVnX2lmYWNlaWQ7CQkvKiBOZWdvdGlhdGUgaW50ZXJmYWNlIGlkZW50aWZpZXI/ICovCi0gICAgaW50IHJlcV9pZmFjZWlkOwkJLyogQXNrIHBlZXIgdG8gc2VuZCBpbnRlcmZhY2UgaWRlbnRpZmllcj8gKi8KLSAgICBpbnQgYWNjZXB0X2xvY2FsOwkJLyogYWNjZXB0IHBlZXIncyB2YWx1ZSBmb3IgaWZhY2UgaWQ/ICovCi0gICAgaW50IG9wdF9sb2NhbDsJCS8qIG91cnRva2VuIHNldCBieSBvcHRpb24gKi8KLSAgICBpbnQgb3B0X3JlbW90ZTsJCS8qIGhpc3Rva2VuIHNldCBieSBvcHRpb24gKi8KLSAgICBpbnQgdXNlX2lwOwkJCS8qIHVzZSBJUCBhcyBpbnRlcmZhY2UgaWRlbnRpZmllciAqLwotICAgIGludCB1c2VfcGVyc2lzdGVudDsJCS8qIHVzZSB1bmlxdWVseSBwZXJzaXN0ZW50IHZhbHVlIGZvciBhZGRyZXNzICovCi0gICAgaW50IG5lZ192ajsJCQkvKiBWYW4gSmFjb2Jzb24gQ29tcHJlc3Npb24/ICovCi0gICAgdV9zaG9ydCB2al9wcm90b2NvbDsJLyogcHJvdG9jb2wgdmFsdWUgdG8gdXNlIGluIFZKIG9wdGlvbiAqLwotICAgIGV1aTY0X3Qgb3VyaWQsIGhpc2lkOwkvKiBJbnRlcmZhY2UgaWRlbnRpZmllcnMgKi8KLX0gaXB2NmNwX29wdGlvbnM7Ci0KLWV4dGVybiBmc20gaXB2NmNwX2ZzbVtdOwotZXh0ZXJuIGlwdjZjcF9vcHRpb25zIGlwdjZjcF93YW50b3B0aW9uc1tdOwotZXh0ZXJuIGlwdjZjcF9vcHRpb25zIGlwdjZjcF9nb3RvcHRpb25zW107Ci1leHRlcm4gaXB2NmNwX29wdGlvbnMgaXB2NmNwX2FsbG93b3B0aW9uc1tdOwotZXh0ZXJuIGlwdjZjcF9vcHRpb25zIGlwdjZjcF9oaXNvcHRpb25zW107Ci0KLWV4dGVybiBzdHJ1Y3QgcHJvdGVudCBpcHY2Y3BfcHJvdGVudDsKZGlmZiAtLWdpdCBhL3BwcGQvaXB4Y3AuYyBiL3BwcGQvaXB4Y3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IyMzQzZS4uMDAwMDAwMAotLS0gYS9wcHBkL2lweGNwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTk4ICswLDAgQEAKLS8qCi0gKiBpcHhjcC5jIC0gUFBQIElQWCBDb250cm9sIFByb3RvY29sLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk4NC0yMDAwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBuYW1lICJDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHBlcm1pc3Npb24gb3IgYW55IGxlZ2FsCi0gKiAgICBkZXRhaWxzLCBwbGVhc2UgY29udGFjdAotICogICAgICBPZmZpY2Ugb2YgVGVjaG5vbG9neSBUcmFuc2ZlcgotICogICAgICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQotICogICAgICA1MDAwIEZvcmJlcyBBdmVudWUKLSAqICAgICAgUGl0dHNidXJnaCwgUEEgIDE1MjEzLTM4OTAKLSAqICAgICAgKDQxMikgMjY4LTQzODcsIGZheDogKDQxMikgMjY4LTczOTUKLSAqICAgICAgdGVjaC10cmFuc2ZlckBhbmRyZXcuY211LmVkdQotICoKLSAqIDQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQ29tcHV0aW5nIFNlcnZpY2VzCi0gKiAgICAgYXQgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkgKGh0dHA6Ly93d3cuY211LmVkdS9jb21wdXRpbmcvKS4iCi0gKgotICogQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi0gKiBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLSAqIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLSAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLSAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpZmRlZiBJUFhfQ0hBTkdFCi0KLSNkZWZpbmUgUkNTSUQJIiRJZDogaXB4Y3AuYyx2IDEuMjQgMjAwNS8wOC8yNSAyMzo1OTozNCBwYXVsdXMgRXhwICQiCi0KLS8qCi0gKiBUT0RPOgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLQotI2luY2x1ZGUgInBwcGQuaCIKLSNpbmNsdWRlICJmc20uaCIKLSNpbmNsdWRlICJpcHhjcC5oIgotI2luY2x1ZGUgInBhdGhuYW1lcy5oIgotI2luY2x1ZGUgIm1hZ2ljLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gPSBSQ1NJRDsKLQotLyogZ2xvYmFsIHZhcnMgKi8KLWlweGNwX29wdGlvbnMgaXB4Y3Bfd2FudG9wdGlvbnNbTlVNX1BQUF07CS8qIE9wdGlvbnMgdGhhdCB3ZSB3YW50IHRvIHJlcXVlc3QgKi8KLWlweGNwX29wdGlvbnMgaXB4Y3BfZ290b3B0aW9uc1tOVU1fUFBQXTsJLyogT3B0aW9ucyB0aGF0IHBlZXIgYWNrJ2QgKi8KLWlweGNwX29wdGlvbnMgaXB4Y3BfYWxsb3dvcHRpb25zW05VTV9QUFBdOwkvKiBPcHRpb25zIHdlIGFsbG93IHBlZXIgdG8gcmVxdWVzdCAqLwotaXB4Y3Bfb3B0aW9ucyBpcHhjcF9oaXNvcHRpb25zW05VTV9QUFBdOwkvKiBPcHRpb25zIHRoYXQgd2UgYWNrJ2QgKi8KLQotI2RlZmluZSB3byAoJmlweGNwX3dhbnRvcHRpb25zWzBdKQotI2RlZmluZSBhbyAoJmlweGNwX2FsbG93b3B0aW9uc1swXSkKLSNkZWZpbmUgZ28gKCZpcHhjcF9nb3RvcHRpb25zWzBdKQotI2RlZmluZSBobyAoJmlweGNwX2hpc29wdGlvbnNbMF0pCi0KLS8qCi0gKiBDYWxsYmFja3MgZm9yIGZzbSBjb2RlLiAgKENJID0gQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbikKLSAqLwotc3RhdGljIHZvaWQgaXB4Y3BfcmVzZXRjaSBfX1AoKGZzbSAqKSk7CS8qIFJlc2V0IG91ciBDSSAqLwotc3RhdGljIGludCAgaXB4Y3BfY2lsZW4gX19QKChmc20gKikpOwkJLyogUmV0dXJuIGxlbmd0aCBvZiBvdXIgQ0kgKi8KLXN0YXRpYyB2b2lkIGlweGNwX2FkZGNpIF9fUCgoZnNtICosIHVfY2hhciAqLCBpbnQgKikpOyAvKiBBZGQgb3VyIENJICovCi1zdGF0aWMgaW50ICBpcHhjcF9hY2tjaSBfX1AoKGZzbSAqLCB1X2NoYXIgKiwgaW50KSk7CS8qIFBlZXIgYWNrJ2Qgb3VyIENJICovCi1zdGF0aWMgaW50ICBpcHhjcF9uYWtjaSBfX1AoKGZzbSAqLCB1X2NoYXIgKiwgaW50LCBpbnQpKTsvKiBQZWVyIG5haydkIG91ciBDSSAqLwotc3RhdGljIGludCAgaXB4Y3BfcmVqY2kgX19QKChmc20gKiwgdV9jaGFyICosIGludCkpOwkvKiBQZWVyIHJlaidkIG91ciBDSSAqLwotc3RhdGljIGludCAgaXB4Y3BfcmVxY2kgX19QKChmc20gKiwgdV9jaGFyICosIGludCAqLCBpbnQpKTsgLyogUmN2IENJICovCi1zdGF0aWMgdm9pZCBpcHhjcF91cCBfX1AoKGZzbSAqKSk7CQkvKiBXZSdyZSBVUCAqLwotc3RhdGljIHZvaWQgaXB4Y3BfZG93biBfX1AoKGZzbSAqKSk7CQkvKiBXZSdyZSBET1dOICovCi1zdGF0aWMgdm9pZCBpcHhjcF9maW5pc2hlZCBfX1AoKGZzbSAqKSk7CS8qIERvbid0IG5lZWQgbG93ZXIgbGF5ZXIgKi8KLXN0YXRpYyB2b2lkIGlweGNwX3NjcmlwdCBfX1AoKGZzbSAqLCBjaGFyICopKTsgLyogUnVuIGFuIHVwL2Rvd24gc2NyaXB0ICovCi0KLWZzbSBpcHhjcF9mc21bTlVNX1BQUF07CQkvKiBJUFhDUCBmc20gc3RydWN0dXJlICovCi0KLXN0YXRpYyBmc21fY2FsbGJhY2tzIGlweGNwX2NhbGxiYWNrcyA9IHsgLyogSVBYQ1AgY2FsbGJhY2sgcm91dGluZXMgKi8KLSAgICBpcHhjcF9yZXNldGNpLAkJLyogUmVzZXQgb3VyIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gKi8KLSAgICBpcHhjcF9jaWxlbiwJCS8qIExlbmd0aCBvZiBvdXIgQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbiAqLwotICAgIGlweGNwX2FkZGNpLAkJLyogQWRkIG91ciBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uICovCi0gICAgaXB4Y3BfYWNrY2ksCQkvKiBBQ0sgb3VyIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gKi8KLSAgICBpcHhjcF9uYWtjaSwJCS8qIE5BSyBvdXIgQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbiAqLwotICAgIGlweGNwX3JlamNpLAkJLyogUmVqZWN0IG91ciBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uICovCi0gICAgaXB4Y3BfcmVxY2ksCQkvKiBSZXF1ZXN0IHBlZXIncyBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uICovCi0gICAgaXB4Y3BfdXAsCQkJLyogQ2FsbGVkIHdoZW4gZnNtIHJlYWNoZXMgT1BFTkVEIHN0YXRlICovCi0gICAgaXB4Y3BfZG93biwJCQkvKiBDYWxsZWQgd2hlbiBmc20gbGVhdmVzIE9QRU5FRCBzdGF0ZSAqLwotICAgIE5VTEwsCQkJLyogQ2FsbGVkIHdoZW4gd2Ugd2FudCB0aGUgbG93ZXIgbGF5ZXIgdXAgKi8KLSAgICBpcHhjcF9maW5pc2hlZCwJCS8qIENhbGxlZCB3aGVuIHdlIHdhbnQgdGhlIGxvd2VyIGxheWVyIGRvd24gKi8KLSAgICBOVUxMLAkJCS8qIENhbGxlZCB3aGVuIFByb3RvY29sLVJlamVjdCByZWNlaXZlZCAqLwotICAgIE5VTEwsCQkJLyogUmV0cmFuc21pc3Npb24gaXMgbmVjZXNzYXJ5ICovCi0gICAgTlVMTCwJCQkvKiBDYWxsZWQgdG8gaGFuZGxlIHByb3RvY29sLXNwZWNpZmljIGNvZGVzICovCi0gICAgIklQWENQIgkJCS8qIFN0cmluZyBuYW1lIG9mIHByb3RvY29sICovCi19OwotCi0vKgotICogQ29tbWFuZC1saW5lIG9wdGlvbnMuCi0gKi8KLXN0YXRpYyBpbnQgc2V0aXB4bm9kZSBfX1AoKGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIHByaW50aXB4bm9kZSBfX1AoKG9wdGlvbl90ICosCi0JCQkgICAgICB2b2lkICgqKSh2b2lkICosIGNoYXIgKiwgLi4uKSwgdm9pZCAqKSk7Ci1zdGF0aWMgaW50IHNldGlweG5hbWUgX19QKChjaGFyICoqKSk7Ci0KLXN0YXRpYyBvcHRpb25fdCBpcHhjcF9vcHRpb25fbGlzdFtdID0gewotICAgIHsgImlweCIsIG9fYm9vbCwgJmlweGNwX3Byb3RlbnQuZW5hYmxlZF9mbGFnLAotICAgICAgIkVuYWJsZSBJUFhDUCAoYW5kIElQWCkiLCBPUFRfUFJJTyB8IDEgfSwKLSAgICB7ICIraXB4Iiwgb19ib29sLCAmaXB4Y3BfcHJvdGVudC5lbmFibGVkX2ZsYWcsCi0gICAgICAiRW5hYmxlIElQWENQIChhbmQgSVBYKSIsIE9QVF9QUklPU1VCIHwgT1BUX0FMSUFTIHwgMSB9LAotICAgIHsgIm5vaXB4Iiwgb19ib29sLCAmaXB4Y3BfcHJvdGVudC5lbmFibGVkX2ZsYWcsCi0gICAgICAiRGlzYWJsZSBJUFhDUCAoYW5kIElQWCkiLCBPUFRfUFJJT1NVQiB9LAotICAgIHsgIi1pcHgiLCBvX2Jvb2wsICZpcHhjcF9wcm90ZW50LmVuYWJsZWRfZmxhZywKLSAgICAgICJEaXNhYmxlIElQWENQIChhbmQgSVBYKSIsIE9QVF9QUklPU1VCIHwgT1BUX0FMSUFTIH0sCi0KLSAgICB7ICJpcHgtbmV0d29yayIsIG9fdWludDMyLCAmaXB4Y3Bfd2FudG9wdGlvbnNbMF0ub3VyX25ldHdvcmssCi0gICAgICAiU2V0IG91ciBJUFggbmV0d29yayBudW1iZXIiLCBPUFRfUFJJTywgJmlweGNwX3dhbnRvcHRpb25zWzBdLm5lZ19ubiB9LAotCi0gICAgeyAiaXB4Y3AtYWNjZXB0LW5ldHdvcmsiLCBvX2Jvb2wsICZpcHhjcF93YW50b3B0aW9uc1swXS5hY2NlcHRfbmV0d29yaywKLSAgICAgICJBY2NlcHQgcGVlciBJUFggbmV0d29yayBudW1iZXIiLCAxLAotICAgICAgJmlweGNwX2FsbG93b3B0aW9uc1swXS5hY2NlcHRfbmV0d29yayB9LAotCi0gICAgeyAiaXB4LW5vZGUiLCBvX3NwZWNpYWwsICh2b2lkICopc2V0aXB4bm9kZSwKLSAgICAgICJTZXQgSVBYIG5vZGUgbnVtYmVyIiwgT1BUX0EyUFJJTlRFUiwgKHZvaWQgKilwcmludGlweG5vZGUgfSwKLQotICAgIHsgImlweGNwLWFjY2VwdC1sb2NhbCIsIG9fYm9vbCwgJmlweGNwX3dhbnRvcHRpb25zWzBdLmFjY2VwdF9sb2NhbCwKLSAgICAgICJBY2NlcHQgb3VyIElQWCBhZGRyZXNzIiwgMSwKLSAgICAgICZpcHhjcF9hbGxvd29wdGlvbnNbMF0uYWNjZXB0X2xvY2FsIH0sCi0KLSAgICB7ICJpcHhjcC1hY2NlcHQtcmVtb3RlIiwgb19ib29sLCAmaXB4Y3Bfd2FudG9wdGlvbnNbMF0uYWNjZXB0X3JlbW90ZSwKLSAgICAgICJBY2NlcHQgcGVlcidzIElQWCBhZGRyZXNzIiwgMSwKLSAgICAgICZpcHhjcF9hbGxvd29wdGlvbnNbMF0uYWNjZXB0X3JlbW90ZSB9LAotCi0gICAgeyAiaXB4LXJvdXRpbmciLCBvX2ludCwgJmlweGNwX3dhbnRvcHRpb25zWzBdLnJvdXRlciwKLSAgICAgICJTZXQgSVBYIHJvdXRpbmcgcHJvdG8gbnVtYmVyIiwgT1BUX1BSSU8sCi0gICAgICAmaXB4Y3Bfd2FudG9wdGlvbnNbMF0ubmVnX3JvdXRlciB9LAotCi0gICAgeyAiaXB4LXJvdXRlci1uYW1lIiwgb19zcGVjaWFsLCBzZXRpcHhuYW1lLAotICAgICAgIlNldCBJUFggcm91dGVyIG5hbWUiLCBPUFRfUFJJTyB8IE9QVF9BMlNUUlZBTCB8IE9QVF9TVEFUSUMsCi0gICAgICAgJmlweGNwX3dhbnRvcHRpb25zWzBdLm5hbWUgfSwKLQotICAgIHsgImlweGNwLXJlc3RhcnQiLCBvX2ludCwgJmlweGNwX2ZzbVswXS50aW1lb3V0dGltZSwKLSAgICAgICJTZXQgdGltZW91dCBmb3IgSVBYQ1AiLCBPUFRfUFJJTyB9LAotICAgIHsgImlweGNwLW1heC10ZXJtaW5hdGUiLCBvX2ludCwgJmlweGNwX2ZzbVswXS5tYXh0ZXJtdHJhbnNtaXRzLAotICAgICAgIlNldCBtYXggI3htaXRzIGZvciBJUFhDUCB0ZXJtLXJlcXMiLCBPUFRfUFJJTyB9LAotICAgIHsgImlweGNwLW1heC1jb25maWd1cmUiLCBvX2ludCwgJmlweGNwX2ZzbVswXS5tYXhjb25mcmVxdHJhbnNtaXRzLAotICAgICAgIlNldCBtYXggI3htaXRzIGZvciBJUFhDUCBjb25mLXJlcXMiLCBPUFRfUFJJTyB9LAotICAgIHsgImlweGNwLW1heC1mYWlsdXJlIiwgb19pbnQsICZpcHhjcF9mc21bMF0ubWF4bmFrbG9vcHMsCi0gICAgICAiU2V0IG1heCAjY29uZi1uYWtzIGZvciBJUFhDUCIsIE9QVF9QUklPIH0sCi0KLSAgICB7IE5VTEwgfQotfTsKLQotLyoKLSAqIFByb3RvY29sIGVudHJ5IHBvaW50cy4KLSAqLwotCi1zdGF0aWMgdm9pZCBpcHhjcF9pbml0IF9fUCgoaW50KSk7Ci1zdGF0aWMgdm9pZCBpcHhjcF9vcGVuIF9fUCgoaW50KSk7Ci1zdGF0aWMgdm9pZCBpcHhjcF9jbG9zZSBfX1AoKGludCwgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBpcHhjcF9sb3dlcnVwIF9fUCgoaW50KSk7Ci1zdGF0aWMgdm9pZCBpcHhjcF9sb3dlcmRvd24gX19QKChpbnQpKTsKLXN0YXRpYyB2b2lkIGlweGNwX2lucHV0IF9fUCgoaW50LCB1X2NoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBpcHhjcF9wcm90cmVqIF9fUCgoaW50KSk7Ci1zdGF0aWMgaW50ICBpcHhjcF9wcmludHBrdCBfX1AoKHVfY2hhciAqLCBpbnQsCi0JCQkJdm9pZCAoKikgX19QKCh2b2lkICosIGNoYXIgKiwgLi4uKSksIHZvaWQgKikpOwotCi1zdHJ1Y3QgcHJvdGVudCBpcHhjcF9wcm90ZW50ID0gewotICAgIFBQUF9JUFhDUCwKLSAgICBpcHhjcF9pbml0LAotICAgIGlweGNwX2lucHV0LAotICAgIGlweGNwX3Byb3RyZWosCi0gICAgaXB4Y3BfbG93ZXJ1cCwKLSAgICBpcHhjcF9sb3dlcmRvd24sCi0gICAgaXB4Y3Bfb3BlbiwKLSAgICBpcHhjcF9jbG9zZSwKLSAgICBpcHhjcF9wcmludHBrdCwKLSAgICBOVUxMLAotICAgIDAsCi0gICAgIklQWENQIiwKLSAgICAiSVBYIiwKLSAgICBpcHhjcF9vcHRpb25fbGlzdCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTAotfTsKLQotLyoKLSAqIExlbmd0aHMgb2YgY29uZmlndXJhdGlvbiBvcHRpb25zLgotICovCi0KLSNkZWZpbmUgQ0lMRU5fVk9JRAkyCi0jZGVmaW5lIENJTEVOX0NPTVBMRVRFCTIJLyogbGVuZ3RoIG9mIGNvbXBsZXRlIG9wdGlvbiAqLwotI2RlZmluZSBDSUxFTl9ORVROCTYJLyogbmV0d29yayBudW1iZXIgbGVuZ3RoIG9wdGlvbiAqLwotI2RlZmluZSBDSUxFTl9OT0RFTgk4CS8qIG5vZGUgbnVtYmVyIGxlbmd0aCBvcHRpb24gKi8KLSNkZWZpbmUgQ0lMRU5fUFJPVE9DT0wJNAkvKiBNaW5pbXVtIGxlbmd0aCBvZiByb3V0aW5nIHByb3RvY29sICovCi0jZGVmaW5lIENJTEVOX05BTUUJMwkvKiBNaW5pbXVtIGxlbmd0aCBvZiByb3V0ZXIgbmFtZSAqLwotI2RlZmluZSBDSUxFTl9DT01QUkVTUwk0CS8qIE1pbmltdW0gbGVuZ3RoIG9mIGNvbXByZXNzaW9uIHByb3RvY29sICovCi0KLSNkZWZpbmUgQ09ERU5BTUUoeCkJKCh4KSA9PSBDT05GQUNLID8gIkFDSyIgOiBcCi0JCQkgKHgpID09IENPTkZOQUsgPyAiTkFLIiA6ICJSRUoiKQotCi1zdGF0aWMgaW50IGlweGNwX2lzX3VwOwotCi1zdGF0aWMgY2hhciAqaXB4X250b2EgX19QKCh1X2ludDMyX3QpKTsKLQotLyogVXNlZCBpbiBwcmludGluZyB0aGUgbm9kZSBudW1iZXIgKi8KLSNkZWZpbmUgTk9ERShiYXNlKSBiYXNlWzBdLCBiYXNlWzFdLCBiYXNlWzJdLCBiYXNlWzNdLCBiYXNlWzRdLCBiYXNlWzVdCi0KLS8qIFVzZWQgdG8gZ2VuZXJhdGUgdGhlIHByb3BlciBiaXQgbWFzayAqLwotI2RlZmluZSBCSVQobnVtKSAgICgxIDw8IChudW0pKQotCi0vKgotICogQ29udmVydCBmcm9tIGludGVybmFsIHRvIGV4dGVybmFsIG5vdGF0aW9uCi0gKi8KLQotc3RhdGljIHNob3J0IGludAotdG9fZXh0ZXJuYWwoaW50ZXJuYWwpCi1zaG9ydCBpbnQgaW50ZXJuYWw7Ci17Ci0gICAgc2hvcnQgaW50ICBleHRlcm5hbDsKLQotICAgIGlmIChpbnRlcm5hbCAmIEJJVChJUFhfTk9ORSkgKQotICAgICAgICBleHRlcm5hbCA9IElQWF9OT05FOwotICAgIGVsc2UKLSAgICAgICAgZXh0ZXJuYWwgPSBSSVBfU0FQOwotCi0gICAgcmV0dXJuIGV4dGVybmFsOwotfQotCi0vKgotICogTWFrZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG5ldHdvcmsgSVAgYWRkcmVzcy4KLSAqLwotCi1zdGF0aWMgY2hhciAqCi1pcHhfbnRvYShpcHhhZGRyKQotdV9pbnQzMl90IGlweGFkZHI7Ci17Ci0gICAgc3RhdGljIGNoYXIgYls2NF07Ci0gICAgc2xwcmludGYoYiwgc2l6ZW9mKGIpLCAiJXgiLCBpcHhhZGRyKTsKLSAgICByZXR1cm4gYjsKLX0KLQotCi1zdGF0aWMgdV9jaGFyICoKLXNldGlweG5vZGV2YWx1ZShzcmMsZHN0KQotdV9jaGFyICpzcmMsICpkc3Q7Ci17Ci0gICAgaW50IGluZHg7Ci0gICAgaW50IGl0ZW07Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGlmICghaXN4ZGlnaXQgKCpzcmMpKQotCSAgICBicmVhazsKLQkKLQlmb3IgKGluZHggPSAwOyBpbmR4IDwgNTsgKytpbmR4KSB7Ci0JICAgIGRzdFtpbmR4XSA8PD0gNDsKLQkgICAgZHN0W2luZHhdIHw9IChkc3RbaW5keCArIDFdID4+IDQpICYgMHgwRjsKLQl9Ci0KLQlpdGVtID0gdG91cHBlciAoKnNyYykgLSAnMCc7Ci0JaWYgKGl0ZW0gPiA5KQotCSAgICBpdGVtIC09IDc7Ci0KLQlkc3RbNV0gPSAoZHN0WzVdIDw8IDQpIHwgaXRlbTsKLQkrK3NyYzsKLSAgICB9Ci0gICAgcmV0dXJuIHNyYzsKLX0KLQotc3RhdGljIGludCBpcHhfcHJpb19vdXIsIGlweF9wcmlvX2hpczsKLQotc3RhdGljIGludAotc2V0aXB4bm9kZShhcmd2KQotICAgIGNoYXIgKiphcmd2OwotewotICAgIHVfY2hhciAqZW5kOwotICAgIGludCBoYXZlX2hpcyA9IDA7Ci0gICAgdV9jaGFyIG91cl9ub2RlWzZdOwotICAgIHVfY2hhciBoaXNfbm9kZVs2XTsKLQotICAgIG1lbXNldCAob3VyX25vZGUsIDAsIDYpOwotICAgIG1lbXNldCAoaGlzX25vZGUsIDAsIDYpOwotCi0gICAgZW5kID0gc2V0aXB4bm9kZXZhbHVlICgqYXJndiwgb3VyX25vZGUpOwotICAgIGlmICgqZW5kID09ICc6JykgewotCWhhdmVfaGlzID0gMTsKLQllbmQgPSBzZXRpcHhub2RldmFsdWUgKCsrZW5kLCBoaXNfbm9kZSk7Ci0gICAgfQotCi0gICAgaWYgKCplbmQgPT0gJ1wwJykgewotICAgICAgICBpcHhjcF93YW50b3B0aW9uc1swXS5uZWdfbm9kZSA9IDE7Ci0JaWYgKG9wdGlvbl9wcmlvcml0eSA+PSBpcHhfcHJpb19vdXIpIHsKLQkgICAgbWVtY3B5KCZpcHhjcF93YW50b3B0aW9uc1swXS5vdXJfbm9kZVswXSwgb3VyX25vZGUsIDYpOwotCSAgICBpcHhfcHJpb19vdXIgPSBvcHRpb25fcHJpb3JpdHk7Ci0JfQotCWlmIChoYXZlX2hpcyAmJiBvcHRpb25fcHJpb3JpdHkgPj0gaXB4X3ByaW9faGlzKSB7Ci0JICAgIG1lbWNweSgmaXB4Y3Bfd2FudG9wdGlvbnNbMF0uaGlzX25vZGVbMF0sIGhpc19ub2RlLCA2KTsKLQkgICAgaXB4X3ByaW9faGlzID0gb3B0aW9uX3ByaW9yaXR5OwotCX0KLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgb3B0aW9uX2Vycm9yKCJpbnZhbGlkIHBhcmFtZXRlciAnJXMnIGZvciBpcHgtbm9kZSBvcHRpb24iLCAqYXJndik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludGlweG5vZGUob3B0LCBwcmludGVyLCBhcmcpCi0gICAgb3B0aW9uX3QgKm9wdDsKLSAgICB2b2lkICgqcHJpbnRlcikgX19QKCh2b2lkICosIGNoYXIgKiwgLi4uKSk7Ci0gICAgdm9pZCAqYXJnOwotewotCXVuc2lnbmVkIGNoYXIgKnA7Ci0KLQlwID0gaXB4Y3Bfd2FudG9wdGlvbnNbMF0ub3VyX25vZGU7Ci0JaWYgKGlweF9wcmlvX291cikKLQkJcHJpbnRlcihhcmcsICIlLjJ4JS4yeCUuMnglLjJ4JS4yeCUuMngiLAotCQkJcFswXSwgcFsxXSwgcFsyXSwgcFszXSwgcFs0XSwgcFs1XSk7Ci0JcHJpbnRlcihhcmcsICI6Iik7Ci0JcCA9IGlweGNwX3dhbnRvcHRpb25zWzBdLmhpc19ub2RlOwotCWlmIChpcHhfcHJpb19oaXMpCi0JCXByaW50ZXIoYXJnLCAiJS4yeCUuMnglLjJ4JS4yeCUuMnglLjJ4IiwKLQkJCXBbMF0sIHBbMV0sIHBbMl0sIHBbM10sIHBbNF0sIHBbNV0pOwotfQotCi1zdGF0aWMgaW50Ci1zZXRpcHhuYW1lIChhcmd2KQotICAgIGNoYXIgKiphcmd2OwotewotICAgIHVfY2hhciAqZGVzdCA9IGlweGNwX3dhbnRvcHRpb25zWzBdLm5hbWU7Ci0gICAgY2hhciAqc3JjICA9ICphcmd2OwotICAgIGludCAgY291bnQ7Ci0gICAgY2hhciBjaDsKLQotICAgIGlweGNwX3dhbnRvcHRpb25zWzBdLm5lZ19uYW1lICA9IDE7Ci0gICAgaXB4Y3BfYWxsb3dvcHRpb25zWzBdLm5lZ19uYW1lID0gMTsKLSAgICBtZW1zZXQgKGRlc3QsICdcMCcsIHNpemVvZiAoaXB4Y3Bfd2FudG9wdGlvbnNbMF0ubmFtZSkpOwotCi0gICAgY291bnQgPSAwOwotICAgIHdoaWxlICgqc3JjKSB7Ci0gICAgICAgIGNoID0gKnNyYysrOwotCWlmICghIGlzYWxudW0gKGNoKSAmJiBjaCAhPSAnXycpIHsKLQkgICAgb3B0aW9uX2Vycm9yKCJJUFggcm91dGVyIG5hbWUgbXVzdCBiZSBhbHBoYW51bWVyaWMgb3IgXyIpOwotCSAgICByZXR1cm4gMDsKLQl9Ci0KLQlpZiAoY291bnQgPj0gc2l6ZW9mIChpcHhjcF93YW50b3B0aW9uc1swXS5uYW1lKSAtIDEpIHsKLQkgICAgb3B0aW9uX2Vycm9yKCJJUFggcm91dGVyIG5hbWUgaXMgbGltaXRlZCB0byAlZCBjaGFyYWN0ZXJzIiwKLQkJCSBzaXplb2YgKGlweGNwX3dhbnRvcHRpb25zWzBdLm5hbWUpIC0gMSk7Ci0JICAgIHJldHVybiAwOwotCX0KLQotCWRlc3RbY291bnQrK10gPSB0b3VwcGVyIChjaCk7Ci0gICAgfQotICAgIGRlc3RbY291bnRdID0gMDsKLQotICAgIHJldHVybiAxOwotfQotCi0vKgotICogaXB4Y3BfaW5pdCAtIEluaXRpYWxpemUgSVBYQ1AuCi0gKi8KLXN0YXRpYyB2b2lkCi1pcHhjcF9pbml0KHVuaXQpCi0gICAgaW50IHVuaXQ7Ci17Ci0gICAgZnNtICpmID0gJmlweGNwX2ZzbVt1bml0XTsKLQotICAgIGYtPnVuaXQJID0gdW5pdDsKLSAgICBmLT5wcm90b2NvbAkgPSBQUFBfSVBYQ1A7Ci0gICAgZi0+Y2FsbGJhY2tzID0gJmlweGNwX2NhbGxiYWNrczsKLSAgICBmc21faW5pdCgmaXB4Y3BfZnNtW3VuaXRdKTsKLQotICAgIG1lbXNldCAod28tPm5hbWUsCSAgMCwgc2l6ZW9mICh3by0+bmFtZSkpOwotICAgIG1lbXNldCAod28tPm91cl9ub2RlLCAwLCBzaXplb2YgKHdvLT5vdXJfbm9kZSkpOwotICAgIG1lbXNldCAod28tPmhpc19ub2RlLCAwLCBzaXplb2YgKHdvLT5oaXNfbm9kZSkpOwotCi0gICAgd28tPm5lZ19ubgkgICAgICAgPSAxOwotICAgIHdvLT5uZWdfY29tcGxldGUgICA9IDE7Ci0gICAgd28tPm5ldHdvcmsJICAgICAgID0gMDsKLQotICAgIGFvLT5uZWdfbm9kZSAgICAgICA9IDE7Ci0gICAgYW8tPm5lZ19ubgkgICAgICAgPSAxOwotICAgIGFvLT5uZWdfbmFtZSAgICAgICA9IDE7Ci0gICAgYW8tPm5lZ19jb21wbGV0ZSAgID0gMTsKLSAgICBhby0+bmVnX3JvdXRlciAgICAgPSAxOwotCi0gICAgYW8tPmFjY2VwdF9sb2NhbCAgID0gMDsKLSAgICBhby0+YWNjZXB0X3JlbW90ZSAgPSAwOwotICAgIGFvLT5hY2NlcHRfbmV0d29yayA9IDA7Ci0KLSAgICB3by0+dHJpZWRfcmlwICAgICAgPSAwOwotICAgIHdvLT50cmllZF9ubHNwICAgICA9IDA7Ci19Ci0KLS8qCi0gKiBDb3B5IHRoZSBub2RlIG51bWJlcgotICovCi0KLXN0YXRpYyB2b2lkCi1jb3B5X25vZGUgKHNyYywgZHN0KQotdV9jaGFyICpzcmMsICpkc3Q7Ci17Ci0gICAgbWVtY3B5IChkc3QsIHNyYywgc2l6ZW9mIChpcHhjcF93YW50b3B0aW9uc1swXS5vdXJfbm9kZSkpOwotfQotCi0vKgotICogQ29tcGFyZSBub2RlIG51bWJlcnMKLSAqLwotCi1zdGF0aWMgaW50Ci1jb21wYXJlX25vZGUgKHNyYywgZHN0KQotdV9jaGFyICpzcmMsICpkc3Q7Ci17Ci0gICAgcmV0dXJuIG1lbWNtcCAoZHN0LCBzcmMsIHNpemVvZiAoaXB4Y3Bfd2FudG9wdGlvbnNbMF0ub3VyX25vZGUpKSA9PSAwOwotfQotCi0vKgotICogSXMgdGhlIG5vZGUgbnVtYmVyIHplcm8/Ci0gKi8KLQotc3RhdGljIGludAotemVyb19ub2RlIChub2RlKQotdV9jaGFyICpub2RlOwotewotICAgIGludCBpbmR4OwotICAgIGZvciAoaW5keCA9IDA7IGluZHggPCBzaXplb2YgKGlweGNwX3dhbnRvcHRpb25zWzBdLm91cl9ub2RlKTsgKytpbmR4KQotCWlmIChub2RlIFtpbmR4XSAhPSAwKQotCSAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gMTsKLX0KLQotLyoKLSAqIEluY3JlbWVudCB0aGUgbm9kZSBudW1iZXIKLSAqLwotCi1zdGF0aWMgdm9pZAotaW5jX25vZGUgKG5vZGUpCi11X2NoYXIgKm5vZGU7Ci17Ci0gICAgdV9jaGFyICAgKm91dHA7Ci0gICAgdV9pbnQzMl90IG1hZ2ljX251bTsKLQotICAgIG91dHAgICAgICA9IG5vZGU7Ci0gICAgbWFnaWNfbnVtID0gbWFnaWMoKTsKLSAgICAqb3V0cCsrICAgPSAnXDAnOwotICAgICpvdXRwKysgICA9ICdcMCc7Ci0gICAgUFVUTE9ORyAobWFnaWNfbnVtLCBvdXRwKTsKLX0KLQotLyoKLSAqIGlweGNwX29wZW4gLSBJUFhDUCBpcyBhbGxvd2VkIHRvIGNvbWUgdXAuCi0gKi8KLXN0YXRpYyB2b2lkCi1pcHhjcF9vcGVuKHVuaXQpCi0gICAgaW50IHVuaXQ7Ci17Ci0gICAgZnNtX29wZW4oJmlweGNwX2ZzbVt1bml0XSk7Ci19Ci0KLS8qCi0gKiBpcHhjcF9jbG9zZSAtIFRha2UgSVBYQ1AgZG93bi4KLSAqLwotc3RhdGljIHZvaWQKLWlweGNwX2Nsb3NlKHVuaXQsIHJlYXNvbikKLSAgICBpbnQgdW5pdDsKLSAgICBjaGFyICpyZWFzb247Ci17Ci0gICAgZnNtX2Nsb3NlKCZpcHhjcF9mc21bdW5pdF0sIHJlYXNvbik7Ci19Ci0KLQotLyoKLSAqIGlweGNwX2xvd2VydXAgLSBUaGUgbG93ZXIgbGF5ZXIgaXMgdXAuCi0gKi8KLXN0YXRpYyB2b2lkCi1pcHhjcF9sb3dlcnVwKHVuaXQpCi0gICAgaW50IHVuaXQ7Ci17Ci0gICAgZnNtX2xvd2VydXAoJmlweGNwX2ZzbVt1bml0XSk7Ci19Ci0KLQotLyoKLSAqIGlweGNwX2xvd2VyZG93biAtIFRoZSBsb3dlciBsYXllciBpcyBkb3duLgotICovCi1zdGF0aWMgdm9pZAotaXB4Y3BfbG93ZXJkb3duKHVuaXQpCi0gICAgaW50IHVuaXQ7Ci17Ci0gICAgZnNtX2xvd2VyZG93bigmaXB4Y3BfZnNtW3VuaXRdKTsKLX0KLQotCi0vKgotICogaXB4Y3BfaW5wdXQgLSBJbnB1dCBJUFhDUCBwYWNrZXQuCi0gKi8KLXN0YXRpYyB2b2lkCi1pcHhjcF9pbnB1dCh1bml0LCBwLCBsZW4pCi0gICAgaW50IHVuaXQ7Ci0gICAgdV9jaGFyICpwOwotICAgIGludCBsZW47Ci17Ci0gICAgZnNtX2lucHV0KCZpcHhjcF9mc21bdW5pdF0sIHAsIGxlbik7Ci19Ci0KLQotLyoKLSAqIGlweGNwX3Byb3RyZWogLSBBIFByb3RvY29sLVJlamVjdCB3YXMgcmVjZWl2ZWQgZm9yIElQWENQLgotICoKLSAqIFByZXRlbmQgdGhlIGxvd2VyIGxheWVyIHdlbnQgZG93biwgc28gd2Ugc2h1dCB1cC4KLSAqLwotc3RhdGljIHZvaWQKLWlweGNwX3Byb3RyZWoodW5pdCkKLSAgICBpbnQgdW5pdDsKLXsKLSAgICBmc21fbG93ZXJkb3duKCZpcHhjcF9mc21bdW5pdF0pOwotfQotCi0KLS8qCi0gKiBpcHhjcF9yZXNldGNpIC0gUmVzZXQgb3VyIENJLgotICovCi1zdGF0aWMgdm9pZAotaXB4Y3BfcmVzZXRjaShmKQotICAgIGZzbSAqZjsKLXsKLSAgICB3by0+cmVxX25vZGUgPSB3by0+bmVnX25vZGUgJiYgYW8tPm5lZ19ub2RlOwotICAgIHdvLT5yZXFfbm4JID0gd28tPm5lZ19ubgkmJiBhby0+bmVnX25uOwotCi0gICAgaWYgKHdvLT5vdXJfbmV0d29yayA9PSAwKSB7Ci0Jd28tPm5lZ19ub2RlCSAgID0gMTsKLQlhby0+YWNjZXB0X25ldHdvcmsgPSAxOwotICAgIH0KLS8qCi0gKiBJZiBvdXIgbm9kZSBudW1iZXIgaXMgemVybyB0aGVuIGNoYW5nZSBpdC4KLSAqLwotICAgIGlmICh6ZXJvX25vZGUgKHdvLT5vdXJfbm9kZSkpIHsKLQlpbmNfbm9kZSAod28tPm91cl9ub2RlKTsKLQlhby0+YWNjZXB0X2xvY2FsID0gMTsKLQl3by0+bmVnX25vZGUJID0gMTsKLSAgICB9Ci0vKgotICogSWYgaGlzIG5vZGUgbnVtYmVyIGlzIHplcm8gdGhlbiBjaGFuZ2UgaXQuCi0gKi8KLSAgICBpZiAoemVyb19ub2RlICh3by0+aGlzX25vZGUpKSB7Ci0JaW5jX25vZGUgKHdvLT5oaXNfbm9kZSk7Ci0JYW8tPmFjY2VwdF9yZW1vdGUgPSAxOwotICAgIH0KLS8qCi0gKiBJZiBubyByb3V0aW5nIGFnZW50IHdhcyBzcGVjaWZpZWQgdGhlbiB3ZSBkbyBSSVAvU0FQIGFjY29yZGluZyB0byB0aGUKLSAqIFJGQyBkb2N1bWVudHMuIElmIHlvdSBoYXZlIHNwZWNpZmllZCBzb21ldGhpbmcgdGhlbiBPSy4gT3RoZXJ3aXNlLCB3ZQotICogZG8gUklQL1NBUC4KLSAqLwotICAgIGlmIChhby0+cm91dGVyID09IDApIHsKLQlhby0+cm91dGVyIHw9IEJJVChSSVBfU0FQKTsKLQl3by0+cm91dGVyIHw9IEJJVChSSVBfU0FQKTsKLSAgICB9Ci0KLSAgICAvKiBBbHdheXMgc3BlY2lmeSBhIHJvdXRpbmcgcHJvdG9jb2wgdW5sZXNzIGl0IHdhcyBSRUplY3RlZC4gKi8KLSAgICB3by0+bmVnX3JvdXRlciA9IDE7Ci0vKgotICogU3RhcnQgd2l0aCB0aGVzZSBkZWZhdWx0IHZhbHVlcwotICovCi0gICAgKmdvID0gKndvOwotfQotCi0vKgotICogaXB4Y3BfY2lsZW4gLSBSZXR1cm4gbGVuZ3RoIG9mIG91ciBDSS4KLSAqLwotCi1zdGF0aWMgaW50Ci1pcHhjcF9jaWxlbihmKQotICAgIGZzbSAqZjsKLXsKLSAgICBpbnQgbGVuOwotCi0gICAgbGVuCSA9IGdvLT5uZWdfbm4JICAgID8gQ0lMRU5fTkVUTiAgICAgOiAwOwotICAgIGxlbiArPSBnby0+bmVnX25vZGUJICAgID8gQ0lMRU5fTk9ERU4gICAgOiAwOwotICAgIGxlbiArPSBnby0+bmVnX25hbWUJICAgID8gQ0lMRU5fTkFNRSArIHN0cmxlbiAoKGNoYXIgKilnby0+bmFtZSkgLSAxIDogMDsKLQotICAgIC8qIFJGQyBzYXlzIHRoYXQgZGVmYXVsdHMgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZC4gKi8KLSAgICBpZiAoZ28tPm5lZ19yb3V0ZXIgJiYgdG9fZXh0ZXJuYWwoZ28tPnJvdXRlcikgIT0gUklQX1NBUCkKLSAgICAgICAgbGVuICs9IENJTEVOX1BST1RPQ09MOwotCi0gICAgcmV0dXJuIChsZW4pOwotfQotCi0KLS8qCi0gKiBpcHhjcF9hZGRjaSAtIEFkZCBvdXIgZGVzaXJlZCBDSXMgdG8gYSBwYWNrZXQuCi0gKi8KLXN0YXRpYyB2b2lkCi1pcHhjcF9hZGRjaShmLCB1Y3AsIGxlbnApCi0gICAgZnNtICpmOwotICAgIHVfY2hhciAqdWNwOwotICAgIGludCAqbGVucDsKLXsKLS8qCi0gKiBBZGQgdGhlIG9wdGlvbnMgdG8gdGhlIHJlY29yZC4KLSAqLwotICAgIGlmIChnby0+bmVnX25uKSB7Ci0JUFVUQ0hBUiAoSVBYX05FVFdPUktfTlVNQkVSLCB1Y3ApOwotCVBVVENIQVIgKENJTEVOX05FVE4sIHVjcCk7Ci0JUFVUTE9ORyAoZ28tPm91cl9uZXR3b3JrLCB1Y3ApOwotICAgIH0KLQotICAgIGlmIChnby0+bmVnX25vZGUpIHsKLQlpbnQgaW5keDsKLQlQVVRDSEFSIChJUFhfTk9ERV9OVU1CRVIsIHVjcCk7Ci0JUFVUQ0hBUiAoQ0lMRU5fTk9ERU4sIHVjcCk7Ci0JZm9yIChpbmR4ID0gMDsgaW5keCA8IHNpemVvZiAoZ28tPm91cl9ub2RlKTsgKytpbmR4KQotCSAgICBQVVRDSEFSIChnby0+b3VyX25vZGVbaW5keF0sIHVjcCk7Ci0gICAgfQotCi0gICAgaWYgKGdvLT5uZWdfbmFtZSkgewotCSAgICBpbnQgY2lsZW4gPSBzdHJsZW4gKChjaGFyICopZ28tPm5hbWUpOwotCWludCBpbmR4OwotCVBVVENIQVIgKElQWF9ST1VURVJfTkFNRSwgdWNwKTsKLQlQVVRDSEFSIChDSUxFTl9OQU1FICsgY2lsZW4gLSAxLCB1Y3ApOwotCWZvciAoaW5keCA9IDA7IGluZHggPCBjaWxlbjsgKytpbmR4KQotCSAgICBQVVRDSEFSIChnby0+bmFtZSBbaW5keF0sIHVjcCk7Ci0gICAgfQotCi0gICAgaWYgKGdvLT5uZWdfcm91dGVyKSB7Ci0gICAgICAgIHNob3J0IGV4dGVybmFsID0gdG9fZXh0ZXJuYWwgKGdvLT5yb3V0ZXIpOwotCWlmIChleHRlcm5hbCAhPSBSSVBfU0FQKSB7Ci0JICAgIFBVVENIQVIgIChJUFhfUk9VVEVSX1BST1RPQ09MLCB1Y3ApOwotCSAgICBQVVRDSEFSICAoQ0lMRU5fUFJPVE9DT0wsICAgICAgdWNwKTsKLQkgICAgUFVUU0hPUlQgKGV4dGVybmFsLCAgICAgICAgICAgIHVjcCk7Ci0JfQotICAgIH0KLX0KLQotLyoKLSAqIGlweGNwX2Fja2NpIC0gQWNrIG91ciBDSXMuCi0gKgotICogUmV0dXJuczoKLSAqCTAgLSBBY2sgd2FzIGJhZC4KLSAqCTEgLSBBY2sgd2FzIGdvb2QuCi0gKi8KLXN0YXRpYyBpbnQKLWlweGNwX2Fja2NpKGYsIHAsIGxlbikKLSAgICBmc20gKmY7Ci0gICAgdV9jaGFyICpwOwotICAgIGludCBsZW47Ci17Ci0gICAgdV9zaG9ydCBjaWxlbiwgY2l0eXBlLCBjaXNob3J0OwotICAgIHVfY2hhciBjaWNoYXI7Ci0gICAgdV9pbnQzMl90IGNpbG9uZzsKLQotI2RlZmluZSBBQ0tDSVZPSUQob3B0LCBuZWcpIFwKLSAgICBpZiAobmVnKSB7IFwKLQlpZiAoKGxlbiAtPSBDSUxFTl9WT0lEKSA8IDApIFwKLQkgICAgYnJlYWs7IFwKLQlHRVRDSEFSKGNpdHlwZSwgcCk7IFwKLQlHRVRDSEFSKGNpbGVuLCBwKTsgXAotCWlmIChjaWxlbiAhPSBDSUxFTl9WT0lEIHx8IFwKLQkgICAgY2l0eXBlICE9IG9wdCkgXAotCSAgICBicmVhazsgXAotICAgIH0KLQotI2RlZmluZSBBQ0tDSUNPTVBMRVRFKG9wdCxuZWcpCUFDS0NJVk9JRChvcHQsIG5lZykKLQotI2RlZmluZSBBQ0tDSUNIQVJTKG9wdCwgbmVnLCB2YWwsIGNudCkgXAotICAgIGlmIChuZWcpIHsgXAotCWludCBpbmR4LCBjb3VudCA9IGNudDsgXAotCWxlbiAtPSAoY291bnQgKyAyKTsgXAotCWlmIChsZW4gPCAwKSBcCi0JICAgIGJyZWFrOyBcCi0JR0VUQ0hBUihjaXR5cGUsIHApOyBcCi0JR0VUQ0hBUihjaWxlbiwgcCk7IFwKLQlpZiAoY2lsZW4gIT0gKGNvdW50ICsgMikgfHwgXAotCSAgICBjaXR5cGUgIT0gb3B0KSBcCi0JICAgIGJyZWFrOyBcCi0JZm9yIChpbmR4ID0gMDsgaW5keCA8IGNvdW50OyArK2luZHgpIHtcCi0JICAgIEdFVENIQVIoY2ljaGFyLCBwKTsgXAotCSAgICBpZiAoY2ljaGFyICE9ICgodV9jaGFyICopICZ2YWwpW2luZHhdKSBcCi0JICAgICAgIGJyZWFrOyBcCi0JfVwKLQlpZiAoaW5keCAhPSBjb3VudCkgXAotCSAgICBicmVhazsgXAotICAgIH0KLQotI2RlZmluZSBBQ0tDSU5PREUob3B0LG5lZyx2YWwpIEFDS0NJQ0hBUlMob3B0LG5lZyx2YWwsc2l6ZW9mKHZhbCkpCi0jZGVmaW5lIEFDS0NJTkFNRShvcHQsbmVnLHZhbCkgQUNLQ0lDSEFSUyhvcHQsbmVnLHZhbCxzdHJsZW4oKGNoYXIgKil2YWwpKQotCi0jZGVmaW5lIEFDS0NJTkVUV09SSyhvcHQsIG5lZywgdmFsKSBcCi0gICAgaWYgKG5lZykgeyBcCi0JaWYgKChsZW4gLT0gQ0lMRU5fTkVUTikgPCAwKSBcCi0JICAgIGJyZWFrOyBcCi0JR0VUQ0hBUihjaXR5cGUsIHApOyBcCi0JR0VUQ0hBUihjaWxlbiwgcCk7IFwKLQlpZiAoY2lsZW4gIT0gQ0lMRU5fTkVUTiB8fCBcCi0JICAgIGNpdHlwZSAhPSBvcHQpIFwKLQkgICAgYnJlYWs7IFwKLQlHRVRMT05HKGNpbG9uZywgcCk7IFwKLQlpZiAoY2lsb25nICE9IHZhbCkgXAotCSAgICBicmVhazsgXAotICAgIH0KLQotI2RlZmluZSBBQ0tDSVBST1RPKG9wdCwgbmVnLCB2YWwpIFwKLSAgICBpZiAobmVnKSB7IFwKLQlpZiAobGVuIDwgMikgXAotCSAgICBicmVhazsgXAotCUdFVENIQVIoY2l0eXBlLCBwKTsgXAotCUdFVENIQVIoY2lsZW4sIHApOyBcCi0JaWYgKGNpbGVuICE9IENJTEVOX1BST1RPQ09MIHx8IGNpdHlwZSAhPSBvcHQpIFwKLQkgICAgYnJlYWs7IFwKLQlsZW4gLT0gY2lsZW47IFwKLQlpZiAobGVuIDwgMCkgXAotCSAgICBicmVhazsgXAotCUdFVFNIT1JUKGNpc2hvcnQsIHApOyBcCi0JaWYgKGNpc2hvcnQgIT0gdG9fZXh0ZXJuYWwgKHZhbCkgfHwgY2lzaG9ydCA9PSBSSVBfU0FQKSBcCi0JICAgIGJyZWFrOyBcCi0gICAgICB9Ci0vKgotICogUHJvY2VzcyB0aGUgQUNLIGZyYW1lIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZnJhbWUgd2FzIGFzc2VtYmxlZAotICovCi0gICAgZG8gewotCUFDS0NJTkVUV09SSyAgKElQWF9ORVRXT1JLX05VTUJFUiwgIGdvLT5uZWdfbm4sCSAgICBnby0+b3VyX25ldHdvcmspOwotCUFDS0NJTk9ERSAgICAgKElQWF9OT0RFX05VTUJFUiwJICAgIGdvLT5uZWdfbm9kZSwgICBnby0+b3VyX25vZGUpOwotCUFDS0NJTkFNRSAgICAgKElQWF9ST1VURVJfTkFNRSwJICAgIGdvLT5uZWdfbmFtZSwgICBnby0+bmFtZSk7Ci0JaWYgKGxlbiA+IDApCi0JCUFDS0NJUFJPVE8gICAgKElQWF9ST1VURVJfUFJPVE9DT0wsIGdvLT5uZWdfcm91dGVyLCBnby0+cm91dGVyKTsKLS8qCi0gKiBUaGlzIGlzIHRoZSBlbmQgb2YgdGhlIHJlY29yZC4KLSAqLwotCWlmIChsZW4gPT0gMCkKLQkgICAgcmV0dXJuICgxKTsKLSAgICB9IHdoaWxlICgwKTsKLS8qCi0gKiBUaGUgZnJhbWUgaXMgaW52YWxpZAotICovCi0gICAgSVBYQ1BERUJVRygoImlweGNwX2Fja2NpOiByZWNlaXZlZCBiYWQgQWNrISIpKTsKLSAgICByZXR1cm4gKDApOwotfQotCi0vKgotICogaXB4Y3BfbmFrY2kgLSBQZWVyIGhhcyBzZW50IGEgTkFLIGZvciBzb21lIG9mIG91ciBDSXMuCi0gKiBUaGlzIHNob3VsZCBub3QgbW9kaWZ5IGFueSBzdGF0ZSBpZiB0aGUgTmFrIGlzIGJhZAotICogb3IgaWYgSVBYQ1AgaXMgaW4gdGhlIE9QRU5FRCBzdGF0ZS4KLSAqCi0gKiBSZXR1cm5zOgotICoJMCAtIE5hayB3YXMgYmFkLgotICoJMSAtIE5hayB3YXMgZ29vZC4KLSAqLwotCi1zdGF0aWMgaW50Ci1pcHhjcF9uYWtjaShmLCBwLCBsZW4sIHRyZWF0X2FzX3JlamVjdCkKLSAgICBmc20gKmY7Ci0gICAgdV9jaGFyICpwOwotICAgIGludCBsZW47Ci0gICAgaW50IHRyZWF0X2FzX3JlamVjdDsKLXsKLSAgICB1X2NoYXIgY2l0eXBlLCBjaWxlbiwgKm5leHQ7Ci0gICAgdV9zaG9ydCBzOwotICAgIHVfaW50MzJfdCBsOwotICAgIGlweGNwX29wdGlvbnMgbm87CQkvKiBvcHRpb25zIHdlJ3ZlIHNlZW4gTmFrcyBmb3IgKi8KLSAgICBpcHhjcF9vcHRpb25zIHRyeTsJCS8qIG9wdGlvbnMgdG8gcmVxdWVzdCBuZXh0IHRpbWUgKi8KLQotICAgIEJaRVJPKCZubywgc2l6ZW9mKG5vKSk7Ci0gICAgdHJ5ID0gKmdvOwotCi0gICAgd2hpbGUgKGxlbiA+PSBDSUxFTl9WT0lEKSB7Ci0JR0VUQ0hBUiAoY2l0eXBlLCBwKTsKLQlHRVRDSEFSIChjaWxlbiwJIHApOwotCWxlbiAtPSBjaWxlbjsKLQlpZiAoY2lsZW4gPCBDSUxFTl9WT0lEIHx8IGxlbiA8IDApCi0JICAgIGdvdG8gYmFkOwotCW5leHQgPSAmcCBbY2lsZW4gLSBDSUxFTl9WT0lEXTsKLQotCXN3aXRjaCAoY2l0eXBlKSB7Ci0JY2FzZSBJUFhfTkVUV09SS19OVU1CRVI6Ci0JICAgIGlmICghZ28tPm5lZ19ubiB8fCBuby5uZWdfbm4gfHwgKGNpbGVuICE9IENJTEVOX05FVE4pKQotCQlnb3RvIGJhZDsKLQkgICAgbm8ubmVnX25uID0gMTsKLQotCSAgICBHRVRMT05HKGwsIHApOwotCSAgICBpZiAodHJlYXRfYXNfcmVqZWN0KQotCQl0cnkubmVnX25uID0gMDsKLQkgICAgZWxzZSBpZiAobCAmJiBhby0+YWNjZXB0X25ldHdvcmspCi0JCXRyeS5vdXJfbmV0d29yayA9IGw7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBJUFhfTk9ERV9OVU1CRVI6Ci0JICAgIGlmICghZ28tPm5lZ19ub2RlIHx8IG5vLm5lZ19ub2RlIHx8IChjaWxlbiAhPSBDSUxFTl9OT0RFTikpCi0JCWdvdG8gYmFkOwotCSAgICBuby5uZWdfbm9kZSA9IDE7Ci0KLQkgICAgaWYgKHRyZWF0X2FzX3JlamVjdCkKLQkJdHJ5Lm5lZ19ub2RlID0gMDsKLQkgICAgZWxzZSBpZiAoIXplcm9fbm9kZSAocCkgJiYgYW8tPmFjY2VwdF9sb2NhbCAmJgotCQkgICAgICEgY29tcGFyZV9ub2RlIChwLCBoby0+aGlzX25vZGUpKQotCQljb3B5X25vZGUgKHAsIHRyeS5vdXJfbm9kZSk7Ci0JICAgIGJyZWFrOwotCi0JICAgIC8qIFRoaXMgaGFzIG5ldmVyIGJlZW4gc2VudC4gSWdub3JlIHRoZSBOQUsgZnJhbWUgKi8KLQljYXNlIElQWF9DT01QUkVTU0lPTl9QUk9UT0NPTDoKLQkgICAgZ290byBiYWQ7Ci0KLQljYXNlIElQWF9ST1VURVJfUFJPVE9DT0w6Ci0JICAgIGlmICghZ28tPm5lZ19yb3V0ZXIgfHwgKGNpbGVuIDwgQ0lMRU5fUFJPVE9DT0wpKQotCQlnb3RvIGJhZDsKLQotCSAgICBHRVRTSE9SVCAocywgcCk7Ci0JICAgIGlmIChzID4gMTUpICAgICAgICAgLyogVGhpcyBpcyBqdXN0IGJhZCwgYnV0IGlnbm9yZSBmb3Igbm93LiAqLwotCSAgICAgICAgYnJlYWs7Ci0KLQkgICAgcyA9IEJJVChzKTsKLQkgICAgaWYgKG5vLnJvdXRlciAmIHMpICAvKiBkdXBsaWNhdGUgTkFLcyBhcmUgYWx3YXlzIGJhZCAqLwotCQlnb3RvIGJhZDsKLQotCSAgICBpZiAobm8ucm91dGVyID09IDApIC8qIFJlc2V0IG9uIGZpcnN0IE5BSyBvbmx5ICovCi0JCXRyeS5yb3V0ZXIgPSAwOwotCi0JICAgIG5vLnJvdXRlciAgICAgIHw9IHM7Ci0JICAgIHRyeS5yb3V0ZXIgICAgIHw9IHM7Ci0JICAgIHRyeS5uZWdfcm91dGVyICA9IDE7Ci0JICAgIGJyZWFrOwotCi0JICAgIC8qIFRoZXNlLCBhY2NvcmRpbmcgdG8gdGhlIFJGQywgbXVzdCBuZXZlciBiZSBOQUtlZC4gKi8KLQljYXNlIElQWF9ST1VURVJfTkFNRToKLQljYXNlIElQWF9DT01QTEVURToKLQkgICAgZ290byBiYWQ7Ci0KLQkgICAgLyogVGhlc2UgYXJlIGZvciBvcHRpb25zIHdoaWNoIHdlIGhhdmUgbm90IHNlZW4uICovCi0JZGVmYXVsdDoKLQkgICAgYnJlYWs7Ci0JfQotCXAgPSBuZXh0OwotICAgIH0KLQotICAgIC8qCi0gICAgICogRG8gbm90IHBlcm1pdCB0aGUgcGVlciB0byBmb3JjZSBhIHJvdXRlciBwcm90b2NvbCB3aGljaCB3ZSBkbyBub3QKLSAgICAgKiBzdXBwb3J0LiBIb3dldmVyLCBkZWZhdWx0IHRvIHRoZSBjb25kaXRpb24gdGhhdCB3aWxsIGFjY2VwdCAiTk9ORSIuCi0gICAgICovCi0gICAgdHJ5LnJvdXRlciAmPSAoYW8tPnJvdXRlciB8IEJJVChJUFhfTk9ORSkpOwotICAgIGlmICh0cnkucm91dGVyID09IDAgJiYgYW8tPnJvdXRlciAhPSAwKQotCXRyeS5yb3V0ZXIgPSBCSVQoSVBYX05PTkUpOwotCi0gICAgaWYgKHRyeS5yb3V0ZXIgIT0gMCkKLSAgICAgICAgdHJ5Lm5lZ19yb3V0ZXIgPSAxOwotICAgIAotICAgIC8qCi0gICAgICogT0ssIHRoZSBOYWsgaXMgZ29vZC4gIE5vdyB3ZSBjYW4gdXBkYXRlIHN0YXRlLgotICAgICAqIElmIHRoZXJlIGFyZSBhbnkgb3B0aW9ucyBsZWZ0LCB3ZSBpZ25vcmUgdGhlbS4KLSAgICAgKi8KLSAgICBpZiAoZi0+c3RhdGUgIT0gT1BFTkVEKQotCSpnbyA9IHRyeTsKLQotICAgIHJldHVybiAxOwotCi1iYWQ6Ci0gICAgSVBYQ1BERUJVRygoImlweGNwX25ha2NpOiByZWNlaXZlZCBiYWQgTmFrISIpKTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIGlweGNwX3JlamNpIC0gUmVqZWN0IHNvbWUgb2Ygb3VyIENJcy4KLSAqLwotc3RhdGljIGludAotaXB4Y3BfcmVqY2koZiwgcCwgbGVuKQotICAgIGZzbSAqZjsKLSAgICB1X2NoYXIgKnA7Ci0gICAgaW50IGxlbjsKLXsKLSAgICB1X3Nob3J0IGNpbGVuLCBjaXR5cGUsIGNpc2hvcnQ7Ci0gICAgdV9jaGFyIGNpY2hhcjsKLSAgICB1X2ludDMyX3QgY2lsb25nOwotICAgIGlweGNwX29wdGlvbnMgdHJ5OwkJLyogb3B0aW9ucyB0byByZXF1ZXN0IG5leHQgdGltZSAqLwotCi0jZGVmaW5lIFJFSkNJTkVUV09SSyhvcHQsIG5lZywgdmFsKSBcCi0gICAgaWYgKG5lZyAmJiBwWzBdID09IG9wdCkgeyBcCi0JaWYgKChsZW4gLT0gQ0lMRU5fTkVUTikgPCAwKSBcCi0JICAgIGJyZWFrOyBcCi0JR0VUQ0hBUihjaXR5cGUsIHApOyBcCi0JR0VUQ0hBUihjaWxlbiwgcCk7IFwKLQlpZiAoY2lsZW4gIT0gQ0lMRU5fTkVUTiB8fCBcCi0JICAgIGNpdHlwZSAhPSBvcHQpIFwKLQkgICAgYnJlYWs7IFwKLQlHRVRMT05HKGNpbG9uZywgcCk7IFwKLQlpZiAoY2lsb25nICE9IHZhbCkgXAotCSAgICBicmVhazsgXAotCW5lZyA9IDA7IFwKLSAgICB9Ci0KLSNkZWZpbmUgUkVKQ0lDSEFSUyhvcHQsIG5lZywgdmFsLCBjbnQpIFwKLSAgICBpZiAobmVnICYmIHBbMF0gPT0gb3B0KSB7IFwKLQlpbnQgaW5keCwgY291bnQgPSBjbnQ7IFwKLQlsZW4gLT0gKGNvdW50ICsgMik7IFwKLQlpZiAobGVuIDwgMCkgXAotCSAgICBicmVhazsgXAotCUdFVENIQVIoY2l0eXBlLCBwKTsgXAotCUdFVENIQVIoY2lsZW4sIHApOyBcCi0JaWYgKGNpbGVuICE9IChjb3VudCArIDIpIHx8IFwKLQkgICAgY2l0eXBlICE9IG9wdCkgXAotCSAgICBicmVhazsgXAotCWZvciAoaW5keCA9IDA7IGluZHggPCBjb3VudDsgKytpbmR4KSB7XAotCSAgICBHRVRDSEFSKGNpY2hhciwgcCk7IFwKLQkgICAgaWYgKGNpY2hhciAhPSAoKHVfY2hhciAqKSAmdmFsKVtpbmR4XSkgXAotCSAgICAgICBicmVhazsgXAotCX1cCi0JaWYgKGluZHggIT0gY291bnQpIFwKLQkgICAgYnJlYWs7IFwKLQluZWcgPSAwOyBcCi0gICAgfQotCi0jZGVmaW5lIFJFSkNJTk9ERShvcHQsbmVnLHZhbCkgUkVKQ0lDSEFSUyhvcHQsbmVnLHZhbCxzaXplb2YodmFsKSkKLSNkZWZpbmUgUkVKQ0lOQU1FKG9wdCxuZWcsdmFsKSBSRUpDSUNIQVJTKG9wdCxuZWcsdmFsLHN0cmxlbigoY2hhciAqKXZhbCkpCi0KLSNkZWZpbmUgUkVKQ0lWT0lEKG9wdCwgbmVnKSBcCi0gICAgaWYgKG5lZyAmJiBwWzBdID09IG9wdCkgeyBcCi0JaWYgKChsZW4gLT0gQ0lMRU5fVk9JRCkgPCAwKSBcCi0JICAgIGJyZWFrOyBcCi0JR0VUQ0hBUihjaXR5cGUsIHApOyBcCi0JR0VUQ0hBUihjaWxlbiwgcCk7IFwKLQlpZiAoY2lsZW4gIT0gQ0lMRU5fVk9JRCB8fCBjaXR5cGUgIT0gb3B0KSBcCi0JICAgIGJyZWFrOyBcCi0JbmVnID0gMDsgXAotICAgIH0KLQotLyogYSByZWplY3QgZm9yIFJJUC9TQVAgaXMgaW52YWxpZCBzaW5jZSB3ZSBkb24ndCBzZW5kIGl0IGFuZCB5b3UgY2FuJ3QKLSAgIHJlamVjdCBzb21ldGhpbmcgd2hpY2ggaXMgbm90IHNlbnQuIChZb3UgY2FuIE5BSywgYnV0IHlvdSBjYW4ndCBSRUouKSAqLwotI2RlZmluZSBSRUpDSVBST1RPKG9wdCwgbmVnLCB2YWwsIGJpdCkgXAotICAgIGlmIChuZWcgJiYgcFswXSA9PSBvcHQpIHsgXAotCWlmICgobGVuIC09IENJTEVOX1BST1RPQ09MKSA8IDApIFwKLQkgICAgYnJlYWs7IFwKLQlHRVRDSEFSKGNpdHlwZSwgcCk7IFwKLQlHRVRDSEFSKGNpbGVuLCBwKTsgXAotCWlmIChjaWxlbiAhPSBDSUxFTl9QUk9UT0NPTCkgXAotCSAgICBicmVhazsgXAotCUdFVFNIT1JUKGNpc2hvcnQsIHApOyBcCi0JaWYgKGNpc2hvcnQgIT0gdG9fZXh0ZXJuYWwgKHZhbCkgfHwgY2lzaG9ydCA9PSBSSVBfU0FQKSBcCi0JICAgIGJyZWFrOyBcCi0JbmVnID0gMDsgXAotICAgIH0KLS8qCi0gKiBBbnkgUmVqZWN0ZWQgQ0lzIG11c3QgYmUgaW4gZXhhY3RseSB0aGUgc2FtZSBvcmRlciB0aGF0IHdlIHNlbnQuCi0gKiBDaGVjayBwYWNrZXQgbGVuZ3RoIGFuZCBDSSBsZW5ndGggYXQgZWFjaCBzdGVwLgotICogSWYgd2UgZmluZCBhbnkgZGV2aWF0aW9ucywgdGhlbiB0aGlzIHBhY2tldCBpcyBiYWQuCi0gKi8KLSAgICB0cnkgPSAqZ287Ci0KLSAgICBkbyB7Ci0JUkVKQ0lORVRXT1JLIChJUFhfTkVUV09SS19OVU1CRVIsICB0cnkubmVnX25uLAkgICB0cnkub3VyX25ldHdvcmspOwotCVJFSkNJTk9ERSAgICAoSVBYX05PREVfTlVNQkVSLAkgICB0cnkubmVnX25vZGUsICAgdHJ5Lm91cl9ub2RlKTsKLQlSRUpDSU5BTUUgICAgKElQWF9ST1VURVJfTkFNRSwJICAgdHJ5Lm5lZ19uYW1lLCAgIHRyeS5uYW1lKTsKLQlSRUpDSVBST1RPICAgKElQWF9ST1VURVJfUFJPVE9DT0wsIHRyeS5uZWdfcm91dGVyLCB0cnkucm91dGVyLCAwKTsKLS8qCi0gKiBUaGlzIGlzIHRoZSBlbmQgb2YgdGhlIHJlY29yZC4KLSAqLwotCWlmIChsZW4gPT0gMCkgewotCSAgICBpZiAoZi0+c3RhdGUgIT0gT1BFTkVEKQotCQkqZ28gPSB0cnk7Ci0JICAgIHJldHVybiAoMSk7Ci0JfQotICAgIH0gd2hpbGUgKDApOwotLyoKLSAqIFRoZSBmcmFtZSBpcyBpbnZhbGlkIGF0IHRoaXMgcG9pbnQuCi0gKi8KLSAgICBJUFhDUERFQlVHKCgiaXB4Y3BfcmVqY2k6IHJlY2VpdmVkIGJhZCBSZWplY3QhIikpOwotICAgIHJldHVybiAwOwotfQotCi0vKgotICogaXB4Y3BfcmVxY2kgLSBDaGVjayB0aGUgcGVlcidzIHJlcXVlc3RlZCBDSXMgYW5kIHNlbmQgYXBwcm9wcmlhdGUgcmVzcG9uc2UuCi0gKgotICogUmV0dXJuczogQ09ORkFDSywgQ09ORk5BSyBvciBDT05GUkVKIGFuZCBpbnB1dCBwYWNrZXQgbW9kaWZpZWQKLSAqIGFwcHJvcHJpYXRlbHkuICBJZiByZWplY3RfaWZfZGlzYWdyZWUgaXMgbm9uLXplcm8sIGRvZXNuJ3QgcmV0dXJuCi0gKiBDT05GTkFLOyByZXR1cm5zIENPTkZSRUogaWYgaXQgY2FuJ3QgcmV0dXJuIENPTkZBQ0suCi0gKi8KLXN0YXRpYyBpbnQKLWlweGNwX3JlcWNpKGYsIGlucCwgbGVuLCByZWplY3RfaWZfZGlzYWdyZWUpCi0gICAgZnNtICpmOwotICAgIHVfY2hhciAqaW5wOwkJLyogUmVxdWVzdGVkIENJcyAqLwotICAgIGludCAqbGVuOwkJCS8qIExlbmd0aCBvZiByZXF1ZXN0ZWQgQ0lzICovCi0gICAgaW50IHJlamVjdF9pZl9kaXNhZ3JlZTsKLXsKLSAgICB1X2NoYXIgKmNpcCwgKm5leHQ7CQkvKiBQb2ludGVyIHRvIGN1cnJlbnQgYW5kIG5leHQgQ0lzICovCi0gICAgdV9zaG9ydCBjaWxlbiwgY2l0eXBlOwkvKiBQYXJzZWQgbGVuLCB0eXBlICovCi0gICAgdV9zaG9ydCBjaXNob3J0OwkJLyogUGFyc2VkIHNob3J0IHZhbHVlICovCi0gICAgdV9pbnQzMl90IGNpbmV0d29yazsJLyogUGFyc2VkIGFkZHJlc3MgdmFsdWVzICovCi0gICAgaW50IHJjID0gQ09ORkFDSzsJCS8qIEZpbmFsIHBhY2tldCByZXR1cm4gY29kZSAqLwotICAgIGludCBvcmM7CQkJLyogSW5kaXZpZHVhbCBvcHRpb24gcmV0dXJuIGNvZGUgKi8KLSAgICB1X2NoYXIgKnA7CQkJLyogUG9pbnRlciB0byBuZXh0IGNoYXIgdG8gcGFyc2UgKi8KLSAgICB1X2NoYXIgKnVjcCA9IGlucDsJCS8qIFBvaW50ZXIgdG8gY3VycmVudCBvdXRwdXQgY2hhciAqLwotICAgIGludCBsID0gKmxlbjsJCS8qIExlbmd0aCBsZWZ0ICovCi0KLSAgICAvKgotICAgICAqIFJlc2V0IGFsbCBoaXMgb3B0aW9ucy4KLSAgICAgKi8KLSAgICBCWkVSTyhobywgc2l6ZW9mKCpobykpOwotICAgIAotICAgIC8qCi0gICAgICogUHJvY2VzcyBhbGwgaGlzIG9wdGlvbnMuCi0gICAgICovCi0gICAgbmV4dCA9IGlucDsKLSAgICB3aGlsZSAobCkgewotCW9yYyA9IENPTkZBQ0s7CQkJLyogQXNzdW1lIHN1Y2Nlc3MgKi8KLQljaXAgPSBwID0gbmV4dDsJCQkvKiBSZW1lbWJlciBiZWdpbmluZyBvZiBDSSAqLwotCWlmIChsIDwgMiB8fAkJCS8qIE5vdCBlbm91Z2ggZGF0YSBmb3IgQ0kgaGVhZGVyIG9yICovCi0JICAgIHBbMV0gPCAyIHx8CQkJLyogIENJIGxlbmd0aCB0b28gc21hbGwgb3IgKi8KLQkgICAgcFsxXSA+IGwpIHsJCQkvKiAgQ0kgbGVuZ3RoIHRvbyBiaWc/ICovCi0JICAgIElQWENQREVCVUcoKCJpcHhjcF9yZXFjaTogYmFkIENJIGxlbmd0aCEiKSk7Ci0JICAgIG9yYyA9IENPTkZSRUo7CQkvKiBSZWplY3QgYmFkIENJICovCi0JICAgIGNpbGVuID0gbDsJCQkvKiBSZWplY3QgdGlsbCBlbmQgb2YgcGFja2V0ICovCi0JICAgIGwgPSAwOwkJCS8qIERvbid0IGxvb3AgYWdhaW4gKi8KLQkgICAgZ290byBlbmRzd2l0Y2g7Ci0JfQotCUdFVENIQVIoY2l0eXBlLCBwKTsJCS8qIFBhcnNlIENJIHR5cGUgKi8KLQlHRVRDSEFSKGNpbGVuLCBwKTsJCS8qIFBhcnNlIENJIGxlbmd0aCAqLwotCWwgLT0gY2lsZW47CQkJLyogQWRqdXN0IHJlbWFpbmluZyBsZW5ndGggKi8KLQluZXh0ICs9IGNpbGVuOwkJCS8qIFN0ZXAgdG8gbmV4dCBDSSAqLwotCi0Jc3dpdGNoIChjaXR5cGUpIHsJCS8qIENoZWNrIENJIHR5cGUgKi8KLS8qCi0gKiBUaGUgbmV0d29yayBudW1iZXIgbXVzdCBtYXRjaC4gQ2hvb3NlIHRoZSBsYXJnZXIgb2YgdGhlIHR3by4KLSAqLwotCWNhc2UgSVBYX05FVFdPUktfTlVNQkVSOgotCSAgICAvKiBpZiB3ZSB3b250IG5lZ290aWF0ZSB0aGUgbmV0d29yayBudW1iZXIgb3IgdGhlIGxlbmd0aCBpcyB3cm9uZwotCSAgICAgICB0aGVuIHJlamVjdCB0aGUgb3B0aW9uICovCi0JICAgIGlmICggIWFvLT5uZWdfbm4gfHwgY2lsZW4gIT0gQ0lMRU5fTkVUTiApIHsKLQkJb3JjID0gQ09ORlJFSjsKLQkJYnJlYWs7CQkKLQkgICAgfQotCSAgICBHRVRMT05HKGNpbmV0d29yaywgcCk7Ci0KLQkgICAgLyogSWYgdGhlIG5ldHdvcmsgbnVtYmVycyBtYXRjaCB0aGVuIGFja25vd2xlZGdlIHRoZW0uICovCi0JICAgIGlmIChjaW5ldHdvcmsgIT0gMCkgewotCQloby0+aGlzX25ldHdvcmsgPSBjaW5ldHdvcms7Ci0JCWhvLT5uZWdfbm4JPSAxOwotCQlpZiAod28tPm91cl9uZXR3b3JrID09IGNpbmV0d29yaykKLQkJICAgIGJyZWFrOwotLyoKLSAqIElmIHRoZSBuZXR3b3JrIG51bWJlciBpcyBub3QgZ2l2ZW4gb3Igd2UgZG9uJ3QgYWNjZXB0IHRoZWlyIGNoYW5nZSBvcgotICogdGhlIG5ldHdvcmsgbnVtYmVyIGlzIHRvbyBzbWFsbCB0aGVuIE5BSyBpdC4KLSAqLwotCQlpZiAoISBhby0+YWNjZXB0X25ldHdvcmsgfHwgY2luZXR3b3JrIDwgd28tPm91cl9uZXR3b3JrKSB7Ci0JCSAgICBERUNQVFIgKHNpemVvZiAodV9pbnQzMl90KSwgcCk7Ci0JCSAgICBQVVRMT05HICh3by0+b3VyX25ldHdvcmssIHApOwotCQkgICAgb3JjID0gQ09ORk5BSzsKLQkJfQotCQlicmVhazsKLQkgICAgfQotLyoKLSAqIFRoZSBwZWVyIHNlbnQgJzAnIGZvciB0aGUgbmV0d29yay4gR2l2ZSBpdCBvdXJzIGlmIHdlIGhhdmUgb25lLgotICovCi0JICAgIGlmIChnby0+b3VyX25ldHdvcmsgIT0gMCkgewotCQlERUNQVFIgKHNpemVvZiAodV9pbnQzMl90KSwgcCk7Ci0JCVBVVExPTkcgKHdvLT5vdXJfbmV0d29yaywgcCk7Ci0JCW9yYyA9IENPTkZOQUs7Ci0vKgotICogV2UgZG9uJ3QgaGF2ZSBvbmUuIFJlamVjdCB0aGUgdmFsdWUuCi0gKi8KLQkgICAgfSBlbHNlCi0JCW9yYyA9IENPTkZSRUo7Ci0KLQkgICAgYnJlYWs7Ci0vKgotICogVGhlIG5vZGUgbnVtYmVyIGlzIHJlcXVpcmVkCi0gKi8KLQljYXNlIElQWF9OT0RFX05VTUJFUjoKLQkgICAgLyogaWYgd2Ugd29udCBuZWdvdGlhdGUgdGhlIG5vZGUgbnVtYmVyIG9yIHRoZSBsZW5ndGggaXMgd3JvbmcKLQkgICAgICAgdGhlbiByZWplY3QgdGhlIG9wdGlvbiAqLwotCSAgICBpZiAoIGNpbGVuICE9IENJTEVOX05PREVOICkgewotCQlvcmMgPSBDT05GUkVKOwotCQlicmVhazsKLQkgICAgfQotCi0JICAgIGNvcHlfbm9kZSAocCwgaG8tPmhpc19ub2RlKTsKLQkgICAgaG8tPm5lZ19ub2RlID0gMTsKLS8qCi0gKiBJZiB0aGUgcmVtb3RlIGRvZXMgbm90IGhhdmUgYSBudW1iZXIgYW5kIHdlIGRvIHRoZW4gTkFLIGl0IHdpdGggdGhlIHZhbHVlCi0gKiB3aGljaCB3ZSBoYXZlIGZvciBpdC4gKFdlIG5ldmVyIGhhdmUgYSBkZWZhdWx0IHZhbHVlIG9mIHplcm8uKQotICovCi0JICAgIGlmICh6ZXJvX25vZGUgKGhvLT5oaXNfbm9kZSkpIHsKLQkJb3JjID0gQ09ORk5BSzsKLQkJY29weV9ub2RlICh3by0+aGlzX25vZGUsIHApOwotCQlJTkNQVFIgKHNpemVvZiAod28tPmhpc19ub2RlKSwgcCk7Ci0JCWJyZWFrOwotCSAgICB9Ci0vKgotICogSWYgeW91IGhhdmUgZ2l2ZW4gbWUgdGhlIGV4cGVjdGVkIG5ldHdvcmsgbm9kZSBudW1iZXIgdGhlbiBJJ2xsIGFjY2VwdAotICogaXQgbm93LgotICovCi0JICAgIGlmIChjb21wYXJlX25vZGUgKHdvLT5oaXNfbm9kZSwgaG8tPmhpc19ub2RlKSkgewotCQlvcmMgPSBDT05GQUNLOwotCQloby0+bmVnX25vZGUgPSAxOwotCQlJTkNQVFIgKHNpemVvZiAod28tPmhpc19ub2RlKSwgcCk7Ci0JCWJyZWFrOwotCSAgICB9Ci0vKgotICogSWYgaGlzIG5vZGUgbnVtYmVyIGlzIHRoZSBzYW1lIGFzIG91cnMgdGhlbiBhc2sgaGltIHRvIHRyeSB0aGUgbmV4dAotICogdmFsdWUuCi0gKi8KLQkgICAgaWYgKGNvbXBhcmVfbm9kZSAoaG8tPmhpc19ub2RlLCBnby0+b3VyX25vZGUpKSB7Ci0JCWluY19ub2RlIChoby0+aGlzX25vZGUpOwotCQlvcmMgPSBDT05GTkFLOwotCQljb3B5X25vZGUgKGhvLT5oaXNfbm9kZSwgcCk7Ci0JCUlOQ1BUUiAoc2l6ZW9mICh3by0+aGlzX25vZGUpLCBwKTsKLQkJYnJlYWs7Ci0JICAgIH0KLS8qCi0gKiBJZiB3ZSBkb24ndCBhY2NlcHQgYSBuZXcgdmFsdWUgdGhlbiBOQUsgaXQuCi0gKi8KLQkgICAgaWYgKCEgYW8tPmFjY2VwdF9yZW1vdGUpIHsKLQkJY29weV9ub2RlICh3by0+aGlzX25vZGUsIHApOwotCQlJTkNQVFIgKHNpemVvZiAod28tPmhpc19ub2RlKSwgcCk7Ci0JCW9yYyA9IENPTkZOQUs7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIG9yYyA9IENPTkZBQ0s7Ci0JICAgIGhvLT5uZWdfbm9kZSA9IDE7Ci0JICAgIElOQ1BUUiAoc2l6ZW9mICh3by0+aGlzX25vZGUpLCBwKTsKLQkgICAgYnJlYWs7Ci0vKgotICogQ29tcHJlc3Npb24gaXMgbm90IGRlc2lyZWQgYXQgdGhpcyB0aW1lLiBJdCBpcyBhbHdheXMgcmVqZWN0ZWQuCi0gKi8KLQljYXNlIElQWF9DT01QUkVTU0lPTl9QUk9UT0NPTDoKLQkgICAgb3JjID0gQ09ORlJFSjsKLQkgICAgYnJlYWs7Ci0vKgotICogVGhlIHJvdXRpbmcgcHJvdG9jb2wgaXMgYSBiaXRtYXNrIG9mIHZhcmlvdXMgdHlwZXMuIEFueSBjb21iaW5hdGlvbgotICogb2YgdGhlIHZhbHVlcyBSSVBfU0FQIGFuZCBOTFNQIGFyZSBwZXJtaXNzaWJsZS4gJ0lQWF9OT05FJyBmb3Igbm8KLSAqIHJvdXRpbmcgcHJvdG9jb2wgbXVzdCBiZSBzcGVjaWZpZWQgb25seSBvbmNlLgotICovCi0JY2FzZSBJUFhfUk9VVEVSX1BST1RPQ09MOgotCSAgICBpZiAoICFhby0+bmVnX3JvdXRlciB8fCBjaWxlbiA8IENJTEVOX1BST1RPQ09MICkgewotCQlvcmMgPSBDT05GUkVKOwotCQlicmVhazsJCQotCSAgICB9Ci0KLQkgICAgR0VUU0hPUlQgKGNpc2hvcnQsIHApOwotCi0JICAgIGlmICh3by0+bmVnX3JvdXRlciA9PSAwKSB7Ci0JICAgICAgICB3by0+bmVnX3JvdXRlciA9IDE7Ci0JCXdvLT5yb3V0ZXIgICAgID0gQklUKElQWF9OT05FKTsKLQkgICAgfQotCi0JICAgIGlmICgoY2lzaG9ydCA9PSBJUFhfTk9ORSAmJiBoby0+cm91dGVyICE9IDApIHx8Ci0JCShoby0+cm91dGVyICYgQklUKElQWF9OT05FKSkpIHsKLQkJb3JjID0gQ09ORlJFSjsKLQkJYnJlYWs7Ci0JICAgIH0KLQotCSAgICBjaXNob3J0ID0gQklUKGNpc2hvcnQpOwotCSAgICBpZiAoaG8tPnJvdXRlciAmIGNpc2hvcnQpIHsKLQkJb3JjID0gQ09ORlJFSjsKLQkJYnJlYWs7Ci0JICAgIH0KLQotCSAgICBoby0+cm91dGVyCSAgfD0gY2lzaG9ydDsKLQkgICAgaG8tPm5lZ19yb3V0ZXIgPSAxOwotCi0JICAgIC8qIEZpbmFsbHkgZG8gbm90IGFsbG93IGEgcm91dGVyIHByb3RvY29sIHdoaWNoIHdlIGRvIG5vdAotCSAgICAgICBzdXBwb3J0LiAqLwotCi0JICAgIGlmICgoY2lzaG9ydCAmIChhby0+cm91dGVyIHwgQklUKElQWF9OT05FKSkpID09IDApIHsKLQkgICAgICAgIGludCBwcm90b2NvbDsKLQotCQlpZiAoY2lzaG9ydCA9PSBCSVQoTkxTUCkgJiYKLQkJICAgIChhby0+cm91dGVyICYgQklUKFJJUF9TQVApKSAmJgotCQkgICAgIXdvLT50cmllZF9yaXApIHsKLQkJICAgIHByb3RvY29sICAgICAgPSBSSVBfU0FQOwotCQkgICAgd28tPnRyaWVkX3JpcCA9IDE7Ci0JCX0gZWxzZQotCQkgICAgcHJvdG9jb2wgPSBJUFhfTk9ORTsKLQotCQlERUNQVFIgKHNpemVvZiAodV9pbnQxNl90KSwgcCk7Ci0JCVBVVFNIT1JUIChwcm90b2NvbCwgcCk7Ci0JCW9yYyA9IENPTkZOQUs7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0vKgotICogVGhlIHJvdXRlciBuYW1lIGlzIGFkdmlzb3JhcnkuIEp1c3QgYWNjZXB0IGl0IGlmIGl0IGlzIG5vdCB0b28gbGFyZ2UuCi0gKi8KLQljYXNlIElQWF9ST1VURVJfTkFNRToKLQkgICAgaWYgKGNpbGVuID49IENJTEVOX05BTUUpIHsKLQkJaW50IG5hbWVfc2l6ZSA9IGNpbGVuIC0gQ0lMRU5fTkFNRTsKLQkJaWYgKG5hbWVfc2l6ZSA+IHNpemVvZiAoaG8tPm5hbWUpKQotCQkgICAgbmFtZV9zaXplID0gc2l6ZW9mIChoby0+bmFtZSkgLSAxOwotCQltZW1zZXQgKGhvLT5uYW1lLCAwLCBzaXplb2YgKGhvLT5uYW1lKSk7Ci0JCW1lbWNweSAoaG8tPm5hbWUsIHAsIG5hbWVfc2l6ZSk7Ci0JCWhvLT5uYW1lIFtuYW1lX3NpemVdID0gJ1wwJzsKLQkJaG8tPm5lZ19uYW1lID0gMTsKLQkJb3JjID0gQ09ORkFDSzsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgb3JjID0gQ09ORlJFSjsKLQkgICAgYnJlYWs7Ci0vKgotICogVGhpcyBpcyBhZHZpc29yYXJ5LgotICovCi0JY2FzZSBJUFhfQ09NUExFVEU6Ci0JICAgIGlmIChjaWxlbiAhPSBDSUxFTl9DT01QTEVURSkKLQkJb3JjID0gQ09ORlJFSjsKLQkgICAgZWxzZSB7Ci0JCWhvLT5uZWdfY29tcGxldGUgPSAxOwotCQlvcmMgPSBDT05GQUNLOwotCSAgICB9Ci0JICAgIGJyZWFrOwotLyoKLSAqIEFsbCBvdGhlciBlbnRyaWVzIGFyZSBub3Qga25vd24gYXQgdGhpcyB0aW1lLgotICovCi0JZGVmYXVsdDoKLQkgICAgb3JjID0gQ09ORlJFSjsKLQkgICAgYnJlYWs7Ci0JfQotZW5kc3dpdGNoOgotCWlmIChvcmMgPT0gQ09ORkFDSyAmJgkJLyogR29vZCBDSSAqLwotCSAgICByYyAhPSBDT05GQUNLKQkJLyogIGJ1dCBwcmlvciBDSSB3YXNudD8gKi8KLQkgICAgY29udGludWU7CQkJLyogRG9uJ3Qgc2VuZCB0aGlzIG9uZSAqLwotCi0JaWYgKG9yYyA9PSBDT05GTkFLKSB7CQkvKiBOYWsgdGhpcyBDST8gKi8KLQkgICAgaWYgKHJlamVjdF9pZl9kaXNhZ3JlZSkJLyogR2V0dGluZyBmZWQgdXAgd2l0aCBzZW5kaW5nIE5BS3M/ICovCi0JCW9yYyA9IENPTkZSRUo7CQkvKiBHZXQgdG91Z2ggaWYgc28gKi8KLQkgICAgaWYgKHJjID09IENPTkZSRUopCQkvKiBSZWplY3RpbmcgcHJpb3IgQ0k/ICovCi0JCWNvbnRpbnVlOwkJLyogRG9uJ3Qgc2VuZCB0aGlzIG9uZSAqLwotCSAgICBpZiAocmMgPT0gQ09ORkFDSykgewkvKiBBY2snZCBhbGwgcHJpb3IgQ0lzPyAqLwotCQlyYyAgPSBDT05GTkFLOwkJLyogTm90IGFueW1vcmUuLi4gKi8KLQkJdWNwID0gaW5wOwkJLyogQmFja3VwICovCi0JICAgIH0KLQl9Ci0KLQlpZiAob3JjID09IENPTkZSRUogJiYJCS8qIFJlamVjdCB0aGlzIENJICovCi0JICAgIHJjICE9IENPTkZSRUopIHsJCS8qICBidXQgbm8gcHJpb3Igb25lcz8gKi8KLQkgICAgcmMgPSBDT05GUkVKOwotCSAgICB1Y3AgPSBpbnA7CQkJLyogQmFja3VwICovCi0JfQotCi0JLyogTmVlZCB0byBtb3ZlIENJPyAqLwotCWlmICh1Y3AgIT0gY2lwKQotCSAgICBCQ09QWShjaXAsIHVjcCwgY2lsZW4pOwkvKiBNb3ZlIGl0ICovCi0KLQkvKiBVcGRhdGUgb3V0cHV0IHBvaW50ZXIgKi8KLQlJTkNQVFIoY2lsZW4sIHVjcCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBJZiB3ZSBhcmVuJ3QgcmVqZWN0aW5nIHRoaXMgcGFja2V0LCBhbmQgd2Ugd2FudCB0byBuZWdvdGlhdGUKLSAgICAgKiB0aGVpciBhZGRyZXNzLCBhbmQgdGhleSBkaWRuJ3Qgc2VuZCB0aGVpciBhZGRyZXNzLCB0aGVuIHdlCi0gICAgICogc2VuZCBhIE5BSyB3aXRoIGEgSVBYX05PREVfTlVNQkVSIG9wdGlvbiBhcHBlbmRlZC4gV2UgYXNzdW1lIHRoZQotICAgICAqIGlucHV0IGJ1ZmZlciBpcyBsb25nIGVub3VnaCB0aGF0IHdlIGNhbiBhcHBlbmQgdGhlIGV4dHJhCi0gICAgICogb3B0aW9uIHNhZmVseS4KLSAgICAgKi8KLQotICAgIGlmIChyYyAhPSBDT05GUkVKICYmICFoby0+bmVnX25vZGUgJiYKLQl3by0+cmVxX25uICYmICFyZWplY3RfaWZfZGlzYWdyZWUpIHsKLQlpZiAocmMgPT0gQ09ORkFDSykgewotCSAgICByYyA9IENPTkZOQUs7Ci0JICAgIHdvLT5yZXFfbm4gPSAwOwkJLyogZG9uJ3QgYXNrIGFnYWluICovCi0JICAgIHVjcCA9IGlucDsJCQkvKiByZXNldCBwb2ludGVyICovCi0JfQotCi0JaWYgKHplcm9fbm9kZSAod28tPmhpc19ub2RlKSkKLQkgICAgaW5jX25vZGUgKHdvLT5oaXNfbm9kZSk7Ci0KLQlQVVRDSEFSIChJUFhfTk9ERV9OVU1CRVIsIHVjcCk7Ci0JUFVUQ0hBUiAoQ0lMRU5fTk9ERU4sIHVjcCk7Ci0JY29weV9ub2RlICh3by0+aGlzX25vZGUsIHVjcCk7Ci0JSU5DUFRSIChzaXplb2YgKHdvLT5oaXNfbm9kZSksIHVjcCk7Ci0gICAgfQotCi0gICAgKmxlbiA9IHVjcCAtIGlucDsJCQkvKiBDb21wdXRlIG91dHB1dCBsZW5ndGggKi8KLSAgICBJUFhDUERFQlVHKCgiaXB4Y3A6IHJldHVybmluZyBDb25maWd1cmUtJXMiLCBDT0RFTkFNRShyYykpKTsKLSAgICByZXR1cm4gKHJjKTsJCQkvKiBSZXR1cm4gZmluYWwgY29kZSAqLwotfQotCi0vKgotICogaXB4Y3BfdXAgLSBJUFhDUCBoYXMgY29tZSBVUC4KLSAqCi0gKiBDb25maWd1cmUgdGhlIElQIG5ldHdvcmsgaW50ZXJmYWNlIGFwcHJvcHJpYXRlbHkgYW5kIGJyaW5nIGl0IHVwLgotICovCi0KLXN0YXRpYyB2b2lkCi1pcHhjcF91cChmKQotICAgIGZzbSAqZjsKLXsKLSAgICBpbnQgdW5pdCA9IGYtPnVuaXQ7Ci0KLSAgICBJUFhDUERFQlVHKCgiaXB4Y3A6IHVwIikpOwotCi0gICAgLyogVGhlIGRlZmF1bHQgcm91dGVyIHByb3RvY29sIGlzIFJJUC9TQVAuICovCi0gICAgaWYgKGhvLT5yb3V0ZXIgPT0gMCkKLSAgICAgICAgaG8tPnJvdXRlciA9IEJJVChSSVBfU0FQKTsKLQotICAgIGlmIChnby0+cm91dGVyID09IDApCi0gICAgICAgIGdvLT5yb3V0ZXIgPSBCSVQoUklQX1NBUCk7Ci0KLSAgICAvKiBGZXRjaCB0aGUgbmV0d29yayBudW1iZXIgKi8KLSAgICBpZiAoIWhvLT5uZWdfbm4pCi0JaG8tPmhpc19uZXR3b3JrID0gd28tPmhpc19uZXR3b3JrOwotCi0gICAgaWYgKCFoby0+bmVnX25vZGUpCi0JY29weV9ub2RlICh3by0+aGlzX25vZGUsIGhvLT5oaXNfbm9kZSk7Ci0KLSAgICBpZiAoIXdvLT5uZWdfbm9kZSAmJiAhZ28tPm5lZ19ub2RlKQotCWNvcHlfbm9kZSAod28tPm91cl9ub2RlLCBnby0+b3VyX25vZGUpOwotCi0gICAgaWYgKHplcm9fbm9kZSAoZ28tPm91cl9ub2RlKSkgewotICAgICAgICBzdGF0aWMgY2hhciBlcnJtc2dbXSA9ICJDb3VsZCBub3QgZGV0ZXJtaW5lIGxvY2FsIElQWCBub2RlIGFkZHJlc3MiOwotCWlmIChkZWJ1ZykKLQkgICAgZXJyb3IoZXJybXNnKTsKLQlpcHhjcF9jbG9zZShmLT51bml0LCBlcnJtc2cpOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICBnby0+bmV0d29yayA9IGdvLT5vdXJfbmV0d29yazsKLSAgICBpZiAoaG8tPmhpc19uZXR3b3JrICE9IDAgJiYgaG8tPmhpc19uZXR3b3JrID4gZ28tPm5ldHdvcmspCi0JZ28tPm5ldHdvcmsgPSBoby0+aGlzX25ldHdvcms7Ci0KLSAgICBpZiAoZ28tPm5ldHdvcmsgPT0gMCkgewotICAgICAgICBzdGF0aWMgY2hhciBlcnJtc2dbXSA9ICJDYW4gbm90IGRldGVybWluZSBuZXR3b3JrIG51bWJlciI7Ci0JaWYgKGRlYnVnKQotCSAgICBlcnJvcihlcnJtc2cpOwotCWlweGNwX2Nsb3NlICh1bml0LCBlcnJtc2cpOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBicmluZyB0aGUgaW50ZXJmYWNlIHVwICovCi0gICAgaWYgKCFzaWZ1cCh1bml0KSkgewotCWlmIChkZWJ1ZykKLQkgICAgd2Fybigic2lmdXAgZmFpbGVkIChJUFgpIik7Ci0JaXB4Y3BfY2xvc2UodW5pdCwgIkludGVyZmFjZSBjb25maWd1cmF0aW9uIGZhaWxlZCIpOwotCXJldHVybjsKLSAgICB9Ci0gICAgaXB4Y3BfaXNfdXAgPSAxOwotCi0gICAgLyogc2V0IHRoZSBuZXR3b3JrIG51bWJlciBmb3IgSVBYICovCi0gICAgaWYgKCFzaXB4ZmFkZHIodW5pdCwgZ28tPm5ldHdvcmssIGdvLT5vdXJfbm9kZSkpIHsKLQlpZiAoZGVidWcpCi0JICAgIHdhcm4oInNpcHhmYWRkciBmYWlsZWQiKTsKLQlpcHhjcF9jbG9zZSh1bml0LCAiSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gZmFpbGVkIik7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIG5wX3VwKGYtPnVuaXQsIFBQUF9JUFgpOwotCi0gICAgLyoKLSAgICAgKiBFeGVjdXRlIHRoZSBpcHgtdXAgc2NyaXB0LCBsaWtlIHRoaXM6Ci0gICAgICoJL2V0Yy9wcHAvaXB4LXVwIGludGVyZmFjZSB0dHkgc3BlZWQgbG9jYWwtSVBYIHJlbW90ZS1JUFgKLSAgICAgKi8KLQotICAgIGlweGNwX3NjcmlwdCAoZiwgX1BBVEhfSVBYVVApOwotfQotCi0vKgotICogaXB4Y3BfZG93biAtIElQWENQIGhhcyBnb25lIERPV04uCi0gKgotICogVGFrZSB0aGUgSVAgbmV0d29yayBpbnRlcmZhY2UgZG93biwgY2xlYXIgaXRzIGFkZHJlc3NlcwotICogYW5kIGRlbGV0ZSByb3V0ZXMgdGhyb3VnaCBpdC4KLSAqLwotCi1zdGF0aWMgdm9pZAotaXB4Y3BfZG93bihmKQotICAgIGZzbSAqZjsKLXsKLSAgICBJUFhDUERFQlVHKCgiaXB4Y3A6IGRvd24iKSk7Ci0KLSAgICBpZiAoIWlweGNwX2lzX3VwKQotCXJldHVybjsKLSAgICBpcHhjcF9pc191cCA9IDA7Ci0gICAgbnBfZG93bihmLT51bml0LCBQUFBfSVBYKTsKLSAgICBjaXB4ZmFkZHIoZi0+dW5pdCk7Ci0gICAgc2lmbnBtb2RlKGYtPnVuaXQsIFBQUF9JUFgsIE5QTU9ERV9EUk9QKTsKLSAgICBzaWZkb3duKGYtPnVuaXQpOwotICAgIGlweGNwX3NjcmlwdCAoZiwgX1BBVEhfSVBYRE9XTik7Ci19Ci0KLQotLyoKLSAqIGlweGNwX2ZpbmlzaGVkIC0gcG9zc2libHkgc2h1dCBkb3duIHRoZSBsb3dlciBsYXllcnMuCi0gKi8KLXN0YXRpYyB2b2lkCi1pcHhjcF9maW5pc2hlZChmKQotICAgIGZzbSAqZjsKLXsKLSAgICBucF9maW5pc2hlZChmLT51bml0LCBQUFBfSVBYKTsKLX0KLQotCi0vKgotICogaXB4Y3Bfc2NyaXB0IC0gRXhlY3V0ZSBhIHNjcmlwdCB3aXRoIGFyZ3VtZW50cwotICogaW50ZXJmYWNlLW5hbWUgdHR5LW5hbWUgc3BlZWQgbG9jYWwtSVBYIHJlbW90ZS1JUFggbmV0d29ya3MuCi0gKi8KLXN0YXRpYyB2b2lkCi1pcHhjcF9zY3JpcHQoZiwgc2NyaXB0KQotICAgIGZzbSAqZjsKLSAgICBjaGFyICpzY3JpcHQ7Ci17Ci0gICAgY2hhciBzdHJzcGVlZFszMl0sCSBzdHJsb2NhbFszMl0sCSAgIHN0cnJlbW90ZVszMl07Ci0gICAgY2hhciBzdHJuZXR3b3JrWzMyXSwgc3RycGlkWzMyXTsKLSAgICBjaGFyICphcmd2WzE0XSwJIHN0cnByb3RvX2xjbFszMl0sIHN0cnByb3RvX3JtdFszMl07Ci0KLSAgICBzbHByaW50ZihzdHJwaWQsIHNpemVvZihzdHJwaWQpLCAiJWQiLCBnZXRwaWQoKSk7Ci0gICAgc2xwcmludGYoc3Ryc3BlZWQsIHNpemVvZihzdHJzcGVlZCksIiVkIiwgYmF1ZF9yYXRlKTsKLQotICAgIHN0cnByb3RvX2xjbFswXSA9ICdcMCc7Ci0gICAgaWYgKGdvLT5uZWdfcm91dGVyICYmICgoZ28tPnJvdXRlciAmIEJJVChJUFhfTk9ORSkpID09IDApKSB7Ci0JaWYgKGdvLT5yb3V0ZXIgJiBCSVQoUklQX1NBUCkpCi0JICAgIHN0cmxjcHkgKHN0cnByb3RvX2xjbCwgIlJJUCAiLCBzaXplb2Yoc3RycHJvdG9fbGNsKSk7Ci0JaWYgKGdvLT5yb3V0ZXIgJiBCSVQoTkxTUCkpCi0JICAgIHN0cmxjYXQgKHN0cnByb3RvX2xjbCwgIk5MU1AgIiwgc2l6ZW9mKHN0cnByb3RvX2xjbCkpOwotICAgIH0KLQotICAgIGlmIChzdHJwcm90b19sY2xbMF0gPT0gJ1wwJykKLQlzdHJsY3B5IChzdHJwcm90b19sY2wsICJOT05FICIsIHNpemVvZihzdHJwcm90b19sY2wpKTsKLQotICAgIHN0cnByb3RvX2xjbFtzdHJsZW4gKHN0cnByb3RvX2xjbCktMV0gPSAnXDAnOwotCi0gICAgc3RycHJvdG9fcm10WzBdID0gJ1wwJzsKLSAgICBpZiAoaG8tPm5lZ19yb3V0ZXIgJiYgKChoby0+cm91dGVyICYgQklUKElQWF9OT05FKSkgPT0gMCkpIHsKLQlpZiAoaG8tPnJvdXRlciAmIEJJVChSSVBfU0FQKSkKLQkgICAgc3RybGNweSAoc3RycHJvdG9fcm10LCAiUklQICIsIHNpemVvZihzdHJwcm90b19ybXQpKTsKLQlpZiAoaG8tPnJvdXRlciAmIEJJVChOTFNQKSkKLQkgICAgc3RybGNhdCAoc3RycHJvdG9fcm10LCAiTkxTUCAiLCBzaXplb2Yoc3RycHJvdG9fcm10KSk7Ci0gICAgfQotCi0gICAgaWYgKHN0cnByb3RvX3JtdFswXSA9PSAnXDAnKQotCXN0cmxjcHkgKHN0cnByb3RvX3JtdCwgIk5PTkUgIiwgc2l6ZW9mKHN0cnByb3RvX3JtdCkpOwotCi0gICAgc3RycHJvdG9fcm10W3N0cmxlbiAoc3RycHJvdG9fcm10KS0xXSA9ICdcMCc7Ci0KLSAgICBzdHJsY3B5IChzdHJuZXR3b3JrLCBpcHhfbnRvYSAoZ28tPm5ldHdvcmspLCBzaXplb2Yoc3RybmV0d29yaykpOwotCi0gICAgc2xwcmludGYgKHN0cmxvY2FsLCBzaXplb2Yoc3RybG9jYWwpLCAiJTAuNkIiLCBnby0+b3VyX25vZGUpOwotCi0gICAgc2xwcmludGYgKHN0cnJlbW90ZSwgc2l6ZW9mKHN0cnJlbW90ZSksICIlMC42QiIsIGhvLT5oaXNfbm9kZSk7Ci0KLSAgICBhcmd2WzBdICA9IHNjcmlwdDsKLSAgICBhcmd2WzFdICA9IGlmbmFtZTsKLSAgICBhcmd2WzJdICA9IGRldm5hbTsKLSAgICBhcmd2WzNdICA9IHN0cnNwZWVkOwotICAgIGFyZ3ZbNF0gID0gc3RybmV0d29yazsKLSAgICBhcmd2WzVdICA9IHN0cmxvY2FsOwotICAgIGFyZ3ZbNl0gID0gc3RycmVtb3RlOwotICAgIGFyZ3ZbN10gID0gc3RycHJvdG9fbGNsOwotICAgIGFyZ3ZbOF0gID0gc3RycHJvdG9fcm10OwotICAgIGFyZ3ZbOV0gID0gKGNoYXIgKilnby0+bmFtZTsKLSAgICBhcmd2WzEwXSA9IChjaGFyICopaG8tPm5hbWU7Ci0gICAgYXJndlsxMV0gPSBpcHBhcmFtOwotICAgIGFyZ3ZbMTJdID0gc3RycGlkOwotICAgIGFyZ3ZbMTNdID0gTlVMTDsKLSAgICBydW5fcHJvZ3JhbShzY3JpcHQsIGFyZ3YsIDAsIE5VTEwsIE5VTEwsIDApOwotfQotCi0vKgotICogaXB4Y3BfcHJpbnRwa3QgLSBwcmludCB0aGUgY29udGVudHMgb2YgYW4gSVBYQ1AgcGFja2V0LgotICovCi1zdGF0aWMgY2hhciAqaXB4Y3BfY29kZW5hbWVzW10gPSB7Ci0gICAgIkNvbmZSZXEiLCAiQ29uZkFjayIsICJDb25mTmFrIiwgIkNvbmZSZWoiLAotICAgICJUZXJtUmVxIiwgIlRlcm1BY2siLCAiQ29kZVJlaiIKLX07Ci0KLXN0YXRpYyBpbnQKLWlweGNwX3ByaW50cGt0KHAsIHBsZW4sIHByaW50ZXIsIGFyZykKLSAgICB1X2NoYXIgKnA7Ci0gICAgaW50IHBsZW47Ci0gICAgdm9pZCAoKnByaW50ZXIpIF9fUCgodm9pZCAqLCBjaGFyICosIC4uLikpOwotICAgIHZvaWQgKmFyZzsKLXsKLSAgICBpbnQgY29kZSwgaWQsIGxlbiwgb2xlbjsKLSAgICB1X2NoYXIgKnBzdGFydCwgKm9wdGVuZDsKLSAgICB1X3Nob3J0IGNpc2hvcnQ7Ci0gICAgdV9pbnQzMl90IGNpbG9uZzsKLQotICAgIGlmIChwbGVuIDwgSEVBREVSTEVOKQotCXJldHVybiAwOwotICAgIHBzdGFydCA9IHA7Ci0gICAgR0VUQ0hBUihjb2RlLCBwKTsKLSAgICBHRVRDSEFSKGlkLCBwKTsKLSAgICBHRVRTSE9SVChsZW4sIHApOwotICAgIGlmIChsZW4gPCBIRUFERVJMRU4gfHwgbGVuID4gcGxlbikKLQlyZXR1cm4gMDsKLQotICAgIGlmIChjb2RlID49IDEgJiYgY29kZSA8PSBzaXplb2YoaXB4Y3BfY29kZW5hbWVzKSAvIHNpemVvZihjaGFyICopKQotCXByaW50ZXIoYXJnLCAiICVzIiwgaXB4Y3BfY29kZW5hbWVzW2NvZGUtMV0pOwotICAgIGVsc2UKLQlwcmludGVyKGFyZywgIiBjb2RlPTB4JXgiLCBjb2RlKTsKLSAgICBwcmludGVyKGFyZywgIiBpZD0weCV4IiwgaWQpOwotICAgIGxlbiAtPSBIRUFERVJMRU47Ci0gICAgc3dpdGNoIChjb2RlKSB7Ci0gICAgY2FzZSBDT05GUkVROgotICAgIGNhc2UgQ09ORkFDSzoKLSAgICBjYXNlIENPTkZOQUs6Ci0gICAgY2FzZSBDT05GUkVKOgotCS8qIHByaW50IG9wdGlvbiBsaXN0ICovCi0Jd2hpbGUgKGxlbiA+PSAyKSB7Ci0JICAgIEdFVENIQVIoY29kZSwgcCk7Ci0JICAgIEdFVENIQVIob2xlbiwgcCk7Ci0JICAgIHAgLT0gMjsKLQkgICAgaWYgKG9sZW4gPCBDSUxFTl9WT0lEIHx8IG9sZW4gPiBsZW4pIHsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgcHJpbnRlcihhcmcsICIgPCIpOwotCSAgICBsZW4gLT0gb2xlbjsKLQkgICAgb3B0ZW5kID0gcCArIG9sZW47Ci0JICAgIHN3aXRjaCAoY29kZSkgewotCSAgICBjYXNlIElQWF9ORVRXT1JLX05VTUJFUjoKLQkJaWYgKG9sZW4gPT0gQ0lMRU5fTkVUTikgewotCQkgICAgcCArPSAyOwotCQkgICAgR0VUTE9ORyhjaWxvbmcsIHApOwotCQkgICAgcHJpbnRlciAoYXJnLCAibmV0d29yayAlcyIsIGlweF9udG9hIChjaWxvbmcpKTsKLQkJfQotCQlicmVhazsKLQkgICAgY2FzZSBJUFhfTk9ERV9OVU1CRVI6Ci0JCWlmIChvbGVuID09IENJTEVOX05PREVOKSB7Ci0JCSAgICBwICs9IDI7Ci0JCSAgICBwcmludGVyIChhcmcsICJub2RlICIpOwotCQkgICAgd2hpbGUgKHAgPCBvcHRlbmQpIHsKLQkJCUdFVENIQVIoY29kZSwgcCk7Ci0JCQlwcmludGVyKGFyZywgIiUuMngiLCAoaW50KSAodW5zaWduZWQgaW50KSAodW5zaWduZWQgY2hhcikgY29kZSk7Ci0JCSAgICB9Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgSVBYX0NPTVBSRVNTSU9OX1BST1RPQ09MOgotCQlpZiAob2xlbiA9PSBDSUxFTl9DT01QUkVTUykgewotCQkgICAgcCArPSAyOwotCQkgICAgR0VUU0hPUlQgKGNpc2hvcnQsIHApOwotCQkgICAgcHJpbnRlciAoYXJnLCAiY29tcHJlc3Npb24gJWQiLCAoaW50KSBjaXNob3J0KTsKLQkJfQotCQlicmVhazsKLQkgICAgY2FzZSBJUFhfUk9VVEVSX1BST1RPQ09MOgotCQlpZiAob2xlbiA9PSBDSUxFTl9QUk9UT0NPTCkgewotCQkgICAgcCArPSAyOwotCQkgICAgR0VUU0hPUlQgKGNpc2hvcnQsIHApOwotCQkgICAgcHJpbnRlciAoYXJnLCAicm91dGVyIHByb3RvICVkIiwgKGludCkgY2lzaG9ydCk7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgSVBYX1JPVVRFUl9OQU1FOgotCQlpZiAob2xlbiA+PSBDSUxFTl9OQU1FKSB7Ci0JCSAgICBwICs9IDI7Ci0JCSAgICBwcmludGVyIChhcmcsICJyb3V0ZXIgbmFtZSBcIiIpOwotCQkgICAgd2hpbGUgKHAgPCBvcHRlbmQpIHsKLQkJCUdFVENIQVIoY29kZSwgcCk7Ci0JCQlpZiAoY29kZSA+PSAweDIwICYmIGNvZGUgPD0gMHg3RSkKLQkJCSAgICBwcmludGVyIChhcmcsICIlYyIsIChpbnQpICh1bnNpZ25lZCBpbnQpICh1bnNpZ25lZCBjaGFyKSBjb2RlKTsKLQkJCWVsc2UKLQkJCSAgICBwcmludGVyIChhcmcsICIgXFwlLjJ4IiwgKGludCkgKHVuc2lnbmVkIGludCkgKHVuc2lnbmVkIGNoYXIpIGNvZGUpOwotCQkgICAgfQotCQkgICAgcHJpbnRlciAoYXJnLCAiXCIiKTsKLQkJfQotCQlicmVhazsKLQkgICAgY2FzZSBJUFhfQ09NUExFVEU6Ci0JCWlmIChvbGVuID09IENJTEVOX0NPTVBMRVRFKSB7Ci0JCSAgICBwICs9IDI7Ci0JCSAgICBwcmludGVyIChhcmcsICJjb21wbGV0ZSIpOwotCQl9Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlicmVhazsKLQkgICAgfQotCi0JICAgIHdoaWxlIChwIDwgb3B0ZW5kKSB7Ci0JCUdFVENIQVIoY29kZSwgcCk7Ci0JCXByaW50ZXIoYXJnLCAiICUuMngiLCAoaW50KSAodW5zaWduZWQgaW50KSAodW5zaWduZWQgY2hhcikgY29kZSk7Ci0JICAgIH0KLQkgICAgcHJpbnRlcihhcmcsICI+Iik7Ci0JfQotCWJyZWFrOwotCi0gICAgY2FzZSBURVJNQUNLOgotICAgIGNhc2UgVEVSTVJFUToKLQlpZiAobGVuID4gMCAmJiAqcCA+PSAnICcgJiYgKnAgPCAweDdmKSB7Ci0JICAgIHByaW50ZXIoYXJnLCAiICIpOwotCSAgICBwcmludF9zdHJpbmcoKGNoYXIgKilwLCBsZW4sIHByaW50ZXIsIGFyZyk7Ci0JICAgIHAgKz0gbGVuOwotCSAgICBsZW4gPSAwOwotCX0KLQlicmVhazsKLSAgICB9Ci0KLSAgICAvKiBwcmludCB0aGUgcmVzdCBvZiB0aGUgYnl0ZXMgaW4gdGhlIHBhY2tldCAqLwotICAgIGZvciAoOyBsZW4gPiAwOyAtLWxlbikgewotCUdFVENIQVIoY29kZSwgcCk7Ci0JcHJpbnRlcihhcmcsICIgJS4yeCIsIChpbnQpICh1bnNpZ25lZCBpbnQpICh1bnNpZ25lZCBjaGFyKSBjb2RlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcCAtIHBzdGFydDsKLX0KLSNlbmRpZiAvKiBpZmRlZiBJUFhfQ0hBTkdFICovCmRpZmYgLS1naXQgYS9wcHBkL2lweGNwLmggYi9wcHBkL2lweGNwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NmI2YmIuLjAwMDAwMDAKLS0tIGEvcHBwZC9pcHhjcC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIGlweGNwLmggLSBJUFggQ29udHJvbCBQcm90b2NvbCBkZWZpbml0aW9ucy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODQtMjAwMCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgbmFtZSAiQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciBwZXJtaXNzaW9uIG9yIGFueSBsZWdhbAotICogICAgZGV0YWlscywgcGxlYXNlIGNvbnRhY3QKLSAqICAgICAgT2ZmaWNlIG9mIFRlY2hub2xvZ3kgVHJhbnNmZXIKLSAqICAgICAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAqICAgICAgNTAwMCBGb3JiZXMgQXZlbnVlCi0gKiAgICAgIFBpdHRzYnVyZ2gsIFBBICAxNTIxMy0zODkwCi0gKiAgICAgICg0MTIpIDI2OC00Mzg3LCBmYXg6ICg0MTIpIDI2OC03Mzk1Ci0gKiAgICAgIHRlY2gtdHJhbnNmZXJAYW5kcmV3LmNtdS5lZHUKLSAqCi0gKiA0LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IENvbXB1dGluZyBTZXJ2aWNlcwotICogICAgIGF0IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IChodHRwOi8vd3d3LmNtdS5lZHUvY29tcHV0aW5nLykuIgotICoKLSAqIENBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotICogVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi0gKiBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi0gKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi0gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqCi0gKiAkSWQ6IGlweGNwLmgsdiAxLjUgMjAwMi8xMi8wNCAyMzowMzozMiBwYXVsdXMgRXhwICQKLSAqLwotCi0vKgotICogT3B0aW9ucy4KLSAqLwotI2RlZmluZSBJUFhfTkVUV09SS19OVU1CRVIgICAgICAgIDEgICAvKiBJUFggTmV0d29yayBOdW1iZXIgKi8KLSNkZWZpbmUgSVBYX05PREVfTlVNQkVSICAgICAgICAgICAyCi0jZGVmaW5lIElQWF9DT01QUkVTU0lPTl9QUk9UT0NPTCAgMwotI2RlZmluZSBJUFhfUk9VVEVSX1BST1RPQ09MICAgICAgIDQKLSNkZWZpbmUgSVBYX1JPVVRFUl9OQU1FICAgICAgICAgICA1Ci0jZGVmaW5lIElQWF9DT01QTEVURSAgICAgICAgICAgICAgNgotCi0vKiBWYWx1ZXMgZm9yIHRoZSByb3V0ZXIgcHJvdG9jb2wgKi8KLSNkZWZpbmUgSVBYX05PTkUJCSAgMAotI2RlZmluZSBSSVBfU0FQCQkJICAyCi0jZGVmaW5lIE5MU1AJCQkgIDQKLQotdHlwZWRlZiBzdHJ1Y3QgaXB4Y3Bfb3B0aW9ucyB7Ci0gICAgYm9vbCBuZWdfbm9kZTsJCS8qIE5lZ290aWF0ZSBJUFggbm9kZSBudW1iZXI/ICovCi0gICAgYm9vbCByZXFfbm9kZTsJCS8qIEFzayBwZWVyIHRvIHNlbmQgSVBYIG5vZGUgbnVtYmVyPyAqLwotCi0gICAgYm9vbCBuZWdfbm47CQkvKiBOZWdvdGlhdGUgSVBYIG5ldHdvcmsgbnVtYmVyPyAqLwotICAgIGJvb2wgcmVxX25uOwkJLyogQXNrIHBlZXIgdG8gc2VuZCBJUFggbmV0d29yayBudW1iZXIgKi8KLQotICAgIGJvb2wgbmVnX25hbWU7CQkvKiBOZWdvdGlhdGUgSVBYIHJvdXRlciBuYW1lICovCi0gICAgYm9vbCBuZWdfY29tcGxldGU7CQkvKiBOZWdvdGlhdGUgY29tcGxldGlvbiAqLwotICAgIGJvb2wgbmVnX3JvdXRlcjsJCS8qIE5lZ290aWF0ZSBJUFggcm91dGVyIG51bWJlciAqLwotCi0gICAgYm9vbCBhY2NlcHRfbG9jYWw7CQkvKiBhY2NlcHQgcGVlcidzIHZhbHVlIGZvciBvdXJub2RlICovCi0gICAgYm9vbCBhY2NlcHRfcmVtb3RlOwkJLyogYWNjZXB0IHBlZXIncyB2YWx1ZSBmb3IgaGlzbm9kZSAqLwotICAgIGJvb2wgYWNjZXB0X25ldHdvcms7CS8qIGFjY2VwdCBuZXR3b3JrIG51bWJlciAqLwotCi0gICAgYm9vbCB0cmllZF9ubHNwOwkJLyogSSBoYXZlIHN1Z2dlc3RlZCBOTFNQIGFscmVhZHkgKi8KLSAgICBib29sIHRyaWVkX3JpcDsJCS8qIEkgaGF2ZSBzdWdnZXN0ZWQgUklQL1NBUCBhbHJlYWR5ICovCi0KLSAgICB1X2ludDMyX3QgaGlzX25ldHdvcms7CS8qIGJhc2UgbmV0d29yayBudW1iZXIgKi8KLSAgICB1X2ludDMyX3Qgb3VyX25ldHdvcms7CS8qIG91ciB2YWx1ZSBmb3IgbmV0d29yayBudW1iZXIgKi8KLSAgICB1X2ludDMyX3QgbmV0d29yazsJCS8qIHRoZSBmaW5hbCBuZXR3b3JrIG51bWJlciAqLwotCi0gICAgdV9jaGFyIGhpc19ub2RlWzZdOwkJLyogcGVlcidzIG5vZGUgbnVtYmVyICovCi0gICAgdV9jaGFyIG91cl9ub2RlWzZdOwkJLyogb3VyIG5vZGUgbnVtYmVyICovCi0gICAgdV9jaGFyIG5hbWUgWzQ4XTsJCS8qIG5hbWUgb2YgdGhlIHJvdXRlciAqLwotICAgIGludCAgICByb3V0ZXI7CQkvKiByb3V0aW5nIHByb3RvY29sICovCi19IGlweGNwX29wdGlvbnM7Ci0KLWV4dGVybiBmc20gaXB4Y3BfZnNtW107Ci1leHRlcm4gaXB4Y3Bfb3B0aW9ucyBpcHhjcF93YW50b3B0aW9uc1tdOwotZXh0ZXJuIGlweGNwX29wdGlvbnMgaXB4Y3BfZ290b3B0aW9uc1tdOwotZXh0ZXJuIGlweGNwX29wdGlvbnMgaXB4Y3BfYWxsb3dvcHRpb25zW107Ci1leHRlcm4gaXB4Y3Bfb3B0aW9ucyBpcHhjcF9oaXNvcHRpb25zW107Ci0KLWV4dGVybiBzdHJ1Y3QgcHJvdGVudCBpcHhjcF9wcm90ZW50OwpkaWZmIC0tZ2l0IGEvcHBwZC9sY3AuYyBiL3BwcGQvbGNwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZDI3NzguLjAwMDAwMDAKLS0tIGEvcHBwZC9sY3AuYworKysgL2Rldi9udWxsCkBAIC0xLDIzODAgKzAsMCBAQAotLyoKLSAqIGxjcC5jIC0gUFBQIExpbmsgQ29udHJvbCBQcm90b2NvbC4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODQtMjAwMCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgbmFtZSAiQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciBwZXJtaXNzaW9uIG9yIGFueSBsZWdhbAotICogICAgZGV0YWlscywgcGxlYXNlIGNvbnRhY3QKLSAqICAgICAgT2ZmaWNlIG9mIFRlY2hub2xvZ3kgVHJhbnNmZXIKLSAqICAgICAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAqICAgICAgNTAwMCBGb3JiZXMgQXZlbnVlCi0gKiAgICAgIFBpdHRzYnVyZ2gsIFBBICAxNTIxMy0zODkwCi0gKiAgICAgICg0MTIpIDI2OC00Mzg3LCBmYXg6ICg0MTIpIDI2OC03Mzk1Ci0gKiAgICAgIHRlY2gtdHJhbnNmZXJAYW5kcmV3LmNtdS5lZHUKLSAqCi0gKiA0LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IENvbXB1dGluZyBTZXJ2aWNlcwotICogICAgIGF0IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IChodHRwOi8vd3d3LmNtdS5lZHUvY29tcHV0aW5nLykuIgotICoKLSAqIENBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotICogVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi0gKiBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi0gKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi0gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jZGVmaW5lIFJDU0lECSIkSWQ6IGxjcC5jLHYgMS43NiAyMDA2LzA1LzIyIDAwOjA0OjA3IHBhdWx1cyBFeHAgJCIKLQotLyoKLSAqIFRPRE86Ci0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJwcHBkLmgiCi0jaW5jbHVkZSAiZnNtLmgiCi0jaW5jbHVkZSAibGNwLmgiCi0jaW5jbHVkZSAiY2hhcC1uZXcuaCIKLSNpbmNsdWRlICJtYWdpYy5oIgotCi1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdID0gUkNTSUQ7Ci0KLS8qCi0gKiBXaGVuIHRoZSBsaW5rIGNvbWVzIHVwIHdlIHdhbnQgdG8gYmUgYWJsZSB0byB3YWl0IGZvciBhIHNob3J0IHdoaWxlLAotICogb3IgdW50aWwgc2VlaW5nIHNvbWUgaW5wdXQgZnJvbSB0aGUgcGVlciwgYmVmb3JlIHN0YXJ0aW5nIHRvIHNlbmQKLSAqIGNvbmZpZ3VyZS1yZXF1ZXN0cy4gIFdlIGRvIHRoaXMgYnkgZGVsYXlpbmcgdGhlIGZzbV9sb3dlcnVwIGNhbGwuCi0gKi8KLS8qIHN0ZWFsIGEgYml0IGluIGZzbSBmbGFncyB3b3JkICovCi0jZGVmaW5lIERFTEFZRURfVVAJMHgxMDAKLQotc3RhdGljIHZvaWQgbGNwX2RlbGF5ZWRfdXAgX19QKCh2b2lkICopKTsKLQotLyoKLSAqIExDUC1yZWxhdGVkIGNvbW1hbmQtbGluZSBvcHRpb25zLgotICovCi1pbnQJbGNwX2VjaG9faW50ZXJ2YWwgPSAwOyAJLyogSW50ZXJ2YWwgYmV0d2VlbiBMQ1AgZWNoby1yZXF1ZXN0cyAqLwotaW50CWxjcF9lY2hvX2ZhaWxzID0gMDsJLyogVG9sZXJhbmNlIHRvIHVuYW5zd2VyZWQgZWNoby1yZXF1ZXN0cyAqLwotYm9vbAlsYXhfcmVjdiA9IDA7CQkvKiBhY2NlcHQgY29udHJvbCBjaGFycyBpbiBhc3luY21hcCAqLwotYm9vbAlub2VuZHBvaW50ID0gMDsJCS8qIGRvbid0IHNlbmQvYWNjZXB0IGVuZHBvaW50IGRpc2NyaW1pbmF0b3IgKi8KLQotc3RhdGljIGludCBub29wdCBfX1AoKGNoYXIgKiopKTsKLQotI2lmZGVmIEhBVkVfTVVMVElMSU5LCi1zdGF0aWMgaW50IHNldGVuZHBvaW50IF9fUCgoY2hhciAqKikpOwotc3RhdGljIHZvaWQgcHJpbnRlbmRwb2ludCBfX1AoKG9wdGlvbl90ICosIHZvaWQgKCopKHZvaWQgKiwgY2hhciAqLCAuLi4pLAotCQkJICAgICAgIHZvaWQgKikpOwotI2VuZGlmIC8qIEhBVkVfTVVMVElMSU5LICovCi0KLXN0YXRpYyBvcHRpb25fdCBsY3Bfb3B0aW9uX2xpc3RbXSA9IHsKLSAgICAvKiBMQ1Agb3B0aW9ucyAqLwotICAgIHsgIi1hbGwiLCBvX3NwZWNpYWxfbm9hcmcsICh2b2lkICopbm9vcHQsCi0gICAgICAiRG9uJ3QgcmVxdWVzdC9hbGxvdyBhbnkgTENQIG9wdGlvbnMiIH0sCi0KLSAgICB7ICJub2FjY29tcCIsIG9fYm9vbCwgJmxjcF93YW50b3B0aW9uc1swXS5uZWdfYWNjb21wcmVzc2lvbiwKLSAgICAgICJEaXNhYmxlIGFkZHJlc3MvY29udHJvbCBjb21wcmVzc2lvbiIsCi0gICAgICBPUFRfQTJDTFIsICZsY3BfYWxsb3dvcHRpb25zWzBdLm5lZ19hY2NvbXByZXNzaW9uIH0sCi0gICAgeyAiLWFjIiwgb19ib29sLCAmbGNwX3dhbnRvcHRpb25zWzBdLm5lZ19hY2NvbXByZXNzaW9uLAotICAgICAgIkRpc2FibGUgYWRkcmVzcy9jb250cm9sIGNvbXByZXNzaW9uIiwKLSAgICAgIE9QVF9BTElBUyB8IE9QVF9BMkNMUiwgJmxjcF9hbGxvd29wdGlvbnNbMF0ubmVnX2FjY29tcHJlc3Npb24gfSwKLQotICAgIHsgImFzeW5jbWFwIiwgb191aW50MzIsICZsY3Bfd2FudG9wdGlvbnNbMF0uYXN5bmNtYXAsCi0gICAgICAiU2V0IGFzeW5jbWFwIChmb3IgcmVjZWl2ZWQgcGFja2V0cykiLAotICAgICAgT1BUX09SLCAmbGNwX3dhbnRvcHRpb25zWzBdLm5lZ19hc3luY21hcCB9LAotICAgIHsgIi1hcyIsIG9fdWludDMyLCAmbGNwX3dhbnRvcHRpb25zWzBdLmFzeW5jbWFwLAotICAgICAgIlNldCBhc3luY21hcCAoZm9yIHJlY2VpdmVkIHBhY2tldHMpIiwKLSAgICAgIE9QVF9BTElBUyB8IE9QVF9PUiwgJmxjcF93YW50b3B0aW9uc1swXS5uZWdfYXN5bmNtYXAgfSwKLSAgICB7ICJkZWZhdWx0LWFzeW5jbWFwIiwgb191aW50MzIsICZsY3Bfd2FudG9wdGlvbnNbMF0uYXN5bmNtYXAsCi0gICAgICAiRGlzYWJsZSBhc3luY21hcCBuZWdvdGlhdGlvbiIsCi0gICAgICBPUFRfT1IgfCBPUFRfTk9BUkcgfCBPUFRfVkFMKH4wVSkgfCBPUFRfQTJDTFIsCi0gICAgICAmbGNwX2FsbG93b3B0aW9uc1swXS5uZWdfYXN5bmNtYXAgfSwKLSAgICB7ICItYW0iLCBvX3VpbnQzMiwgJmxjcF93YW50b3B0aW9uc1swXS5hc3luY21hcCwKLSAgICAgICJEaXNhYmxlIGFzeW5jbWFwIG5lZ290aWF0aW9uIiwKLSAgICAgIE9QVF9BTElBUyB8IE9QVF9PUiB8IE9QVF9OT0FSRyB8IE9QVF9WQUwofjBVKSB8IE9QVF9BMkNMUiwKLSAgICAgICZsY3BfYWxsb3dvcHRpb25zWzBdLm5lZ19hc3luY21hcCB9LAotCi0gICAgeyAibm9tYWdpYyIsIG9fYm9vbCwgJmxjcF93YW50b3B0aW9uc1swXS5uZWdfbWFnaWNudW1iZXIsCi0gICAgICAiRGlzYWJsZSBtYWdpYyBudW1iZXIgbmVnb3RpYXRpb24gKGxvb3BlZC1iYWNrIGxpbmUgZGV0ZWN0aW9uKSIsCi0gICAgICBPUFRfQTJDTFIsICZsY3BfYWxsb3dvcHRpb25zWzBdLm5lZ19tYWdpY251bWJlciB9LAotICAgIHsgIi1tbiIsIG9fYm9vbCwgJmxjcF93YW50b3B0aW9uc1swXS5uZWdfbWFnaWNudW1iZXIsCi0gICAgICAiRGlzYWJsZSBtYWdpYyBudW1iZXIgbmVnb3RpYXRpb24gKGxvb3BlZC1iYWNrIGxpbmUgZGV0ZWN0aW9uKSIsCi0gICAgICBPUFRfQUxJQVMgfCBPUFRfQTJDTFIsICZsY3BfYWxsb3dvcHRpb25zWzBdLm5lZ19tYWdpY251bWJlciB9LAotCi0gICAgeyAibXJ1Iiwgb19pbnQsICZsY3Bfd2FudG9wdGlvbnNbMF0ubXJ1LAotICAgICAgIlNldCBNUlUgKG1heGltdW0gcmVjZWl2ZWQgcGFja2V0IHNpemUpIGZvciBuZWdvdGlhdGlvbiIsCi0gICAgICBPUFRfUFJJTywgJmxjcF93YW50b3B0aW9uc1swXS5uZWdfbXJ1IH0sCi0gICAgeyAiZGVmYXVsdC1tcnUiLCBvX2Jvb2wsICZsY3Bfd2FudG9wdGlvbnNbMF0ubmVnX21ydSwKLSAgICAgICJEaXNhYmxlIE1SVSBuZWdvdGlhdGlvbiAodXNlIGRlZmF1bHQgMTUwMCkiLAotICAgICAgT1BUX1BSSU9TVUIgfCBPUFRfQTJDTFIsICZsY3BfYWxsb3dvcHRpb25zWzBdLm5lZ19tcnUgfSwKLSAgICB7ICItbXJ1Iiwgb19ib29sLCAmbGNwX3dhbnRvcHRpb25zWzBdLm5lZ19tcnUsCi0gICAgICAiRGlzYWJsZSBNUlUgbmVnb3RpYXRpb24gKHVzZSBkZWZhdWx0IDE1MDApIiwKLSAgICAgIE9QVF9BTElBUyB8IE9QVF9QUklPU1VCIHwgT1BUX0EyQ0xSLCAmbGNwX2FsbG93b3B0aW9uc1swXS5uZWdfbXJ1IH0sCi0KLSAgICB7ICJtdHUiLCBvX2ludCwgJmxjcF9hbGxvd29wdGlvbnNbMF0ubXJ1LAotICAgICAgIlNldCBvdXIgTVRVIiwgT1BUX0xJTUlUUywgTlVMTCwgTUFYTVJVLCBNSU5NUlUgfSwKLQotICAgIHsgIm5vcGNvbXAiLCBvX2Jvb2wsICZsY3Bfd2FudG9wdGlvbnNbMF0ubmVnX3Bjb21wcmVzc2lvbiwKLSAgICAgICJEaXNhYmxlIHByb3RvY29sIGZpZWxkIGNvbXByZXNzaW9uIiwKLSAgICAgIE9QVF9BMkNMUiwgJmxjcF9hbGxvd29wdGlvbnNbMF0ubmVnX3Bjb21wcmVzc2lvbiB9LAotICAgIHsgIi1wYyIsIG9fYm9vbCwgJmxjcF93YW50b3B0aW9uc1swXS5uZWdfcGNvbXByZXNzaW9uLAotICAgICAgIkRpc2FibGUgcHJvdG9jb2wgZmllbGQgY29tcHJlc3Npb24iLAotICAgICAgT1BUX0FMSUFTIHwgT1BUX0EyQ0xSLCAmbGNwX2FsbG93b3B0aW9uc1swXS5uZWdfcGNvbXByZXNzaW9uIH0sCi0KLSAgICB7ICJwYXNzaXZlIiwgb19ib29sLCAmbGNwX3dhbnRvcHRpb25zWzBdLnBhc3NpdmUsCi0gICAgICAiU2V0IHBhc3NpdmUgbW9kZSIsIDEgfSwKLSAgICB7ICItcCIsIG9fYm9vbCwgJmxjcF93YW50b3B0aW9uc1swXS5wYXNzaXZlLAotICAgICAgIlNldCBwYXNzaXZlIG1vZGUiLCBPUFRfQUxJQVMgfCAxIH0sCi0KLSAgICB7ICJzaWxlbnQiLCBvX2Jvb2wsICZsY3Bfd2FudG9wdGlvbnNbMF0uc2lsZW50LAotICAgICAgIlNldCBzaWxlbnQgbW9kZSIsIDEgfSwKLQotICAgIHsgImxjcC1lY2hvLWZhaWx1cmUiLCBvX2ludCwgJmxjcF9lY2hvX2ZhaWxzLAotICAgICAgIlNldCBudW1iZXIgb2YgY29uc2VjdXRpdmUgZWNobyBmYWlsdXJlcyB0byBpbmRpY2F0ZSBsaW5rIGZhaWx1cmUiLAotICAgICAgT1BUX1BSSU8gfSwKLSAgICB7ICJsY3AtZWNoby1pbnRlcnZhbCIsIG9faW50LCAmbGNwX2VjaG9faW50ZXJ2YWwsCi0gICAgICAiU2V0IHRpbWUgaW4gc2Vjb25kcyBiZXR3ZWVuIExDUCBlY2hvIHJlcXVlc3RzIiwgT1BUX1BSSU8gfSwKLSAgICB7ICJsY3AtcmVzdGFydCIsIG9faW50LCAmbGNwX2ZzbVswXS50aW1lb3V0dGltZSwKLSAgICAgICJTZXQgdGltZSBpbiBzZWNvbmRzIGJldHdlZW4gTENQIHJldHJhbnNtaXNzaW9ucyIsIE9QVF9QUklPIH0sCi0gICAgeyAibGNwLW1heC10ZXJtaW5hdGUiLCBvX2ludCwgJmxjcF9mc21bMF0ubWF4dGVybXRyYW5zbWl0cywKLSAgICAgICJTZXQgbWF4aW11bSBudW1iZXIgb2YgTENQIHRlcm1pbmF0ZS1yZXF1ZXN0IHRyYW5zbWlzc2lvbnMiLCBPUFRfUFJJTyB9LAotICAgIHsgImxjcC1tYXgtY29uZmlndXJlIiwgb19pbnQsICZsY3BfZnNtWzBdLm1heGNvbmZyZXF0cmFuc21pdHMsCi0gICAgICAiU2V0IG1heGltdW0gbnVtYmVyIG9mIExDUCBjb25maWd1cmUtcmVxdWVzdCB0cmFuc21pc3Npb25zIiwgT1BUX1BSSU8gfSwKLSAgICB7ICJsY3AtbWF4LWZhaWx1cmUiLCBvX2ludCwgJmxjcF9mc21bMF0ubWF4bmFrbG9vcHMsCi0gICAgICAiU2V0IGxpbWl0IG9uIG51bWJlciBvZiBMQ1AgY29uZmlndXJlLW5ha3MiLCBPUFRfUFJJTyB9LAotCi0gICAgeyAicmVjZWl2ZS1hbGwiLCBvX2Jvb2wsICZsYXhfcmVjdiwKLSAgICAgICJBY2NlcHQgYWxsIHJlY2VpdmVkIGNvbnRyb2wgY2hhcmFjdGVycyIsIDEgfSwKLQotI2lmZGVmIEhBVkVfTVVMVElMSU5LCi0gICAgeyAibXJydSIsIG9faW50LCAmbGNwX3dhbnRvcHRpb25zWzBdLm1ycnUsCi0gICAgICAiTWF4aW11bSByZWNlaXZlZCBwYWNrZXQgc2l6ZSBmb3IgbXVsdGlsaW5rIGJ1bmRsZSIsCi0gICAgICBPUFRfUFJJTywgJmxjcF93YW50b3B0aW9uc1swXS5uZWdfbXJydSB9LAotCi0gICAgeyAibXBzaG9ydHNlcSIsIG9fYm9vbCwgJmxjcF93YW50b3B0aW9uc1swXS5uZWdfc3NuaGYsCi0gICAgICAiVXNlIHNob3J0IHNlcXVlbmNlIG51bWJlcnMgaW4gbXVsdGlsaW5rIGhlYWRlcnMiLAotICAgICAgT1BUX1BSSU8gfCAxLCAmbGNwX2FsbG93b3B0aW9uc1swXS5uZWdfc3NuaGYgfSwKLSAgICB7ICJub21wc2hvcnRzZXEiLCBvX2Jvb2wsICZsY3Bfd2FudG9wdGlvbnNbMF0ubmVnX3NzbmhmLAotICAgICAgIkRvbid0IHVzZSBzaG9ydCBzZXF1ZW5jZSBudW1iZXJzIGluIG11bHRpbGluayBoZWFkZXJzIiwKLSAgICAgIE9QVF9QUklPU1VCIHwgT1BUX0EyQ0xSLCAmbGNwX2FsbG93b3B0aW9uc1swXS5uZWdfc3NuaGYgfSwKLQotICAgIHsgImVuZHBvaW50Iiwgb19zcGVjaWFsLCAodm9pZCAqKSBzZXRlbmRwb2ludCwKLSAgICAgICJFbmRwb2ludCBkaXNjcmltaW5hdG9yIGZvciBtdWx0aWxpbmsiLAotICAgICAgT1BUX1BSSU8gfCBPUFRfQTJQUklOVEVSLCAodm9pZCAqKSBwcmludGVuZHBvaW50IH0sCi0jZW5kaWYgLyogSEFWRV9NVUxUSUxJTksgKi8KLQotICAgIHsgIm5vZW5kcG9pbnQiLCBvX2Jvb2wsICZub2VuZHBvaW50LAotICAgICAgIkRvbid0IHNlbmQgb3IgYWNjZXB0IG11bHRpbGluayBlbmRwb2ludCBkaXNjcmltaW5hdG9yIiwgMSB9LAotCi0gICAge05VTEx9Ci19OwotCi0vKiBnbG9iYWwgdmFycyAqLwotZnNtIGxjcF9mc21bTlVNX1BQUF07CQkJLyogTENQIGZzbSBzdHJ1Y3R1cmUgKGdsb2JhbCkqLwotbGNwX29wdGlvbnMgbGNwX3dhbnRvcHRpb25zW05VTV9QUFBdOwkvKiBPcHRpb25zIHRoYXQgd2Ugd2FudCB0byByZXF1ZXN0ICovCi1sY3Bfb3B0aW9ucyBsY3BfZ290b3B0aW9uc1tOVU1fUFBQXTsJLyogT3B0aW9ucyB0aGF0IHBlZXIgYWNrJ2QgKi8KLWxjcF9vcHRpb25zIGxjcF9hbGxvd29wdGlvbnNbTlVNX1BQUF07CS8qIE9wdGlvbnMgd2UgYWxsb3cgcGVlciB0byByZXF1ZXN0ICovCi1sY3Bfb3B0aW9ucyBsY3BfaGlzb3B0aW9uc1tOVU1fUFBQXTsJLyogT3B0aW9ucyB0aGF0IHdlIGFjaydkICovCi0KLXN0YXRpYyBpbnQgbGNwX2VjaG9zX3BlbmRpbmcgPSAwOwkvKiBOdW1iZXIgb2Ygb3V0c3RhbmRpbmcgZWNobyBtc2dzICovCi1zdGF0aWMgaW50IGxjcF9lY2hvX251bWJlciAgID0gMDsJLyogSUQgbnVtYmVyIG9mIG5leHQgZWNobyBmcmFtZSAqLwotc3RhdGljIGludCBsY3BfZWNob190aW1lcl9ydW5uaW5nID0gMDsgIC8qIHNldCBpZiBhIHRpbWVyIGlzIHJ1bm5pbmcgKi8KLQotc3RhdGljIHVfY2hhciBuYWtfYnVmZmVyW1BQUF9NUlVdOwkvKiB3aGVyZSB3ZSBjb25zdHJ1Y3QgYSBuYWsgcGFja2V0ICovCi0KLS8qCi0gKiBDYWxsYmFja3MgZm9yIGZzbSBjb2RlLiAgKENJID0gQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbikKLSAqLwotc3RhdGljIHZvaWQgbGNwX3Jlc2V0Y2kgX19QKChmc20gKikpOwkvKiBSZXNldCBvdXIgQ0kgKi8KLXN0YXRpYyBpbnQgIGxjcF9jaWxlbiBfX1AoKGZzbSAqKSk7CQkvKiBSZXR1cm4gbGVuZ3RoIG9mIG91ciBDSSAqLwotc3RhdGljIHZvaWQgbGNwX2FkZGNpIF9fUCgoZnNtICosIHVfY2hhciAqLCBpbnQgKikpOyAvKiBBZGQgb3VyIENJIHRvIHBrdCAqLwotc3RhdGljIGludCAgbGNwX2Fja2NpIF9fUCgoZnNtICosIHVfY2hhciAqLCBpbnQpKTsgLyogUGVlciBhY2snZCBvdXIgQ0kgKi8KLXN0YXRpYyBpbnQgIGxjcF9uYWtjaSBfX1AoKGZzbSAqLCB1X2NoYXIgKiwgaW50LCBpbnQpKTsgLyogUGVlciBuYWsnZCBvdXIgQ0kgKi8KLXN0YXRpYyBpbnQgIGxjcF9yZWpjaSBfX1AoKGZzbSAqLCB1X2NoYXIgKiwgaW50KSk7IC8qIFBlZXIgcmVqJ2Qgb3VyIENJICovCi1zdGF0aWMgaW50ICBsY3BfcmVxY2kgX19QKChmc20gKiwgdV9jaGFyICosIGludCAqLCBpbnQpKTsgLyogUmN2IHBlZXIgQ0kgKi8KLXN0YXRpYyB2b2lkIGxjcF91cCBfX1AoKGZzbSAqKSk7CQkvKiBXZSdyZSBVUCAqLwotc3RhdGljIHZvaWQgbGNwX2Rvd24gX19QKChmc20gKikpOwkJLyogV2UncmUgRE9XTiAqLwotc3RhdGljIHZvaWQgbGNwX3N0YXJ0aW5nIF9fUCgoZnNtICopKTsJLyogV2UgbmVlZCBsb3dlciBsYXllciB1cCAqLwotc3RhdGljIHZvaWQgbGNwX2ZpbmlzaGVkIF9fUCgoZnNtICopKTsJLyogV2UgbmVlZCBsb3dlciBsYXllciBkb3duICovCi1zdGF0aWMgaW50ICBsY3BfZXh0Y29kZSBfX1AoKGZzbSAqLCBpbnQsIGludCwgdV9jaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgbGNwX3Jwcm90cmVqIF9fUCgoZnNtICosIHVfY2hhciAqLCBpbnQpKTsKLQotLyoKLSAqIHJvdXRpbmVzIHRvIHNlbmQgTENQIGVjaG9zIHRvIHBlZXIKLSAqLwotCi1zdGF0aWMgdm9pZCBsY3BfZWNob19sb3dlcnVwIF9fUCgoaW50KSk7Ci1zdGF0aWMgdm9pZCBsY3BfZWNob19sb3dlcmRvd24gX19QKChpbnQpKTsKLXN0YXRpYyB2b2lkIExjcEVjaG9UaW1lb3V0IF9fUCgodm9pZCAqKSk7Ci1zdGF0aWMgdm9pZCBsY3BfcmVjZWl2ZWRfZWNob19yZXBseSBfX1AoKGZzbSAqLCBpbnQsIHVfY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIExjcFNlbmRFY2hvUmVxdWVzdCBfX1AoKGZzbSAqKSk7Ci1zdGF0aWMgdm9pZCBMY3BMaW5rRmFpbHVyZSBfX1AoKGZzbSAqKSk7Ci1zdGF0aWMgdm9pZCBMY3BFY2hvQ2hlY2sgX19QKChmc20gKikpOwotCi1zdGF0aWMgZnNtX2NhbGxiYWNrcyBsY3BfY2FsbGJhY2tzID0gewkvKiBMQ1AgY2FsbGJhY2sgcm91dGluZXMgKi8KLSAgICBsY3BfcmVzZXRjaSwJCS8qIFJlc2V0IG91ciBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uICovCi0gICAgbGNwX2NpbGVuLAkJCS8qIExlbmd0aCBvZiBvdXIgQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbiAqLwotICAgIGxjcF9hZGRjaSwJCQkvKiBBZGQgb3VyIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gKi8KLSAgICBsY3BfYWNrY2ksCQkJLyogQUNLIG91ciBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uICovCi0gICAgbGNwX25ha2NpLAkJCS8qIE5BSyBvdXIgQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbiAqLwotICAgIGxjcF9yZWpjaSwJCQkvKiBSZWplY3Qgb3VyIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gKi8KLSAgICBsY3BfcmVxY2ksCQkJLyogUmVxdWVzdCBwZWVyJ3MgQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbiAqLwotICAgIGxjcF91cCwJCQkvKiBDYWxsZWQgd2hlbiBmc20gcmVhY2hlcyBPUEVORUQgc3RhdGUgKi8KLSAgICBsY3BfZG93biwJCQkvKiBDYWxsZWQgd2hlbiBmc20gbGVhdmVzIE9QRU5FRCBzdGF0ZSAqLwotICAgIGxjcF9zdGFydGluZywJCS8qIENhbGxlZCB3aGVuIHdlIHdhbnQgdGhlIGxvd2VyIGxheWVyIHVwICovCi0gICAgbGNwX2ZpbmlzaGVkLAkJLyogQ2FsbGVkIHdoZW4gd2Ugd2FudCB0aGUgbG93ZXIgbGF5ZXIgZG93biAqLwotICAgIE5VTEwsCQkJLyogQ2FsbGVkIHdoZW4gUHJvdG9jb2wtUmVqZWN0IHJlY2VpdmVkICovCi0gICAgTlVMTCwJCQkvKiBSZXRyYW5zbWlzc2lvbiBpcyBuZWNlc3NhcnkgKi8KLSAgICBsY3BfZXh0Y29kZSwJCS8qIENhbGxlZCB0byBoYW5kbGUgTENQLXNwZWNpZmljIGNvZGVzICovCi0gICAgIkxDUCIJCQkvKiBTdHJpbmcgbmFtZSBvZiBwcm90b2NvbCAqLwotfTsKLQotLyoKLSAqIFByb3RvY29sIGVudHJ5IHBvaW50cy4KLSAqIFNvbWUgb2YgdGhlc2UgYXJlIGNhbGxlZCBkaXJlY3RseS4KLSAqLwotCi1zdGF0aWMgdm9pZCBsY3BfaW5pdCBfX1AoKGludCkpOwotc3RhdGljIHZvaWQgbGNwX2lucHV0IF9fUCgoaW50LCB1X2NoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBsY3BfcHJvdHJlaiBfX1AoKGludCkpOwotc3RhdGljIGludCAgbGNwX3ByaW50cGt0IF9fUCgodV9jaGFyICosIGludCwKLQkJCSAgICAgIHZvaWQgKCopIF9fUCgodm9pZCAqLCBjaGFyICosIC4uLikpLCB2b2lkICopKTsKLQotc3RydWN0IHByb3RlbnQgbGNwX3Byb3RlbnQgPSB7Ci0gICAgUFBQX0xDUCwKLSAgICBsY3BfaW5pdCwKLSAgICBsY3BfaW5wdXQsCi0gICAgbGNwX3Byb3RyZWosCi0gICAgbGNwX2xvd2VydXAsCi0gICAgbGNwX2xvd2VyZG93biwKLSAgICBsY3Bfb3BlbiwKLSAgICBsY3BfY2xvc2UsCi0gICAgbGNwX3ByaW50cGt0LAotICAgIE5VTEwsCi0gICAgMSwKLSAgICAiTENQIiwKLSAgICBOVUxMLAotICAgIGxjcF9vcHRpb25fbGlzdCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTAotfTsKLQotaW50IGxjcF9sb29wYmFja2ZhaWwgPSBERUZMT09QQkFDS0ZBSUw7Ci0KLS8qCi0gKiBMZW5ndGggb2YgZWFjaCB0eXBlIG9mIGNvbmZpZ3VyYXRpb24gb3B0aW9uIChpbiBvY3RldHMpCi0gKi8KLSNkZWZpbmUgQ0lMRU5fVk9JRAkyCi0jZGVmaW5lIENJTEVOX0NIQVIJMwotI2RlZmluZSBDSUxFTl9TSE9SVAk0CS8qIENJTEVOX1ZPSUQgKyAyICovCi0jZGVmaW5lIENJTEVOX0NIQVAJNQkvKiBDSUxFTl9WT0lEICsgMiArIDEgKi8KLSNkZWZpbmUgQ0lMRU5fTE9ORwk2CS8qIENJTEVOX1ZPSUQgKyA0ICovCi0jZGVmaW5lIENJTEVOX0xRUgk4CS8qIENJTEVOX1ZPSUQgKyAyICsgNCAqLwotI2RlZmluZSBDSUxFTl9DQkNQCTMKLQotI2RlZmluZSBDT0RFTkFNRSh4KQkoKHgpID09IENPTkZBQ0sgPyAiQUNLIiA6IFwKLQkJCSAoeCkgPT0gQ09ORk5BSyA/ICJOQUsiIDogIlJFSiIpCi0KLS8qCi0gKiBub29wdCAtIERpc2FibGUgYWxsIG9wdGlvbnMgKHdoeT8pLgotICovCi1zdGF0aWMgaW50Ci1ub29wdChhcmd2KQotICAgIGNoYXIgKiphcmd2OwotewotICAgIEJaRVJPKChjaGFyICopICZsY3Bfd2FudG9wdGlvbnNbMF0sIHNpemVvZiAoc3RydWN0IGxjcF9vcHRpb25zKSk7Ci0gICAgQlpFUk8oKGNoYXIgKikgJmxjcF9hbGxvd29wdGlvbnNbMF0sIHNpemVvZiAoc3RydWN0IGxjcF9vcHRpb25zKSk7Ci0KLSAgICByZXR1cm4gKDEpOwotfQotCi0jaWZkZWYgSEFWRV9NVUxUSUxJTksKLXN0YXRpYyBpbnQKLXNldGVuZHBvaW50KGFyZ3YpCi0gICAgY2hhciAqKmFyZ3Y7Ci17Ci0gICAgaWYgKHN0cl90b19lcGRpc2MoJmxjcF93YW50b3B0aW9uc1swXS5lbmRwb2ludCwgKmFyZ3YpKSB7Ci0JbGNwX3dhbnRvcHRpb25zWzBdLm5lZ19lbmRwb2ludCA9IDE7Ci0JcmV0dXJuIDE7Ci0gICAgfQotICAgIG9wdGlvbl9lcnJvcigiQ2FuJ3QgcGFyc2UgJyVzJyBhcyBhbiBlbmRwb2ludCBkaXNjcmltaW5hdG9yIiwgKmFyZ3YpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRlbmRwb2ludChvcHQsIHByaW50ZXIsIGFyZykKLSAgICBvcHRpb25fdCAqb3B0OwotICAgIHZvaWQgKCpwcmludGVyKSBfX1AoKHZvaWQgKiwgY2hhciAqLCAuLi4pKTsKLSAgICB2b2lkICphcmc7Ci17Ci0JcHJpbnRlcihhcmcsICIlcyIsIGVwZGlzY190b19zdHIoJmxjcF93YW50b3B0aW9uc1swXS5lbmRwb2ludCkpOwotfQotI2VuZGlmIC8qIEhBVkVfTVVMVElMSU5LICovCi0KLS8qCi0gKiBsY3BfaW5pdCAtIEluaXRpYWxpemUgTENQLgotICovCi1zdGF0aWMgdm9pZAotbGNwX2luaXQodW5pdCkKLSAgICBpbnQgdW5pdDsKLXsKLSAgICBmc20gKmYgPSAmbGNwX2ZzbVt1bml0XTsKLSAgICBsY3Bfb3B0aW9ucyAqd28gPSAmbGNwX3dhbnRvcHRpb25zW3VuaXRdOwotICAgIGxjcF9vcHRpb25zICphbyA9ICZsY3BfYWxsb3dvcHRpb25zW3VuaXRdOwotCi0gICAgZi0+dW5pdCA9IHVuaXQ7Ci0gICAgZi0+cHJvdG9jb2wgPSBQUFBfTENQOwotICAgIGYtPmNhbGxiYWNrcyA9ICZsY3BfY2FsbGJhY2tzOwotCi0gICAgZnNtX2luaXQoZik7Ci0KLSAgICBCWkVSTyh3bywgc2l6ZW9mKCp3bykpOwotICAgIHdvLT5uZWdfbXJ1ID0gMTsKLSAgICB3by0+bXJ1ID0gREVGTVJVOwotICAgIHdvLT5uZWdfYXN5bmNtYXAgPSAxOwotICAgIHdvLT5uZWdfbWFnaWNudW1iZXIgPSAxOwotICAgIHdvLT5uZWdfcGNvbXByZXNzaW9uID0gMTsKLSAgICB3by0+bmVnX2FjY29tcHJlc3Npb24gPSAxOwotCi0gICAgQlpFUk8oYW8sIHNpemVvZigqYW8pKTsKLSAgICBhby0+bmVnX21ydSA9IDE7Ci0gICAgYW8tPm1ydSA9IE1BWE1SVTsKLSAgICBhby0+bmVnX2FzeW5jbWFwID0gMTsKLSAgICBhby0+bmVnX2NoYXAgPSAxOwotICAgIGFvLT5jaGFwX21kdHlwZSA9IGNoYXBfbWR0eXBlX2FsbDsKLSAgICBhby0+bmVnX3VwYXAgPSAxOwotICAgIGFvLT5uZWdfZWFwID0gMTsKLSAgICBhby0+bmVnX21hZ2ljbnVtYmVyID0gMTsKLSAgICBhby0+bmVnX3Bjb21wcmVzc2lvbiA9IDE7Ci0gICAgYW8tPm5lZ19hY2NvbXByZXNzaW9uID0gMTsKLSAgICBhby0+bmVnX2VuZHBvaW50ID0gMTsKLX0KLQotCi0vKgotICogbGNwX29wZW4gLSBMQ1AgaXMgYWxsb3dlZCB0byBjb21lIHVwLgotICovCi12b2lkCi1sY3Bfb3Blbih1bml0KQotICAgIGludCB1bml0OwotewotICAgIGZzbSAqZiA9ICZsY3BfZnNtW3VuaXRdOwotICAgIGxjcF9vcHRpb25zICp3byA9ICZsY3Bfd2FudG9wdGlvbnNbdW5pdF07Ci0KLSAgICBmLT5mbGFncyAmPSB+KE9QVF9QQVNTSVZFIHwgT1BUX1NJTEVOVCk7Ci0gICAgaWYgKHdvLT5wYXNzaXZlKQotCWYtPmZsYWdzIHw9IE9QVF9QQVNTSVZFOwotICAgIGlmICh3by0+c2lsZW50KQotCWYtPmZsYWdzIHw9IE9QVF9TSUxFTlQ7Ci0gICAgZnNtX29wZW4oZik7Ci19Ci0KLQotLyoKLSAqIGxjcF9jbG9zZSAtIFRha2UgTENQIGRvd24uCi0gKi8KLXZvaWQKLWxjcF9jbG9zZSh1bml0LCByZWFzb24pCi0gICAgaW50IHVuaXQ7Ci0gICAgY2hhciAqcmVhc29uOwotewotICAgIGZzbSAqZiA9ICZsY3BfZnNtW3VuaXRdOwotICAgIGludCBvbGRzdGF0ZTsKLQotICAgIGlmIChwaGFzZSAhPSBQSEFTRV9ERUFEICYmIHBoYXNlICE9IFBIQVNFX01BU1RFUikKLQluZXdfcGhhc2UoUEhBU0VfVEVSTUlOQVRFKTsKLQotICAgIGlmIChmLT5mbGFncyAmIERFTEFZRURfVVApIHsKLQl1bnRpbWVvdXQobGNwX2RlbGF5ZWRfdXAsIGYpOwotCWYtPnN0YXRlID0gU1RPUFBFRDsKLSAgICB9Ci0gICAgb2xkc3RhdGUgPSBmLT5zdGF0ZTsKLQotICAgIGZzbV9jbG9zZShmLCByZWFzb24pOwotICAgIGlmIChvbGRzdGF0ZSA9PSBTVE9QUEVEICYmIGYtPmZsYWdzICYgKE9QVF9QQVNTSVZFfE9QVF9TSUxFTlR8REVMQVlFRF9VUCkpIHsKLQkvKgotCSAqIFRoaXMgYWN0aW9uIGlzIG5vdCBzdHJpY3RseSBhY2NvcmRpbmcgdG8gdGhlIEZTTSBpbiBSRkMxNTQ4LAotCSAqIGJ1dCBpdCBkb2VzIG1lYW4gdGhhdCB0aGUgcHJvZ3JhbSB0ZXJtaW5hdGVzIGlmIHlvdSBkbyBhCi0JICogbGNwX2Nsb3NlKCkgd2hlbiBhIGNvbm5lY3Rpb24gaGFzbid0IGJlZW4gZXN0YWJsaXNoZWQKLQkgKiBiZWNhdXNlIHdlIGFyZSBpbiBwYXNzaXZlL3NpbGVudCBtb2RlIG9yIGJlY2F1c2Ugd2UgaGF2ZQotCSAqIGRlbGF5ZWQgdGhlIGZzbV9sb3dlcnVwKCkgY2FsbCBhbmQgaXQgaGFzbid0IGhhcHBlbmVkIHlldC4KLQkgKi8KLQlmLT5mbGFncyAmPSB+REVMQVlFRF9VUDsKLQlsY3BfZmluaXNoZWQoZik7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBsY3BfbG93ZXJ1cCAtIFRoZSBsb3dlciBsYXllciBpcyB1cC4KLSAqLwotdm9pZAotbGNwX2xvd2VydXAodW5pdCkKLSAgICBpbnQgdW5pdDsKLXsKLSAgICBsY3Bfb3B0aW9ucyAqd28gPSAmbGNwX3dhbnRvcHRpb25zW3VuaXRdOwotICAgIGZzbSAqZiA9ICZsY3BfZnNtW3VuaXRdOwotCi0gICAgLyoKLSAgICAgKiBEb24ndCB1c2UgQS9DIG9yIHByb3RvY29sIGNvbXByZXNzaW9uIG9uIHRyYW5zbWlzc2lvbiwKLSAgICAgKiBidXQgYWNjZXB0IEEvQyBhbmQgcHJvdG9jb2wgY29tcHJlc3NlZCBwYWNrZXRzCi0gICAgICogaWYgd2UgYXJlIGdvaW5nIHRvIGFzayBmb3IgQS9DIGFuZCBwcm90b2NvbCBjb21wcmVzc2lvbi4KLSAgICAgKi8KLSAgICBpZiAocHBwX3NlbmRfY29uZmlnKHVuaXQsIFBQUF9NUlUsIDB4ZmZmZmZmZmYsIDAsIDApIDwgMAotCXx8IHBwcF9yZWN2X2NvbmZpZyh1bml0LCBQUFBfTVJVLCAobGF4X3JlY3Y/IDA6IDB4ZmZmZmZmZmYpLAotCQkJICAgd28tPm5lZ19wY29tcHJlc3Npb24sIHdvLT5uZWdfYWNjb21wcmVzc2lvbikgPCAwKQotCSAgICByZXR1cm47Ci0gICAgcGVlcl9tcnVbdW5pdF0gPSBQUFBfTVJVOwotCi0gICAgaWYgKGxpc3Rlbl90aW1lICE9IDApIHsKLQlmLT5mbGFncyB8PSBERUxBWUVEX1VQOwotCXRpbWVvdXQobGNwX2RlbGF5ZWRfdXAsIGYsIDAsIGxpc3Rlbl90aW1lICogMTAwMCk7Ci0gICAgfSBlbHNlCi0JZnNtX2xvd2VydXAoZik7Ci19Ci0KLQotLyoKLSAqIGxjcF9sb3dlcmRvd24gLSBUaGUgbG93ZXIgbGF5ZXIgaXMgZG93bi4KLSAqLwotdm9pZAotbGNwX2xvd2VyZG93bih1bml0KQotICAgIGludCB1bml0OwotewotICAgIGZzbSAqZiA9ICZsY3BfZnNtW3VuaXRdOwotCi0gICAgaWYgKGYtPmZsYWdzICYgREVMQVlFRF9VUCkgewotCWYtPmZsYWdzICY9IH5ERUxBWUVEX1VQOwotCXVudGltZW91dChsY3BfZGVsYXllZF91cCwgZik7Ci0gICAgfSBlbHNlCi0JZnNtX2xvd2VyZG93bigmbGNwX2ZzbVt1bml0XSk7Ci19Ci0KLQotLyoKLSAqIGxjcF9kZWxheWVkX3VwIC0gQnJpbmcgdGhlIGxvd2VyIGxheWVyIHVwIG5vdy4KLSAqLwotc3RhdGljIHZvaWQKLWxjcF9kZWxheWVkX3VwKGFyZykKLSAgICB2b2lkICphcmc7Ci17Ci0gICAgZnNtICpmID0gYXJnOwotCi0gICAgaWYgKGYtPmZsYWdzICYgREVMQVlFRF9VUCkgewotCWYtPmZsYWdzICY9IH5ERUxBWUVEX1VQOwotCWZzbV9sb3dlcnVwKGYpOwotICAgIH0KLX0KLQotCi0vKgotICogbGNwX2lucHV0IC0gSW5wdXQgTENQIHBhY2tldC4KLSAqLwotc3RhdGljIHZvaWQKLWxjcF9pbnB1dCh1bml0LCBwLCBsZW4pCi0gICAgaW50IHVuaXQ7Ci0gICAgdV9jaGFyICpwOwotICAgIGludCBsZW47Ci17Ci0gICAgZnNtICpmID0gJmxjcF9mc21bdW5pdF07Ci0KLSAgICBpZiAoZi0+ZmxhZ3MgJiBERUxBWUVEX1VQKSB7Ci0JZi0+ZmxhZ3MgJj0gfkRFTEFZRURfVVA7Ci0JdW50aW1lb3V0KGxjcF9kZWxheWVkX3VwLCBmKTsKLQlmc21fbG93ZXJ1cChmKTsKLSAgICB9Ci0gICAgZnNtX2lucHV0KGYsIHAsIGxlbik7Ci19Ci0KLS8qCi0gKiBsY3BfZXh0Y29kZSAtIEhhbmRsZSBhIExDUC1zcGVjaWZpYyBjb2RlLgotICovCi1zdGF0aWMgaW50Ci1sY3BfZXh0Y29kZShmLCBjb2RlLCBpZCwgaW5wLCBsZW4pCi0gICAgZnNtICpmOwotICAgIGludCBjb2RlLCBpZDsKLSAgICB1X2NoYXIgKmlucDsKLSAgICBpbnQgbGVuOwotewotICAgIHVfY2hhciAqbWFncDsKLQotICAgIHN3aXRjaCggY29kZSApewotICAgIGNhc2UgUFJPVFJFSjoKLQlsY3BfcnByb3RyZWooZiwgaW5wLCBsZW4pOwotCWJyZWFrOwotICAgIAotICAgIGNhc2UgRUNIT1JFUToKLQlpZiAoZi0+c3RhdGUgIT0gT1BFTkVEKQotCSAgICBicmVhazsKLQltYWdwID0gaW5wOwotCVBVVExPTkcobGNwX2dvdG9wdGlvbnNbZi0+dW5pdF0ubWFnaWNudW1iZXIsIG1hZ3ApOwotCWZzbV9zZGF0YShmLCBFQ0hPUkVQLCBpZCwgaW5wLCBsZW4pOwotCWJyZWFrOwotICAgIAotICAgIGNhc2UgRUNIT1JFUDoKLQlsY3BfcmVjZWl2ZWRfZWNob19yZXBseShmLCBpZCwgaW5wLCBsZW4pOwotCWJyZWFrOwotCi0gICAgY2FzZSBESVNDUkVROgotICAgIGNhc2UgSURFTlRJRjoKLSAgICBjYXNlIFRJTUVSRU06Ci0JYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotCXJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotICAgIAotLyoKLSAqIGxjcF9ycHJvdHJlaiAtIFJlY2VpdmUgYW4gUHJvdG9jb2wtUmVqZWN0LgotICoKLSAqIEZpZ3VyZSBvdXQgd2hpY2ggcHJvdG9jb2wgaXMgcmVqZWN0ZWQgYW5kIGluZm9ybSBpdC4KLSAqLwotc3RhdGljIHZvaWQKLWxjcF9ycHJvdHJlaihmLCBpbnAsIGxlbikKLSAgICBmc20gKmY7Ci0gICAgdV9jaGFyICppbnA7Ci0gICAgaW50IGxlbjsKLXsKLSAgICBpbnQgaTsKLSAgICBzdHJ1Y3QgcHJvdGVudCAqcHJvdHA7Ci0gICAgdV9zaG9ydCBwcm90OwotICAgIGNvbnN0IGNoYXIgKnBuYW1lOwotCi0gICAgaWYgKGxlbiA8IDIpIHsKLQlMQ1BERUJVRygoImxjcF9ycHJvdHJlajogUmN2ZCBzaG9ydCBQcm90b2NvbC1SZWplY3QgcGFja2V0ISIpKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgR0VUU0hPUlQocHJvdCwgaW5wKTsKLQotICAgIC8qCi0gICAgICogUHJvdG9jb2wtUmVqZWN0IHBhY2tldHMgcmVjZWl2ZWQgaW4gYW55IHN0YXRlIG90aGVyIHRoYW4gdGhlIExDUAotICAgICAqIE9QRU5FRCBzdGF0ZSBTSE9VTEQgYmUgc2lsZW50bHkgZGlzY2FyZGVkLgotICAgICAqLwotICAgIGlmKCBmLT5zdGF0ZSAhPSBPUEVORUQgKXsKLQlMQ1BERUJVRygoIlByb3RvY29sLVJlamVjdCBkaXNjYXJkZWQ6IExDUCBpbiBzdGF0ZSAlZCIsIGYtPnN0YXRlKSk7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIHBuYW1lID0gcHJvdG9jb2xfbmFtZShwcm90KTsKLQotICAgIC8qCi0gICAgICogVXBjYWxsIHRoZSBwcm9wZXIgUHJvdG9jb2wtUmVqZWN0IHJvdXRpbmUuCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgKHByb3RwID0gcHJvdG9jb2xzW2ldKSAhPSBOVUxMOyArK2kpCi0JaWYgKHByb3RwLT5wcm90b2NvbCA9PSBwcm90ICYmIHByb3RwLT5lbmFibGVkX2ZsYWcpIHsKLQkgICAgaWYgKHBuYW1lID09IE5VTEwpCi0JCWRiZ2xvZygiUHJvdG9jb2wtUmVqZWN0IGZvciAweCV4IHJlY2VpdmVkIiwgcHJvdCk7Ci0JICAgIGVsc2UKLQkJZGJnbG9nKCJQcm90b2NvbC1SZWplY3QgZm9yICclcycgKDB4JXgpIHJlY2VpdmVkIiwgcG5hbWUsCi0JCSAgICAgICBwcm90KTsKLQkgICAgKCpwcm90cC0+cHJvdHJlaikoZi0+dW5pdCk7Ci0JICAgIHJldHVybjsKLQl9Ci0KLSAgICBpZiAocG5hbWUgPT0gTlVMTCkKLQl3YXJuKCJQcm90b2NvbC1SZWplY3QgZm9yIHVuc3VwcG9ydGVkIHByb3RvY29sIDB4JXgiLCBwcm90KTsKLSAgICBlbHNlCi0Jd2FybigiUHJvdG9jb2wtUmVqZWN0IGZvciB1bnN1cHBvcnRlZCBwcm90b2NvbCAnJXMnICgweCV4KSIsIHBuYW1lLAotCSAgICAgcHJvdCk7Ci19Ci0KLQotLyoKLSAqIGxjcF9wcm90cmVqIC0gQSBQcm90b2NvbC1SZWplY3Qgd2FzIHJlY2VpdmVkLgotICovCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi1sY3BfcHJvdHJlaih1bml0KQotICAgIGludCB1bml0OwotewotICAgIC8qCi0gICAgICogQ2FuJ3QgcmVqZWN0IExDUCEKLSAgICAgKi8KLSAgICBlcnJvcigiUmVjZWl2ZWQgUHJvdG9jb2wtUmVqZWN0IGZvciBMQ1AhIik7Ci0gICAgZnNtX3Byb3RyZWplY3QoJmxjcF9mc21bdW5pdF0pOwotfQotCi0KLS8qCi0gKiBsY3Bfc3Byb3RyZWogLSBTZW5kIGEgUHJvdG9jb2wtUmVqZWN0IGZvciBzb21lIHByb3RvY29sLgotICovCi12b2lkCi1sY3Bfc3Byb3RyZWoodW5pdCwgcCwgbGVuKQotICAgIGludCB1bml0OwotICAgIHVfY2hhciAqcDsKLSAgICBpbnQgbGVuOwotewotICAgIC8qCi0gICAgICogU2VuZCBiYWNrIHRoZSBwcm90b2NvbCBhbmQgdGhlIGluZm9ybWF0aW9uIGZpZWxkIG9mIHRoZQotICAgICAqIHJlamVjdGVkIHBhY2tldC4gIFdlIG9ubHkgZ2V0IGhlcmUgaWYgTENQIGlzIGluIHRoZSBPUEVORUQgc3RhdGUuCi0gICAgICovCi0gICAgcCArPSAyOwotICAgIGxlbiAtPSAyOwotCi0gICAgZnNtX3NkYXRhKCZsY3BfZnNtW3VuaXRdLCBQUk9UUkVKLCArK2xjcF9mc21bdW5pdF0uaWQsCi0JICAgICAgcCwgbGVuKTsKLX0KLQotCi0vKgotICogbGNwX3Jlc2V0Y2kgLSBSZXNldCBvdXIgQ0kuCi0gKi8KLXN0YXRpYyB2b2lkCi1sY3BfcmVzZXRjaShmKQotICAgIGZzbSAqZjsKLXsKLSAgICBsY3Bfb3B0aW9ucyAqd28gPSAmbGNwX3dhbnRvcHRpb25zW2YtPnVuaXRdOwotICAgIGxjcF9vcHRpb25zICpnbyA9ICZsY3BfZ290b3B0aW9uc1tmLT51bml0XTsKLSAgICBsY3Bfb3B0aW9ucyAqYW8gPSAmbGNwX2FsbG93b3B0aW9uc1tmLT51bml0XTsKLQotICAgIHdvLT5tYWdpY251bWJlciA9IG1hZ2ljKCk7Ci0gICAgd28tPm51bWxvb3BzID0gMDsKLSAgICAqZ28gPSAqd287Ci0gICAgaWYgKCFtdWx0aWxpbmspIHsKLQlnby0+bmVnX21ycnUgPSAwOwotCWdvLT5uZWdfc3NuaGYgPSAwOwotCWdvLT5uZWdfZW5kcG9pbnQgPSAwOwotICAgIH0KLSAgICBpZiAobm9lbmRwb2ludCkKLQlhby0+bmVnX2VuZHBvaW50ID0gMDsKLSAgICBwZWVyX21ydVtmLT51bml0XSA9IFBQUF9NUlU7Ci0gICAgYXV0aF9yZXNldChmLT51bml0KTsKLX0KLQotCi0vKgotICogbGNwX2NpbGVuIC0gUmV0dXJuIGxlbmd0aCBvZiBvdXIgQ0kuCi0gKi8KLXN0YXRpYyBpbnQKLWxjcF9jaWxlbihmKQotICAgIGZzbSAqZjsKLXsKLSAgICBsY3Bfb3B0aW9ucyAqZ28gPSAmbGNwX2dvdG9wdGlvbnNbZi0+dW5pdF07Ci0KLSNkZWZpbmUgTEVOQ0lWT0lEKG5lZykJKChuZWcpID8gQ0lMRU5fVk9JRCA6IDApCi0jZGVmaW5lIExFTkNJQ0hBUChuZWcpCSgobmVnKSA/IENJTEVOX0NIQVAgOiAwKQotI2RlZmluZSBMRU5DSVNIT1JUKG5lZykJKChuZWcpID8gQ0lMRU5fU0hPUlQgOiAwKQotI2RlZmluZSBMRU5DSUxPTkcobmVnKQkoKG5lZykgPyBDSUxFTl9MT05HIDogMCkKLSNkZWZpbmUgTEVOQ0lMUVIobmVnKQkoKG5lZykgPyBDSUxFTl9MUVI6IDApCi0jZGVmaW5lIExFTkNJQ0JDUChuZWcpCSgobmVnKSA/IENJTEVOX0NCQ1A6IDApCi0gICAgLyoKLSAgICAgKiBOQjogd2Ugb25seSBhc2sgZm9yIG9uZSBvZiBDSEFQLCBVUEFQLCBvciBFQVAsIGV2ZW4gaWYgd2Ugd2lsbAotICAgICAqIGFjY2VwdCBtb3JlIHRoYW4gb25lLiAgV2UgcHJlZmVyIEVBUCBmaXJzdCwgdGhlbiBDSEFQLCB0aGVuCi0gICAgICogUEFQLgotICAgICAqLwotICAgIHJldHVybiAoTEVOQ0lTSE9SVChnby0+bmVnX21ydSAmJiBnby0+bXJ1ICE9IERFRk1SVSkgKwotCSAgICBMRU5DSUxPTkcoZ28tPm5lZ19hc3luY21hcCAmJiBnby0+YXN5bmNtYXAgIT0gMHhGRkZGRkZGRikgKwotCSAgICBMRU5DSVNIT1JUKGdvLT5uZWdfZWFwKSArCi0JICAgIExFTkNJQ0hBUCghZ28tPm5lZ19lYXAgJiYgZ28tPm5lZ19jaGFwKSArCi0JICAgIExFTkNJU0hPUlQoIWdvLT5uZWdfZWFwICYmICFnby0+bmVnX2NoYXAgJiYgZ28tPm5lZ191cGFwKSArCi0JICAgIExFTkNJTFFSKGdvLT5uZWdfbHFyKSArCi0JICAgIExFTkNJQ0JDUChnby0+bmVnX2NiY3ApICsKLQkgICAgTEVOQ0lMT05HKGdvLT5uZWdfbWFnaWNudW1iZXIpICsKLQkgICAgTEVOQ0lWT0lEKGdvLT5uZWdfcGNvbXByZXNzaW9uKSArCi0JICAgIExFTkNJVk9JRChnby0+bmVnX2FjY29tcHJlc3Npb24pICsKLQkgICAgTEVOQ0lTSE9SVChnby0+bmVnX21ycnUpICsKLQkgICAgTEVOQ0lWT0lEKGdvLT5uZWdfc3NuaGYpICsKLQkgICAgKGdvLT5uZWdfZW5kcG9pbnQ/IENJTEVOX0NIQVIgKyBnby0+ZW5kcG9pbnQubGVuZ3RoOiAwKSk7Ci19Ci0KLQotLyoKLSAqIGxjcF9hZGRjaSAtIEFkZCBvdXIgZGVzaXJlZCBDSXMgdG8gYSBwYWNrZXQuCi0gKi8KLXN0YXRpYyB2b2lkCi1sY3BfYWRkY2koZiwgdWNwLCBsZW5wKQotICAgIGZzbSAqZjsKLSAgICB1X2NoYXIgKnVjcDsKLSAgICBpbnQgKmxlbnA7Ci17Ci0gICAgbGNwX29wdGlvbnMgKmdvID0gJmxjcF9nb3RvcHRpb25zW2YtPnVuaXRdOwotICAgIHVfY2hhciAqc3RhcnRfdWNwID0gdWNwOwotCi0jZGVmaW5lIEFERENJVk9JRChvcHQsIG5lZykgXAotICAgIGlmIChuZWcpIHsgXAotCVBVVENIQVIob3B0LCB1Y3ApOyBcCi0JUFVUQ0hBUihDSUxFTl9WT0lELCB1Y3ApOyBcCi0gICAgfQotI2RlZmluZSBBRERDSVNIT1JUKG9wdCwgbmVnLCB2YWwpIFwKLSAgICBpZiAobmVnKSB7IFwKLQlQVVRDSEFSKG9wdCwgdWNwKTsgXAotCVBVVENIQVIoQ0lMRU5fU0hPUlQsIHVjcCk7IFwKLQlQVVRTSE9SVCh2YWwsIHVjcCk7IFwKLSAgICB9Ci0jZGVmaW5lIEFERENJQ0hBUChvcHQsIG5lZywgdmFsKSBcCi0gICAgaWYgKG5lZykgeyBcCi0JUFVUQ0hBUigob3B0KSwgdWNwKTsgXAotCVBVVENIQVIoQ0lMRU5fQ0hBUCwgdWNwKTsgXAotCVBVVFNIT1JUKFBQUF9DSEFQLCB1Y3ApOyBcCi0JUFVUQ0hBUigoQ0hBUF9ESUdFU1QodmFsKSksIHVjcCk7IFwKLSAgICB9Ci0jZGVmaW5lIEFERENJTE9ORyhvcHQsIG5lZywgdmFsKSBcCi0gICAgaWYgKG5lZykgeyBcCi0JUFVUQ0hBUihvcHQsIHVjcCk7IFwKLQlQVVRDSEFSKENJTEVOX0xPTkcsIHVjcCk7IFwKLQlQVVRMT05HKHZhbCwgdWNwKTsgXAotICAgIH0KLSNkZWZpbmUgQUREQ0lMUVIob3B0LCBuZWcsIHZhbCkgXAotICAgIGlmIChuZWcpIHsgXAotCVBVVENIQVIob3B0LCB1Y3ApOyBcCi0JUFVUQ0hBUihDSUxFTl9MUVIsIHVjcCk7IFwKLQlQVVRTSE9SVChQUFBfTFFSLCB1Y3ApOyBcCi0JUFVUTE9ORyh2YWwsIHVjcCk7IFwKLSAgICB9Ci0jZGVmaW5lIEFERENJQ0hBUihvcHQsIG5lZywgdmFsKSBcCi0gICAgaWYgKG5lZykgeyBcCi0JUFVUQ0hBUihvcHQsIHVjcCk7IFwKLQlQVVRDSEFSKENJTEVOX0NIQVIsIHVjcCk7IFwKLQlQVVRDSEFSKHZhbCwgdWNwKTsgXAotICAgIH0KLSNkZWZpbmUgQUREQ0lFTkRQKG9wdCwgbmVnLCBjbGFzcywgdmFsLCBsZW4pIFwKLSAgICBpZiAobmVnKSB7IFwKLQlpbnQgaTsgXAotCVBVVENIQVIob3B0LCB1Y3ApOyBcCi0JUFVUQ0hBUihDSUxFTl9DSEFSICsgbGVuLCB1Y3ApOyBcCi0JUFVUQ0hBUihjbGFzcywgdWNwKTsgXAotCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgXAotCSAgICBQVVRDSEFSKHZhbFtpXSwgdWNwKTsgXAotICAgIH0KLQotICAgIEFERENJU0hPUlQoQ0lfTVJVLCBnby0+bmVnX21ydSAmJiBnby0+bXJ1ICE9IERFRk1SVSwgZ28tPm1ydSk7Ci0gICAgQUREQ0lMT05HKENJX0FTWU5DTUFQLCBnby0+bmVnX2FzeW5jbWFwICYmIGdvLT5hc3luY21hcCAhPSAweEZGRkZGRkZGLAotCSAgICAgIGdvLT5hc3luY21hcCk7Ci0gICAgQUREQ0lTSE9SVChDSV9BVVRIVFlQRSwgZ28tPm5lZ19lYXAsIFBQUF9FQVApOwotICAgIEFERENJQ0hBUChDSV9BVVRIVFlQRSwgIWdvLT5uZWdfZWFwICYmIGdvLT5uZWdfY2hhcCwgZ28tPmNoYXBfbWR0eXBlKTsKLSAgICBBRERDSVNIT1JUKENJX0FVVEhUWVBFLCAhZ28tPm5lZ19lYXAgJiYgIWdvLT5uZWdfY2hhcCAmJiBnby0+bmVnX3VwYXAsCi0JICAgICAgIFBQUF9QQVApOwotICAgIEFERENJTFFSKENJX1FVQUxJVFksIGdvLT5uZWdfbHFyLCBnby0+bHFyX3BlcmlvZCk7Ci0gICAgQUREQ0lDSEFSKENJX0NBTExCQUNLLCBnby0+bmVnX2NiY3AsIENCQ1BfT1BUKTsKLSAgICBBRERDSUxPTkcoQ0lfTUFHSUNOVU1CRVIsIGdvLT5uZWdfbWFnaWNudW1iZXIsIGdvLT5tYWdpY251bWJlcik7Ci0gICAgQUREQ0lWT0lEKENJX1BDT01QUkVTU0lPTiwgZ28tPm5lZ19wY29tcHJlc3Npb24pOwotICAgIEFERENJVk9JRChDSV9BQ0NPTVBSRVNTSU9OLCBnby0+bmVnX2FjY29tcHJlc3Npb24pOwotICAgIEFERENJU0hPUlQoQ0lfTVJSVSwgZ28tPm5lZ19tcnJ1LCBnby0+bXJydSk7Ci0gICAgQUREQ0lWT0lEKENJX1NTTkhGLCBnby0+bmVnX3NzbmhmKTsKLSAgICBBRERDSUVORFAoQ0lfRVBESVNDLCBnby0+bmVnX2VuZHBvaW50LCBnby0+ZW5kcG9pbnQuY2xhc3MsCi0JICAgICAgZ28tPmVuZHBvaW50LnZhbHVlLCBnby0+ZW5kcG9pbnQubGVuZ3RoKTsKLQotICAgIGlmICh1Y3AgLSBzdGFydF91Y3AgIT0gKmxlbnApIHsKLQkvKiB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIGJlY2F1c2UgcGVlcl9tdHUgc2hvdWxkIGJlIDE1MDAgKi8KLQllcnJvcigiQnVnIGluIGxjcF9hZGRjaTogd3JvbmcgbGVuZ3RoIik7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBsY3BfYWNrY2kgLSBBY2sgb3VyIENJcy4KLSAqIFRoaXMgc2hvdWxkIG5vdCBtb2RpZnkgYW55IHN0YXRlIGlmIHRoZSBBY2sgaXMgYmFkLgotICoKLSAqIFJldHVybnM6Ci0gKgkwIC0gQWNrIHdhcyBiYWQuCi0gKgkxIC0gQWNrIHdhcyBnb29kLgotICovCi1zdGF0aWMgaW50Ci1sY3BfYWNrY2koZiwgcCwgbGVuKQotICAgIGZzbSAqZjsKLSAgICB1X2NoYXIgKnA7Ci0gICAgaW50IGxlbjsKLXsKLSAgICBsY3Bfb3B0aW9ucyAqZ28gPSAmbGNwX2dvdG9wdGlvbnNbZi0+dW5pdF07Ci0gICAgdV9jaGFyIGNpbGVuLCBjaXR5cGUsIGNpY2hhcjsKLSAgICB1X3Nob3J0IGNpc2hvcnQ7Ci0gICAgdV9pbnQzMl90IGNpbG9uZzsKLQotICAgIC8qCi0gICAgICogQ0lzIG11c3QgYmUgaW4gZXhhY3RseSB0aGUgc2FtZSBvcmRlciB0aGF0IHdlIHNlbnQuCi0gICAgICogQ2hlY2sgcGFja2V0IGxlbmd0aCBhbmQgQ0kgbGVuZ3RoIGF0IGVhY2ggc3RlcC4KLSAgICAgKiBJZiB3ZSBmaW5kIGFueSBkZXZpYXRpb25zLCB0aGVuIHRoaXMgcGFja2V0IGlzIGJhZC4KLSAgICAgKi8KLSNkZWZpbmUgQUNLQ0lWT0lEKG9wdCwgbmVnKSBcCi0gICAgaWYgKG5lZykgeyBcCi0JaWYgKChsZW4gLT0gQ0lMRU5fVk9JRCkgPCAwKSBcCi0JICAgIGdvdG8gYmFkOyBcCi0JR0VUQ0hBUihjaXR5cGUsIHApOyBcCi0JR0VUQ0hBUihjaWxlbiwgcCk7IFwKLQlpZiAoY2lsZW4gIT0gQ0lMRU5fVk9JRCB8fCBcCi0JICAgIGNpdHlwZSAhPSBvcHQpIFwKLQkgICAgZ290byBiYWQ7IFwKLSAgICB9Ci0jZGVmaW5lIEFDS0NJU0hPUlQob3B0LCBuZWcsIHZhbCkgXAotICAgIGlmIChuZWcpIHsgXAotCWlmICgobGVuIC09IENJTEVOX1NIT1JUKSA8IDApIFwKLQkgICAgZ290byBiYWQ7IFwKLQlHRVRDSEFSKGNpdHlwZSwgcCk7IFwKLQlHRVRDSEFSKGNpbGVuLCBwKTsgXAotCWlmIChjaWxlbiAhPSBDSUxFTl9TSE9SVCB8fCBcCi0JICAgIGNpdHlwZSAhPSBvcHQpIFwKLQkgICAgZ290byBiYWQ7IFwKLQlHRVRTSE9SVChjaXNob3J0LCBwKTsgXAotCWlmIChjaXNob3J0ICE9IHZhbCkgXAotCSAgICBnb3RvIGJhZDsgXAotICAgIH0KLSNkZWZpbmUgQUNLQ0lDSEFSKG9wdCwgbmVnLCB2YWwpIFwKLSAgICBpZiAobmVnKSB7IFwKLQlpZiAoKGxlbiAtPSBDSUxFTl9DSEFSKSA8IDApIFwKLQkgICAgZ290byBiYWQ7IFwKLQlHRVRDSEFSKGNpdHlwZSwgcCk7IFwKLQlHRVRDSEFSKGNpbGVuLCBwKTsgXAotCWlmIChjaWxlbiAhPSBDSUxFTl9DSEFSIHx8IFwKLQkgICAgY2l0eXBlICE9IG9wdCkgXAotCSAgICBnb3RvIGJhZDsgXAotCUdFVENIQVIoY2ljaGFyLCBwKTsgXAotCWlmIChjaWNoYXIgIT0gdmFsKSBcCi0JICAgIGdvdG8gYmFkOyBcCi0gICAgfQotI2RlZmluZSBBQ0tDSUNIQVAob3B0LCBuZWcsIHZhbCkgXAotICAgIGlmIChuZWcpIHsgXAotCWlmICgobGVuIC09IENJTEVOX0NIQVApIDwgMCkgXAotCSAgICBnb3RvIGJhZDsgXAotCUdFVENIQVIoY2l0eXBlLCBwKTsgXAotCUdFVENIQVIoY2lsZW4sIHApOyBcCi0JaWYgKGNpbGVuICE9IENJTEVOX0NIQVAgfHwgXAotCSAgICBjaXR5cGUgIT0gKG9wdCkpIFwKLQkgICAgZ290byBiYWQ7IFwKLQlHRVRTSE9SVChjaXNob3J0LCBwKTsgXAotCWlmIChjaXNob3J0ICE9IFBQUF9DSEFQKSBcCi0JICAgIGdvdG8gYmFkOyBcCi0JR0VUQ0hBUihjaWNoYXIsIHApOyBcCi0JaWYgKGNpY2hhciAhPSAoQ0hBUF9ESUdFU1QodmFsKSkpIFwKLQkgIGdvdG8gYmFkOyBcCi0gICAgfQotI2RlZmluZSBBQ0tDSUxPTkcob3B0LCBuZWcsIHZhbCkgXAotICAgIGlmIChuZWcpIHsgXAotCWlmICgobGVuIC09IENJTEVOX0xPTkcpIDwgMCkgXAotCSAgICBnb3RvIGJhZDsgXAotCUdFVENIQVIoY2l0eXBlLCBwKTsgXAotCUdFVENIQVIoY2lsZW4sIHApOyBcCi0JaWYgKGNpbGVuICE9IENJTEVOX0xPTkcgfHwgXAotCSAgICBjaXR5cGUgIT0gb3B0KSBcCi0JICAgIGdvdG8gYmFkOyBcCi0JR0VUTE9ORyhjaWxvbmcsIHApOyBcCi0JaWYgKGNpbG9uZyAhPSB2YWwpIFwKLQkgICAgZ290byBiYWQ7IFwKLSAgICB9Ci0jZGVmaW5lIEFDS0NJTFFSKG9wdCwgbmVnLCB2YWwpIFwKLSAgICBpZiAobmVnKSB7IFwKLQlpZiAoKGxlbiAtPSBDSUxFTl9MUVIpIDwgMCkgXAotCSAgICBnb3RvIGJhZDsgXAotCUdFVENIQVIoY2l0eXBlLCBwKTsgXAotCUdFVENIQVIoY2lsZW4sIHApOyBcCi0JaWYgKGNpbGVuICE9IENJTEVOX0xRUiB8fCBcCi0JICAgIGNpdHlwZSAhPSBvcHQpIFwKLQkgICAgZ290byBiYWQ7IFwKLQlHRVRTSE9SVChjaXNob3J0LCBwKTsgXAotCWlmIChjaXNob3J0ICE9IFBQUF9MUVIpIFwKLQkgICAgZ290byBiYWQ7IFwKLQlHRVRMT05HKGNpbG9uZywgcCk7IFwKLQlpZiAoY2lsb25nICE9IHZhbCkgXAotCSAgZ290byBiYWQ7IFwKLSAgICB9Ci0jZGVmaW5lIEFDS0NJRU5EUChvcHQsIG5lZywgY2xhc3MsIHZhbCwgdmxlbikgXAotICAgIGlmIChuZWcpIHsgXAotCWludCBpOyBcCi0JaWYgKChsZW4gLT0gQ0lMRU5fQ0hBUiArIHZsZW4pIDwgMCkgXAotCSAgICBnb3RvIGJhZDsgXAotCUdFVENIQVIoY2l0eXBlLCBwKTsgXAotCUdFVENIQVIoY2lsZW4sIHApOyBcCi0JaWYgKGNpbGVuICE9IENJTEVOX0NIQVIgKyB2bGVuIHx8IFwKLQkgICAgY2l0eXBlICE9IG9wdCkgXAotCSAgICBnb3RvIGJhZDsgXAotCUdFVENIQVIoY2ljaGFyLCBwKTsgXAotCWlmIChjaWNoYXIgIT0gY2xhc3MpIFwKLQkgICAgZ290byBiYWQ7IFwKLQlmb3IgKGkgPSAwOyBpIDwgdmxlbjsgKytpKSB7IFwKLQkgICAgR0VUQ0hBUihjaWNoYXIsIHApOyBcCi0JICAgIGlmIChjaWNoYXIgIT0gdmFsW2ldKSBcCi0JCWdvdG8gYmFkOyBcCi0JfSBcCi0gICAgfQotCi0gICAgQUNLQ0lTSE9SVChDSV9NUlUsIGdvLT5uZWdfbXJ1ICYmIGdvLT5tcnUgIT0gREVGTVJVLCBnby0+bXJ1KTsKLSAgICBBQ0tDSUxPTkcoQ0lfQVNZTkNNQVAsIGdvLT5uZWdfYXN5bmNtYXAgJiYgZ28tPmFzeW5jbWFwICE9IDB4RkZGRkZGRkYsCi0JICAgICAgZ28tPmFzeW5jbWFwKTsKLSAgICBBQ0tDSVNIT1JUKENJX0FVVEhUWVBFLCBnby0+bmVnX2VhcCwgUFBQX0VBUCk7Ci0gICAgQUNLQ0lDSEFQKENJX0FVVEhUWVBFLCAhZ28tPm5lZ19lYXAgJiYgZ28tPm5lZ19jaGFwLCBnby0+Y2hhcF9tZHR5cGUpOwotICAgIEFDS0NJU0hPUlQoQ0lfQVVUSFRZUEUsICFnby0+bmVnX2VhcCAmJiAhZ28tPm5lZ19jaGFwICYmIGdvLT5uZWdfdXBhcCwKLQkgICAgICAgUFBQX1BBUCk7Ci0gICAgQUNLQ0lMUVIoQ0lfUVVBTElUWSwgZ28tPm5lZ19scXIsIGdvLT5scXJfcGVyaW9kKTsKLSAgICBBQ0tDSUNIQVIoQ0lfQ0FMTEJBQ0ssIGdvLT5uZWdfY2JjcCwgQ0JDUF9PUFQpOwotICAgIEFDS0NJTE9ORyhDSV9NQUdJQ05VTUJFUiwgZ28tPm5lZ19tYWdpY251bWJlciwgZ28tPm1hZ2ljbnVtYmVyKTsKLSAgICBBQ0tDSVZPSUQoQ0lfUENPTVBSRVNTSU9OLCBnby0+bmVnX3Bjb21wcmVzc2lvbik7Ci0gICAgQUNLQ0lWT0lEKENJX0FDQ09NUFJFU1NJT04sIGdvLT5uZWdfYWNjb21wcmVzc2lvbik7Ci0gICAgQUNLQ0lTSE9SVChDSV9NUlJVLCBnby0+bmVnX21ycnUsIGdvLT5tcnJ1KTsKLSAgICBBQ0tDSVZPSUQoQ0lfU1NOSEYsIGdvLT5uZWdfc3NuaGYpOwotICAgIEFDS0NJRU5EUChDSV9FUERJU0MsIGdvLT5uZWdfZW5kcG9pbnQsIGdvLT5lbmRwb2ludC5jbGFzcywKLQkgICAgICBnby0+ZW5kcG9pbnQudmFsdWUsIGdvLT5lbmRwb2ludC5sZW5ndGgpOwotCi0gICAgLyoKLSAgICAgKiBJZiB0aGVyZSBhcmUgYW55IHJlbWFpbmluZyBDSXMsIHRoZW4gdGhpcyBwYWNrZXQgaXMgYmFkLgotICAgICAqLwotICAgIGlmIChsZW4gIT0gMCkKLQlnb3RvIGJhZDsKLSAgICByZXR1cm4gKDEpOwotYmFkOgotICAgIExDUERFQlVHKCgibGNwX2Fja2k6IHJlY2VpdmVkIGJhZCBBY2shIikpOwotICAgIHJldHVybiAoMCk7Ci19Ci0KLQotLyoKLSAqIGxjcF9uYWtjaSAtIFBlZXIgaGFzIHNlbnQgYSBOQUsgZm9yIHNvbWUgb2Ygb3VyIENJcy4KLSAqIFRoaXMgc2hvdWxkIG5vdCBtb2RpZnkgYW55IHN0YXRlIGlmIHRoZSBOYWsgaXMgYmFkCi0gKiBvciBpZiBMQ1AgaXMgaW4gdGhlIE9QRU5FRCBzdGF0ZS4KLSAqCi0gKiBSZXR1cm5zOgotICoJMCAtIE5hayB3YXMgYmFkLgotICoJMSAtIE5hayB3YXMgZ29vZC4KLSAqLwotc3RhdGljIGludAotbGNwX25ha2NpKGYsIHAsIGxlbiwgdHJlYXRfYXNfcmVqZWN0KQotICAgIGZzbSAqZjsKLSAgICB1X2NoYXIgKnA7Ci0gICAgaW50IGxlbjsKLSAgICBpbnQgdHJlYXRfYXNfcmVqZWN0OwotewotICAgIGxjcF9vcHRpb25zICpnbyA9ICZsY3BfZ290b3B0aW9uc1tmLT51bml0XTsKLSAgICBsY3Bfb3B0aW9ucyAqd28gPSAmbGNwX3dhbnRvcHRpb25zW2YtPnVuaXRdOwotICAgIHVfY2hhciBjaXR5cGUsIGNpY2hhciwgKm5leHQ7Ci0gICAgdV9zaG9ydCBjaXNob3J0OwotICAgIHVfaW50MzJfdCBjaWxvbmc7Ci0gICAgbGNwX29wdGlvbnMgbm87CQkvKiBvcHRpb25zIHdlJ3ZlIHNlZW4gTmFrcyBmb3IgKi8KLSAgICBsY3Bfb3B0aW9ucyB0cnk7CQkvKiBvcHRpb25zIHRvIHJlcXVlc3QgbmV4dCB0aW1lICovCi0gICAgaW50IGxvb3BlZF9iYWNrID0gMDsKLSAgICBpbnQgY2lsZW47Ci0KLSAgICBCWkVSTygmbm8sIHNpemVvZihubykpOwotICAgIHRyeSA9ICpnbzsKLQotICAgIC8qCi0gICAgICogQW55IE5haydkIENJcyBtdXN0IGJlIGluIGV4YWN0bHkgdGhlIHNhbWUgb3JkZXIgdGhhdCB3ZSBzZW50LgotICAgICAqIENoZWNrIHBhY2tldCBsZW5ndGggYW5kIENJIGxlbmd0aCBhdCBlYWNoIHN0ZXAuCi0gICAgICogSWYgd2UgZmluZCBhbnkgZGV2aWF0aW9ucywgdGhlbiB0aGlzIHBhY2tldCBpcyBiYWQuCi0gICAgICovCi0jZGVmaW5lIE5BS0NJVk9JRChvcHQsIG5lZykgXAotICAgIGlmIChnby0+bmVnICYmIFwKLQlsZW4gPj0gQ0lMRU5fVk9JRCAmJiBcCi0JcFsxXSA9PSBDSUxFTl9WT0lEICYmIFwKLQlwWzBdID09IG9wdCkgeyBcCi0JbGVuIC09IENJTEVOX1ZPSUQ7IFwKLQlJTkNQVFIoQ0lMRU5fVk9JRCwgcCk7IFwKLQluby5uZWcgPSAxOyBcCi0JdHJ5Lm5lZyA9IDA7IFwKLSAgICB9Ci0jZGVmaW5lIE5BS0NJQ0hBUChvcHQsIG5lZywgY29kZSkgXAotICAgIGlmIChnby0+bmVnICYmIFwKLQlsZW4gPj0gQ0lMRU5fQ0hBUCAmJiBcCi0JcFsxXSA9PSBDSUxFTl9DSEFQICYmIFwKLQlwWzBdID09IG9wdCkgeyBcCi0JbGVuIC09IENJTEVOX0NIQVA7IFwKLQlJTkNQVFIoMiwgcCk7IFwKLQlHRVRTSE9SVChjaXNob3J0LCBwKTsgXAotCUdFVENIQVIoY2ljaGFyLCBwKTsgXAotCW5vLm5lZyA9IDE7IFwKLQljb2RlIFwKLSAgICB9Ci0jZGVmaW5lIE5BS0NJQ0hBUihvcHQsIG5lZywgY29kZSkgXAotICAgIGlmIChnby0+bmVnICYmIFwKLQlsZW4gPj0gQ0lMRU5fQ0hBUiAmJiBcCi0JcFsxXSA9PSBDSUxFTl9DSEFSICYmIFwKLQlwWzBdID09IG9wdCkgeyBcCi0JbGVuIC09IENJTEVOX0NIQVI7IFwKLQlJTkNQVFIoMiwgcCk7IFwKLQlHRVRDSEFSKGNpY2hhciwgcCk7IFwKLQluby5uZWcgPSAxOyBcCi0JY29kZSBcCi0gICAgfQotI2RlZmluZSBOQUtDSVNIT1JUKG9wdCwgbmVnLCBjb2RlKSBcCi0gICAgaWYgKGdvLT5uZWcgJiYgXAotCWxlbiA+PSBDSUxFTl9TSE9SVCAmJiBcCi0JcFsxXSA9PSBDSUxFTl9TSE9SVCAmJiBcCi0JcFswXSA9PSBvcHQpIHsgXAotCWxlbiAtPSBDSUxFTl9TSE9SVDsgXAotCUlOQ1BUUigyLCBwKTsgXAotCUdFVFNIT1JUKGNpc2hvcnQsIHApOyBcCi0Jbm8ubmVnID0gMTsgXAotCWNvZGUgXAotICAgIH0KLSNkZWZpbmUgTkFLQ0lMT05HKG9wdCwgbmVnLCBjb2RlKSBcCi0gICAgaWYgKGdvLT5uZWcgJiYgXAotCWxlbiA+PSBDSUxFTl9MT05HICYmIFwKLQlwWzFdID09IENJTEVOX0xPTkcgJiYgXAotCXBbMF0gPT0gb3B0KSB7IFwKLQlsZW4gLT0gQ0lMRU5fTE9ORzsgXAotCUlOQ1BUUigyLCBwKTsgXAotCUdFVExPTkcoY2lsb25nLCBwKTsgXAotCW5vLm5lZyA9IDE7IFwKLQljb2RlIFwKLSAgICB9Ci0jZGVmaW5lIE5BS0NJTFFSKG9wdCwgbmVnLCBjb2RlKSBcCi0gICAgaWYgKGdvLT5uZWcgJiYgXAotCWxlbiA+PSBDSUxFTl9MUVIgJiYgXAotCXBbMV0gPT0gQ0lMRU5fTFFSICYmIFwKLQlwWzBdID09IG9wdCkgeyBcCi0JbGVuIC09IENJTEVOX0xRUjsgXAotCUlOQ1BUUigyLCBwKTsgXAotCUdFVFNIT1JUKGNpc2hvcnQsIHApOyBcCi0JR0VUTE9ORyhjaWxvbmcsIHApOyBcCi0Jbm8ubmVnID0gMTsgXAotCWNvZGUgXAotICAgIH0KLSNkZWZpbmUgTkFLQ0lFTkRQKG9wdCwgbmVnKSBcCi0gICAgaWYgKGdvLT5uZWcgJiYgXAotCWxlbiA+PSBDSUxFTl9DSEFSICYmIFwKLQlwWzBdID09IG9wdCAmJiBcCi0JcFsxXSA+PSBDSUxFTl9DSEFSICYmIFwKLQlwWzFdIDw9IGxlbikgeyBcCi0JbGVuIC09IHBbMV07IFwKLQlJTkNQVFIocFsxXSwgcCk7IFwKLQluby5uZWcgPSAxOyBcCi0JdHJ5Lm5lZyA9IDA7IFwKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE5PVEUhICBUaGVyZSBtdXN0IGJlIG5vIGFzc2lnbm1lbnRzIHRvIGluZGl2aWR1YWwgZmllbGRzIG9mICpnbyBpbgotICAgICAqIHRoZSBjb2RlIGJlbG93LiAgQW55IHN1Y2ggYXNzaWdubWVudCBpcyBhIEJVRyEKLSAgICAgKi8KLSAgICAvKgotICAgICAqIFdlIGRvbid0IGNhcmUgaWYgdGhleSB3YW50IHRvIHNlbmQgdXMgc21hbGxlciBwYWNrZXRzIHRoYW4KLSAgICAgKiB3ZSB3YW50LiAgVGhlcmVmb3JlLCBhY2NlcHQgYW55IE1SVSBsZXNzIHRoYW4gd2hhdCB3ZSBhc2tlZCBmb3IsCi0gICAgICogYnV0IHRoZW4gaWdub3JlIHRoZSBuZXcgdmFsdWUgd2hlbiBzZXR0aW5nIHRoZSBNUlUgaW4gdGhlIGtlcm5lbC4KLSAgICAgKiBJZiB0aGV5IHNlbmQgdXMgYSBiaWdnZXIgTVJVIHRoYW4gd2hhdCB3ZSBhc2tlZCwgYWNjZXB0IGl0LCB1cCB0bwotICAgICAqIHRoZSBsaW1pdCBvZiB0aGUgZGVmYXVsdCBNUlUgd2UnZCBnZXQgaWYgd2UgZGlkbid0IG5lZ290aWF0ZS4KLSAgICAgKi8KLSAgICBpZiAoZ28tPm5lZ19tcnUgJiYgZ28tPm1ydSAhPSBERUZNUlUpIHsKLQlOQUtDSVNIT1JUKENJX01SVSwgbmVnX21ydSwKLQkJICAgaWYgKGNpc2hvcnQgPD0gd28tPm1ydSB8fCBjaXNob3J0IDw9IERFRk1SVSkKLQkJICAgICAgIHRyeS5tcnUgPSBjaXNob3J0OwotCQkgICApOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQWRkIGFueSBjaGFyYWN0ZXJzIHRoZXkgd2FudCB0byBvdXIgKHJlY2VpdmUtc2lkZSkgYXN5bmNtYXAuCi0gICAgICovCi0gICAgaWYgKGdvLT5uZWdfYXN5bmNtYXAgJiYgZ28tPmFzeW5jbWFwICE9IDB4RkZGRkZGRkYpIHsKLQlOQUtDSUxPTkcoQ0lfQVNZTkNNQVAsIG5lZ19hc3luY21hcCwKLQkJICB0cnkuYXN5bmNtYXAgPSBnby0+YXN5bmNtYXAgfCBjaWxvbmc7Ci0JCSAgKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIElmIHRoZXkndmUgbmFrJ2Qgb3VyIGF1dGhlbnRpY2F0aW9uLXByb3RvY29sLCBjaGVjayB3aGV0aGVyCi0gICAgICogdGhleSBhcmUgcHJvcG9zaW5nIGEgZGlmZmVyZW50IHByb3RvY29sLCBvciBhIGRpZmZlcmVudAotICAgICAqIGhhc2ggYWxnb3JpdGhtIGZvciBDSEFQLgotICAgICAqLwotICAgIGlmICgoZ28tPm5lZ19jaGFwIHx8IGdvLT5uZWdfdXBhcCB8fCBnby0+bmVnX2VhcCkKLQkmJiBsZW4gPj0gQ0lMRU5fU0hPUlQKLQkmJiBwWzBdID09IENJX0FVVEhUWVBFICYmIHBbMV0gPj0gQ0lMRU5fU0hPUlQgJiYgcFsxXSA8PSBsZW4pIHsKLQljaWxlbiA9IHBbMV07Ci0JbGVuIC09IGNpbGVuOwotCW5vLm5lZ19jaGFwID0gZ28tPm5lZ19jaGFwOwotCW5vLm5lZ191cGFwID0gZ28tPm5lZ191cGFwOwotCW5vLm5lZ19lYXAgPSBnby0+bmVnX2VhcDsKLQlJTkNQVFIoMiwgcCk7Ci0JR0VUU0hPUlQoY2lzaG9ydCwgcCk7Ci0JaWYgKGNpc2hvcnQgPT0gUFBQX1BBUCAmJiBjaWxlbiA9PSBDSUxFTl9TSE9SVCkgewotCSAgICAvKiBJZiB3ZSB3ZXJlIGFza2luZyBmb3IgRUFQLCB0aGVuIHdlIG5lZWQgdG8gc3RvcCB0aGF0LiAqLwotCSAgICBpZiAoZ28tPm5lZ19lYXApCi0JCXRyeS5uZWdfZWFwID0gMDsKLQotCSAgICAvKiBJZiB3ZSB3ZXJlIGFza2luZyBmb3IgQ0hBUCwgdGhlbiB3ZSBuZWVkIHRvIHN0b3AgdGhhdC4gKi8KLQkgICAgZWxzZSBpZiAoZ28tPm5lZ19jaGFwKQotCQl0cnkubmVnX2NoYXAgPSAwOwotCSAgICAvKgotCSAgICAgKiBJZiB3ZSB3ZXJlbid0IGFza2luZyBmb3IgQ0hBUCBvciBFQVAsIHRoZW4gd2Ugd2VyZSBhc2tpbmcgZm9yCi0JICAgICAqIFBBUCwgaW4gd2hpY2ggY2FzZSB0aGlzIE5hayBpcyBiYWQuCi0JICAgICAqLwotCSAgICBlbHNlCi0JCWdvdG8gYmFkOwotCi0JfSBlbHNlIGlmIChjaXNob3J0ID09IFBQUF9DSEFQICYmIGNpbGVuID09IENJTEVOX0NIQVApIHsKLQkgICAgR0VUQ0hBUihjaWNoYXIsIHApOwotCSAgICAvKiBTdG9wIGFza2luZyBmb3IgRUFQLCBpZiB3ZSB3ZXJlLiAqLwotCSAgICBpZiAoZ28tPm5lZ19lYXApIHsKLQkJdHJ5Lm5lZ19lYXAgPSAwOwotCQkvKiBUcnkgdG8gc2V0IHVwIHRvIHVzZSB0aGVpciBzdWdnZXN0aW9uLCBpZiBwb3NzaWJsZSAqLwotCQlpZiAoQ0hBUF9DQU5ESUdFU1QoZ28tPmNoYXBfbWR0eXBlLCBjaWNoYXIpKQotCQkgICAgdHJ5LmNoYXBfbWR0eXBlID0gQ0hBUF9NRFRZUEVfRChjaWNoYXIpOwotCSAgICB9IGVsc2UgaWYgKGdvLT5uZWdfY2hhcCkgewotCQkvKgotCQkgKiBXZSB3ZXJlIGFza2luZyBmb3Igb3VyIHByZWZlcnJlZCBhbGdvcml0aG0sIHRoZXkgbXVzdAotCQkgKiB3YW50IHNvbWV0aGluZyBkaWZmZXJlbnQuCi0JCSAqLwotCQlpZiAoY2ljaGFyICE9IENIQVBfRElHRVNUKGdvLT5jaGFwX21kdHlwZSkpIHsKLQkJICAgIGlmIChDSEFQX0NBTkRJR0VTVChnby0+Y2hhcF9tZHR5cGUsIGNpY2hhcikpIHsKLQkJCS8qIFVzZSB0aGVpciBzdWdnZXN0aW9uIGlmIHdlIHN1cHBvcnQgaXQgLi4uICovCi0JCQl0cnkuY2hhcF9tZHR5cGUgPSBDSEFQX01EVFlQRV9EKGNpY2hhcik7Ci0JCSAgICB9IGVsc2UgewotCQkJLyogLi4uIG90aGVyd2lzZSwgdHJ5IG91ciBuZXh0LXByZWZlcnJlZCBhbGdvcml0aG0uICovCi0JCQl0cnkuY2hhcF9tZHR5cGUgJj0gfihDSEFQX01EVFlQRSh0cnkuY2hhcF9tZHR5cGUpKTsKLQkJCWlmICh0cnkuY2hhcF9tZHR5cGUgPT0gTURUWVBFX05PTkUpIC8qIG91dCBvZiBhbGdvcyAqLwotCQkJICAgIHRyeS5uZWdfY2hhcCA9IDA7Ci0JCSAgICB9Ci0JCX0gZWxzZSB7Ci0JCSAgICAvKgotCQkgICAgICogV2hvb3BzLCB0aGV5IE5haydkIG91ciBhbGdvcml0aG0gb2YgY2hvaWNlCi0JCSAgICAgKiBidXQgdGhlbiBzdWdnZXN0ZWQgaXQgYmFjayB0byB1cy4KLQkJICAgICAqLwotCQkgICAgZ290byBiYWQ7Ci0JCX0KLQkgICAgfSBlbHNlIHsKLQkJLyoKLQkJICogU3RvcCBhc2tpbmcgZm9yIFBBUCBpZiB3ZSB3ZXJlIGFza2luZyBmb3IgaXQuCi0JCSAqLwotCQl0cnkubmVnX3VwYXAgPSAwOwotCSAgICB9Ci0KLQl9IGVsc2UgewotCi0JICAgIC8qCi0JICAgICAqIElmIHdlIHdlcmUgYXNraW5nIGZvciBFQVAsIGFuZCB0aGV5J3JlIENvbmYtTmFraW5nIEVBUCwKLQkgICAgICogd2VsbCwgdGhhdCdzIGp1c3Qgc3RyYW5nZS4gIE5vYm9keSBzaG91bGQgZG8gdGhhdC4KLQkgICAgICovCi0JICAgIGlmIChjaXNob3J0ID09IFBQUF9FQVAgJiYgY2lsZW4gPT0gQ0lMRU5fU0hPUlQgJiYgZ28tPm5lZ19lYXApCi0JCWRiZ2xvZygiVW5leHBlY3RlZCBDb25mLU5hayBmb3IgRUFQIik7Ci0KLQkgICAgLyoKLQkgICAgICogV2UgZG9uJ3QgcmVjb2duaXplIHdoYXQgdGhleSdyZSBzdWdnZXN0aW5nLgotCSAgICAgKiBTdG9wIGFza2luZyBmb3Igd2hhdCB3ZSB3ZXJlIGFza2luZyBmb3IuCi0JICAgICAqLwotCSAgICBpZiAoZ28tPm5lZ19lYXApCi0JCXRyeS5uZWdfZWFwID0gMDsKLQkgICAgZWxzZSBpZiAoZ28tPm5lZ19jaGFwKQotCQl0cnkubmVnX2NoYXAgPSAwOwotCSAgICBlbHNlCi0JCXRyeS5uZWdfdXBhcCA9IDA7Ci0JICAgIHAgKz0gY2lsZW4gLSBDSUxFTl9TSE9SVDsKLQl9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBJZiB0aGV5IGNhbid0IGNvcGUgd2l0aCBvdXIgbGluayBxdWFsaXR5IHByb3RvY29sLCB3ZSdsbCBoYXZlCi0gICAgICogdG8gc3RvcCBhc2tpbmcgZm9yIExRUi4gIFdlIGhhdmVuJ3QgZ290IGFueSBvdGhlciBwcm90b2NvbC4KLSAgICAgKiBJZiB0aGV5IE5hayB0aGUgcmVwb3J0aW5nIHBlcmlvZCwgdGFrZSB0aGVpciB2YWx1ZSBYWFggPwotICAgICAqLwotICAgIE5BS0NJTFFSKENJX1FVQUxJVFksIG5lZ19scXIsCi0JICAgICBpZiAoY2lzaG9ydCAhPSBQUFBfTFFSKQotCQkgdHJ5Lm5lZ19scXIgPSAwOwotCSAgICAgZWxzZQotCQkgdHJ5Lmxxcl9wZXJpb2QgPSBjaWxvbmc7Ci0JICAgICApOwotCi0gICAgLyoKLSAgICAgKiBPbmx5IGltcGxlbWVudGluZyBDQkNQLi4ubm90IHRoZSByZXN0IG9mIHRoZSBjYWxsYmFjayBvcHRpb25zCi0gICAgICovCi0gICAgTkFLQ0lDSEFSKENJX0NBTExCQUNLLCBuZWdfY2JjcCwKLSAgICAgICAgICAgICAgdHJ5Lm5lZ19jYmNwID0gMDsKLSAgICAgICAgICAgICAgKTsKLQotICAgIC8qCi0gICAgICogQ2hlY2sgZm9yIGEgbG9vcGVkLWJhY2sgbGluZS4KLSAgICAgKi8KLSAgICBOQUtDSUxPTkcoQ0lfTUFHSUNOVU1CRVIsIG5lZ19tYWdpY251bWJlciwKLQkgICAgICB0cnkubWFnaWNudW1iZXIgPSBtYWdpYygpOwotCSAgICAgIGxvb3BlZF9iYWNrID0gMTsKLQkgICAgICApOwotCi0gICAgLyoKLSAgICAgKiBQZWVyIHNob3VsZG4ndCBzZW5kIE5hayBmb3IgcHJvdG9jb2wgY29tcHJlc3Npb24gb3IKLSAgICAgKiBhZGRyZXNzL2NvbnRyb2wgY29tcHJlc3Npb24gcmVxdWVzdHM7IHRoZXkgc2hvdWxkIHNlbmQKLSAgICAgKiBhIFJlamVjdCBpbnN0ZWFkLiAgSWYgdGhleSBzZW5kIGEgTmFrLCB0cmVhdCBpdCBhcyBhIFJlamVjdC4KLSAgICAgKi8KLSAgICBOQUtDSVZPSUQoQ0lfUENPTVBSRVNTSU9OLCBuZWdfcGNvbXByZXNzaW9uKTsKLSAgICBOQUtDSVZPSUQoQ0lfQUNDT01QUkVTU0lPTiwgbmVnX2FjY29tcHJlc3Npb24pOwotCi0gICAgLyoKLSAgICAgKiBOYWsgZm9yIE1SUlUgb3B0aW9uIC0gYWNjZXB0IHRoZWlyIHZhbHVlIGlmIGl0IGlzIHNtYWxsZXIKLSAgICAgKiB0aGFuIHRoZSBvbmUgd2Ugd2FudC4KLSAgICAgKi8KLSAgICBpZiAoZ28tPm5lZ19tcnJ1KSB7Ci0JTkFLQ0lTSE9SVChDSV9NUlJVLCBuZWdfbXJydSwKLQkJICAgaWYgKHRyZWF0X2FzX3JlamVjdCkKLQkJICAgICAgIHRyeS5uZWdfbXJydSA9IDA7Ci0JCSAgIGVsc2UgaWYgKGNpc2hvcnQgPD0gd28tPm1ycnUpCi0JCSAgICAgICB0cnkubXJydSA9IGNpc2hvcnQ7Ci0JCSAgICk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBOYWsgZm9yIHNob3J0IHNlcXVlbmNlIG51bWJlcnMgc2hvdWxkbid0IGJlIHNlbnQsIHRyZWF0IGl0Ci0gICAgICogbGlrZSBhIHJlamVjdC4KLSAgICAgKi8KLSAgICBOQUtDSVZPSUQoQ0lfU1NOSEYsIG5lZ19zc25oZik7Ci0KLSAgICAvKgotICAgICAqIE5hayBvZiB0aGUgZW5kcG9pbnQgZGlzY3JpbWluYXRvciBvcHRpb24gaXMgbm90IHBlcm1pdHRlZCwKLSAgICAgKiB0cmVhdCBpdCBsaWtlIGEgcmVqZWN0LgotICAgICAqLwotICAgIE5BS0NJRU5EUChDSV9FUERJU0MsIG5lZ19lbmRwb2ludCk7Ci0KLSAgICAvKgotICAgICAqIFRoZXJlIG1heSBiZSByZW1haW5pbmcgQ0lzLCBpZiB0aGUgcGVlciBpcyByZXF1ZXN0aW5nIG5lZ290aWF0aW9uCi0gICAgICogb24gYW4gb3B0aW9uIHRoYXQgd2UgZGlkbid0IGluY2x1ZGUgaW4gb3VyIHJlcXVlc3QgcGFja2V0LgotICAgICAqIElmIHdlIHNlZSBhbiBvcHRpb24gdGhhdCB3ZSByZXF1ZXN0ZWQsIG9yIG9uZSB3ZSd2ZSBhbHJlYWR5IHNlZW4KLSAgICAgKiBpbiB0aGlzIHBhY2tldCwgdGhlbiB0aGlzIHBhY2tldCBpcyBiYWQuCi0gICAgICogSWYgd2Ugd2FudGVkIHRvIHJlc3BvbmQgYnkgc3RhcnRpbmcgdG8gbmVnb3RpYXRlIG9uIHRoZSByZXF1ZXN0ZWQKLSAgICAgKiBvcHRpb24ocyksIHdlIGNvdWxkLCBidXQgd2UgZG9uJ3QsIGJlY2F1c2UgZXhjZXB0IGZvciB0aGUKLSAgICAgKiBhdXRoZW50aWNhdGlvbiB0eXBlIGFuZCBxdWFsaXR5IHByb3RvY29sLCBpZiB3ZSBhcmUgbm90IG5lZ290aWF0aW5nCi0gICAgICogYW4gb3B0aW9uLCBpdCBpcyBiZWNhdXNlIHdlIHdlcmUgdG9sZCBub3QgdG8uCi0gICAgICogRm9yIHRoZSBhdXRoZW50aWNhdGlvbiB0eXBlLCB0aGUgTmFrIGZyb20gdGhlIHBlZXIgbWVhbnMKLSAgICAgKiBgbGV0IG1lIGF1dGhlbnRpY2F0ZSBteXNlbGYgd2l0aCB5b3UnIHdoaWNoIGlzIGEgYml0IHBvaW50bGVzcy4KLSAgICAgKiBGb3IgdGhlIHF1YWxpdHkgcHJvdG9jb2wsIHRoZSBOYWsgbWVhbnMgYGFzayBtZSB0byBzZW5kIHlvdSBxdWFsaXR5Ci0gICAgICogcmVwb3J0cycsIGJ1dCBpZiB3ZSBkaWRuJ3QgYXNrIGZvciB0aGVtLCB3ZSBkb24ndCB3YW50IHRoZW0uCi0gICAgICogQW4gb3B0aW9uIHdlIGRvbid0IHJlY29nbml6ZSByZXByZXNlbnRzIHRoZSBwZWVyIGFza2luZyB0bwotICAgICAqIG5lZ290aWF0ZSBzb21lIG9wdGlvbiB3ZSBkb24ndCBzdXBwb3J0LCBzbyBpZ25vcmUgaXQuCi0gICAgICovCi0gICAgd2hpbGUgKGxlbiA+PSBDSUxFTl9WT0lEKSB7Ci0JR0VUQ0hBUihjaXR5cGUsIHApOwotCUdFVENIQVIoY2lsZW4sIHApOwotCWlmIChjaWxlbiA8IENJTEVOX1ZPSUQgfHwgKGxlbiAtPSBjaWxlbikgPCAwKQotCSAgICBnb3RvIGJhZDsKLQluZXh0ID0gcCArIGNpbGVuIC0gMjsKLQotCXN3aXRjaCAoY2l0eXBlKSB7Ci0JY2FzZSBDSV9NUlU6Ci0JICAgIGlmICgoZ28tPm5lZ19tcnUgJiYgZ28tPm1ydSAhPSBERUZNUlUpCi0JCXx8IG5vLm5lZ19tcnUgfHwgY2lsZW4gIT0gQ0lMRU5fU0hPUlQpCi0JCWdvdG8gYmFkOwotCSAgICBHRVRTSE9SVChjaXNob3J0LCBwKTsKLQkgICAgaWYgKGNpc2hvcnQgPCBERUZNUlUpIHsKLQkJdHJ5Lm5lZ19tcnUgPSAxOwotCQl0cnkubXJ1ID0gY2lzaG9ydDsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIENJX0FTWU5DTUFQOgotCSAgICBpZiAoKGdvLT5uZWdfYXN5bmNtYXAgJiYgZ28tPmFzeW5jbWFwICE9IDB4RkZGRkZGRkYpCi0JCXx8IG5vLm5lZ19hc3luY21hcCB8fCBjaWxlbiAhPSBDSUxFTl9MT05HKQotCQlnb3RvIGJhZDsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDSV9BVVRIVFlQRToKLQkgICAgaWYgKGdvLT5uZWdfY2hhcCB8fCBuby5uZWdfY2hhcCB8fCBnby0+bmVnX3VwYXAgfHwgbm8ubmVnX3VwYXAgfHwKLQkJZ28tPm5lZ19lYXAgfHwgbm8ubmVnX2VhcCkKLQkJZ290byBiYWQ7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ0lfTUFHSUNOVU1CRVI6Ci0JICAgIGlmIChnby0+bmVnX21hZ2ljbnVtYmVyIHx8IG5vLm5lZ19tYWdpY251bWJlciB8fAotCQljaWxlbiAhPSBDSUxFTl9MT05HKQotCQlnb3RvIGJhZDsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDSV9QQ09NUFJFU1NJT046Ci0JICAgIGlmIChnby0+bmVnX3Bjb21wcmVzc2lvbiB8fCBuby5uZWdfcGNvbXByZXNzaW9uCi0JCXx8IGNpbGVuICE9IENJTEVOX1ZPSUQpCi0JCWdvdG8gYmFkOwotCSAgICBicmVhazsKLQljYXNlIENJX0FDQ09NUFJFU1NJT046Ci0JICAgIGlmIChnby0+bmVnX2FjY29tcHJlc3Npb24gfHwgbm8ubmVnX2FjY29tcHJlc3Npb24KLQkJfHwgY2lsZW4gIT0gQ0lMRU5fVk9JRCkKLQkJZ290byBiYWQ7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ0lfUVVBTElUWToKLQkgICAgaWYgKGdvLT5uZWdfbHFyIHx8IG5vLm5lZ19scXIgfHwgY2lsZW4gIT0gQ0lMRU5fTFFSKQotCQlnb3RvIGJhZDsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDSV9NUlJVOgotCSAgICBpZiAoZ28tPm5lZ19tcnJ1IHx8IG5vLm5lZ19tcnJ1IHx8IGNpbGVuICE9IENJTEVOX1NIT1JUKQotCQlnb3RvIGJhZDsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDSV9TU05IRjoKLQkgICAgaWYgKGdvLT5uZWdfc3NuaGYgfHwgbm8ubmVnX3NzbmhmIHx8IGNpbGVuICE9IENJTEVOX1ZPSUQpCi0JCWdvdG8gYmFkOwotCSAgICB0cnkubmVnX3NzbmhmID0gMTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDSV9FUERJU0M6Ci0JICAgIGlmIChnby0+bmVnX2VuZHBvaW50IHx8IG5vLm5lZ19lbmRwb2ludCB8fCBjaWxlbiA8IENJTEVOX0NIQVIpCi0JCWdvdG8gYmFkOwotCSAgICBicmVhazsKLQl9Ci0JcCA9IG5leHQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBPSywgdGhlIE5hayBpcyBnb29kLiAgTm93IHdlIGNhbiB1cGRhdGUgc3RhdGUuCi0gICAgICogSWYgdGhlcmUgYXJlIGFueSBvcHRpb25zIGxlZnQgd2UgaWdub3JlIHRoZW0uCi0gICAgICovCi0gICAgaWYgKGYtPnN0YXRlICE9IE9QRU5FRCkgewotCWlmIChsb29wZWRfYmFjaykgewotCSAgICBpZiAoKyt0cnkubnVtbG9vcHMgPj0gbGNwX2xvb3BiYWNrZmFpbCkgewotCQlub3RpY2UoIlNlcmlhbCBsaW5lIGlzIGxvb3BlZCBiYWNrLiIpOwotCQlzdGF0dXMgPSBFWElUX0xPT1BCQUNLOwotCQlsY3BfY2xvc2UoZi0+dW5pdCwgIkxvb3BiYWNrIGRldGVjdGVkIik7Ci0JICAgIH0KLQl9IGVsc2UKLQkgICAgdHJ5Lm51bWxvb3BzID0gMDsKLQkqZ28gPSB0cnk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDE7Ci0KLWJhZDoKLSAgICBMQ1BERUJVRygoImxjcF9uYWtjaTogcmVjZWl2ZWQgYmFkIE5hayEiKSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqIGxjcF9yZWpjaSAtIFBlZXIgaGFzIFJlamVjdGVkIHNvbWUgb2Ygb3VyIENJcy4KLSAqIFRoaXMgc2hvdWxkIG5vdCBtb2RpZnkgYW55IHN0YXRlIGlmIHRoZSBSZWplY3QgaXMgYmFkCi0gKiBvciBpZiBMQ1AgaXMgaW4gdGhlIE9QRU5FRCBzdGF0ZS4KLSAqCi0gKiBSZXR1cm5zOgotICoJMCAtIFJlamVjdCB3YXMgYmFkLgotICoJMSAtIFJlamVjdCB3YXMgZ29vZC4KLSAqLwotc3RhdGljIGludAotbGNwX3JlamNpKGYsIHAsIGxlbikKLSAgICBmc20gKmY7Ci0gICAgdV9jaGFyICpwOwotICAgIGludCBsZW47Ci17Ci0gICAgbGNwX29wdGlvbnMgKmdvID0gJmxjcF9nb3RvcHRpb25zW2YtPnVuaXRdOwotICAgIHVfY2hhciBjaWNoYXI7Ci0gICAgdV9zaG9ydCBjaXNob3J0OwotICAgIHVfaW50MzJfdCBjaWxvbmc7Ci0gICAgbGNwX29wdGlvbnMgdHJ5OwkJLyogb3B0aW9ucyB0byByZXF1ZXN0IG5leHQgdGltZSAqLwotCi0gICAgdHJ5ID0gKmdvOwotCi0gICAgLyoKLSAgICAgKiBBbnkgUmVqZWN0ZWQgQ0lzIG11c3QgYmUgaW4gZXhhY3RseSB0aGUgc2FtZSBvcmRlciB0aGF0IHdlIHNlbnQuCi0gICAgICogQ2hlY2sgcGFja2V0IGxlbmd0aCBhbmQgQ0kgbGVuZ3RoIGF0IGVhY2ggc3RlcC4KLSAgICAgKiBJZiB3ZSBmaW5kIGFueSBkZXZpYXRpb25zLCB0aGVuIHRoaXMgcGFja2V0IGlzIGJhZC4KLSAgICAgKi8KLSNkZWZpbmUgUkVKQ0lWT0lEKG9wdCwgbmVnKSBcCi0gICAgaWYgKGdvLT5uZWcgJiYgXAotCWxlbiA+PSBDSUxFTl9WT0lEICYmIFwKLQlwWzFdID09IENJTEVOX1ZPSUQgJiYgXAotCXBbMF0gPT0gb3B0KSB7IFwKLQlsZW4gLT0gQ0lMRU5fVk9JRDsgXAotCUlOQ1BUUihDSUxFTl9WT0lELCBwKTsgXAotCXRyeS5uZWcgPSAwOyBcCi0gICAgfQotI2RlZmluZSBSRUpDSVNIT1JUKG9wdCwgbmVnLCB2YWwpIFwKLSAgICBpZiAoZ28tPm5lZyAmJiBcCi0JbGVuID49IENJTEVOX1NIT1JUICYmIFwKLQlwWzFdID09IENJTEVOX1NIT1JUICYmIFwKLQlwWzBdID09IG9wdCkgeyBcCi0JbGVuIC09IENJTEVOX1NIT1JUOyBcCi0JSU5DUFRSKDIsIHApOyBcCi0JR0VUU0hPUlQoY2lzaG9ydCwgcCk7IFwKLQkvKiBDaGVjayByZWplY3RlZCB2YWx1ZS4gKi8gXAotCWlmIChjaXNob3J0ICE9IHZhbCkgXAotCSAgICBnb3RvIGJhZDsgXAotCXRyeS5uZWcgPSAwOyBcCi0gICAgfQotI2RlZmluZSBSRUpDSUNIQVAob3B0LCBuZWcsIHZhbCkgXAotICAgIGlmIChnby0+bmVnICYmIFwKLQlsZW4gPj0gQ0lMRU5fQ0hBUCAmJiBcCi0JcFsxXSA9PSBDSUxFTl9DSEFQICYmIFwKLQlwWzBdID09IG9wdCkgeyBcCi0JbGVuIC09IENJTEVOX0NIQVA7IFwKLQlJTkNQVFIoMiwgcCk7IFwKLQlHRVRTSE9SVChjaXNob3J0LCBwKTsgXAotCUdFVENIQVIoY2ljaGFyLCBwKTsgXAotCS8qIENoZWNrIHJlamVjdGVkIHZhbHVlLiAqLyBcCi0JaWYgKChjaXNob3J0ICE9IFBQUF9DSEFQKSB8fCAoY2ljaGFyICE9IChDSEFQX0RJR0VTVCh2YWwpKSkpIFwKLQkgICAgZ290byBiYWQ7IFwKLQl0cnkubmVnID0gMDsgXAotCXRyeS5uZWdfZWFwID0gdHJ5Lm5lZ191cGFwID0gMDsgXAotICAgIH0KLSNkZWZpbmUgUkVKQ0lMT05HKG9wdCwgbmVnLCB2YWwpIFwKLSAgICBpZiAoZ28tPm5lZyAmJiBcCi0JbGVuID49IENJTEVOX0xPTkcgJiYgXAotCXBbMV0gPT0gQ0lMRU5fTE9ORyAmJiBcCi0JcFswXSA9PSBvcHQpIHsgXAotCWxlbiAtPSBDSUxFTl9MT05HOyBcCi0JSU5DUFRSKDIsIHApOyBcCi0JR0VUTE9ORyhjaWxvbmcsIHApOyBcCi0JLyogQ2hlY2sgcmVqZWN0ZWQgdmFsdWUuICovIFwKLQlpZiAoY2lsb25nICE9IHZhbCkgXAotCSAgICBnb3RvIGJhZDsgXAotCXRyeS5uZWcgPSAwOyBcCi0gICAgfQotI2RlZmluZSBSRUpDSUxRUihvcHQsIG5lZywgdmFsKSBcCi0gICAgaWYgKGdvLT5uZWcgJiYgXAotCWxlbiA+PSBDSUxFTl9MUVIgJiYgXAotCXBbMV0gPT0gQ0lMRU5fTFFSICYmIFwKLQlwWzBdID09IG9wdCkgeyBcCi0JbGVuIC09IENJTEVOX0xRUjsgXAotCUlOQ1BUUigyLCBwKTsgXAotCUdFVFNIT1JUKGNpc2hvcnQsIHApOyBcCi0JR0VUTE9ORyhjaWxvbmcsIHApOyBcCi0JLyogQ2hlY2sgcmVqZWN0ZWQgdmFsdWUuICovIFwKLQlpZiAoY2lzaG9ydCAhPSBQUFBfTFFSIHx8IGNpbG9uZyAhPSB2YWwpIFwKLQkgICAgZ290byBiYWQ7IFwKLQl0cnkubmVnID0gMDsgXAotICAgIH0KLSNkZWZpbmUgUkVKQ0lDQkNQKG9wdCwgbmVnLCB2YWwpIFwKLSAgICBpZiAoZ28tPm5lZyAmJiBcCi0JbGVuID49IENJTEVOX0NCQ1AgJiYgXAotCXBbMV0gPT0gQ0lMRU5fQ0JDUCAmJiBcCi0JcFswXSA9PSBvcHQpIHsgXAotCWxlbiAtPSBDSUxFTl9DQkNQOyBcCi0JSU5DUFRSKDIsIHApOyBcCi0JR0VUQ0hBUihjaWNoYXIsIHApOyBcCi0JLyogQ2hlY2sgcmVqZWN0ZWQgdmFsdWUuICovIFwKLQlpZiAoY2ljaGFyICE9IHZhbCkgXAotCSAgICBnb3RvIGJhZDsgXAotCXRyeS5uZWcgPSAwOyBcCi0gICAgfQotI2RlZmluZSBSRUpDSUVORFAob3B0LCBuZWcsIGNsYXNzLCB2YWwsIHZsZW4pIFwKLSAgICBpZiAoZ28tPm5lZyAmJiBcCi0JbGVuID49IENJTEVOX0NIQVIgKyB2bGVuICYmIFwKLQlwWzBdID09IG9wdCAmJiBcCi0JcFsxXSA9PSBDSUxFTl9DSEFSICsgdmxlbikgeyBcCi0JaW50IGk7IFwKLQlsZW4gLT0gQ0lMRU5fQ0hBUiArIHZsZW47IFwKLQlJTkNQVFIoMiwgcCk7IFwKLQlHRVRDSEFSKGNpY2hhciwgcCk7IFwKLQlpZiAoY2ljaGFyICE9IGNsYXNzKSBcCi0JICAgIGdvdG8gYmFkOyBcCi0JZm9yIChpID0gMDsgaSA8IHZsZW47ICsraSkgeyBcCi0JICAgIEdFVENIQVIoY2ljaGFyLCBwKTsgXAotCSAgICBpZiAoY2ljaGFyICE9IHZhbFtpXSkgXAotCQlnb3RvIGJhZDsgXAotCX0gXAotCXRyeS5uZWcgPSAwOyBcCi0gICAgfQotCi0gICAgUkVKQ0lTSE9SVChDSV9NUlUsIG5lZ19tcnUsIGdvLT5tcnUpOwotICAgIFJFSkNJTE9ORyhDSV9BU1lOQ01BUCwgbmVnX2FzeW5jbWFwLCBnby0+YXN5bmNtYXApOwotICAgIFJFSkNJU0hPUlQoQ0lfQVVUSFRZUEUsIG5lZ19lYXAsIFBQUF9FQVApOwotICAgIGlmICghZ28tPm5lZ19lYXApIHsKLQlSRUpDSUNIQVAoQ0lfQVVUSFRZUEUsIG5lZ19jaGFwLCBnby0+Y2hhcF9tZHR5cGUpOwotCWlmICghZ28tPm5lZ19jaGFwKSB7Ci0JICAgIFJFSkNJU0hPUlQoQ0lfQVVUSFRZUEUsIG5lZ191cGFwLCBQUFBfUEFQKTsKLQl9Ci0gICAgfQotICAgIFJFSkNJTFFSKENJX1FVQUxJVFksIG5lZ19scXIsIGdvLT5scXJfcGVyaW9kKTsKLSAgICBSRUpDSUNCQ1AoQ0lfQ0FMTEJBQ0ssIG5lZ19jYmNwLCBDQkNQX09QVCk7Ci0gICAgUkVKQ0lMT05HKENJX01BR0lDTlVNQkVSLCBuZWdfbWFnaWNudW1iZXIsIGdvLT5tYWdpY251bWJlcik7Ci0gICAgUkVKQ0lWT0lEKENJX1BDT01QUkVTU0lPTiwgbmVnX3Bjb21wcmVzc2lvbik7Ci0gICAgUkVKQ0lWT0lEKENJX0FDQ09NUFJFU1NJT04sIG5lZ19hY2NvbXByZXNzaW9uKTsKLSAgICBSRUpDSVNIT1JUKENJX01SUlUsIG5lZ19tcnJ1LCBnby0+bXJydSk7Ci0gICAgUkVKQ0lWT0lEKENJX1NTTkhGLCBuZWdfc3NuaGYpOwotICAgIFJFSkNJRU5EUChDSV9FUERJU0MsIG5lZ19lbmRwb2ludCwgZ28tPmVuZHBvaW50LmNsYXNzLAotCSAgICAgIGdvLT5lbmRwb2ludC52YWx1ZSwgZ28tPmVuZHBvaW50Lmxlbmd0aCk7Ci0KLSAgICAvKgotICAgICAqIElmIHRoZXJlIGFyZSBhbnkgcmVtYWluaW5nIENJcywgdGhlbiB0aGlzIHBhY2tldCBpcyBiYWQuCi0gICAgICovCi0gICAgaWYgKGxlbiAhPSAwKQotCWdvdG8gYmFkOwotICAgIC8qCi0gICAgICogTm93IHdlIGNhbiB1cGRhdGUgc3RhdGUuCi0gICAgICovCi0gICAgaWYgKGYtPnN0YXRlICE9IE9QRU5FRCkKLQkqZ28gPSB0cnk7Ci0gICAgcmV0dXJuIDE7Ci0KLWJhZDoKLSAgICBMQ1BERUJVRygoImxjcF9yZWpjaTogcmVjZWl2ZWQgYmFkIFJlamVjdCEiKSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqIGxjcF9yZXFjaSAtIENoZWNrIHRoZSBwZWVyJ3MgcmVxdWVzdGVkIENJcyBhbmQgc2VuZCBhcHByb3ByaWF0ZSByZXNwb25zZS4KLSAqCi0gKiBSZXR1cm5zOiBDT05GQUNLLCBDT05GTkFLIG9yIENPTkZSRUogYW5kIGlucHV0IHBhY2tldCBtb2RpZmllZAotICogYXBwcm9wcmlhdGVseS4gIElmIHJlamVjdF9pZl9kaXNhZ3JlZSBpcyBub24temVybywgZG9lc24ndCByZXR1cm4KLSAqIENPTkZOQUs7IHJldHVybnMgQ09ORlJFSiBpZiBpdCBjYW4ndCByZXR1cm4gQ09ORkFDSy4KLSAqLwotc3RhdGljIGludAotbGNwX3JlcWNpKGYsIGlucCwgbGVucCwgcmVqZWN0X2lmX2Rpc2FncmVlKQotICAgIGZzbSAqZjsKLSAgICB1X2NoYXIgKmlucDsJCS8qIFJlcXVlc3RlZCBDSXMgKi8KLSAgICBpbnQgKmxlbnA7CQkJLyogTGVuZ3RoIG9mIHJlcXVlc3RlZCBDSXMgKi8KLSAgICBpbnQgcmVqZWN0X2lmX2Rpc2FncmVlOwotewotICAgIGxjcF9vcHRpb25zICpnbyA9ICZsY3BfZ290b3B0aW9uc1tmLT51bml0XTsKLSAgICBsY3Bfb3B0aW9ucyAqaG8gPSAmbGNwX2hpc29wdGlvbnNbZi0+dW5pdF07Ci0gICAgbGNwX29wdGlvbnMgKmFvID0gJmxjcF9hbGxvd29wdGlvbnNbZi0+dW5pdF07Ci0gICAgdV9jaGFyICpjaXAsICpuZXh0OwkJLyogUG9pbnRlciB0byBjdXJyZW50IGFuZCBuZXh0IENJcyAqLwotICAgIGludCBjaWxlbiwgY2l0eXBlLCBjaWNoYXI7CS8qIFBhcnNlZCBsZW4sIHR5cGUsIGNoYXIgdmFsdWUgKi8KLSAgICB1X3Nob3J0IGNpc2hvcnQ7CQkvKiBQYXJzZWQgc2hvcnQgdmFsdWUgKi8KLSAgICB1X2ludDMyX3QgY2lsb25nOwkJLyogUGFyc2UgbG9uZyB2YWx1ZSAqLwotICAgIGludCByYyA9IENPTkZBQ0s7CQkvKiBGaW5hbCBwYWNrZXQgcmV0dXJuIGNvZGUgKi8KLSAgICBpbnQgb3JjOwkJCS8qIEluZGl2aWR1YWwgb3B0aW9uIHJldHVybiBjb2RlICovCi0gICAgdV9jaGFyICpwOwkJCS8qIFBvaW50ZXIgdG8gbmV4dCBjaGFyIHRvIHBhcnNlICovCi0gICAgdV9jaGFyICpyZWpwOwkJLyogUG9pbnRlciB0byBuZXh0IGNoYXIgaW4gcmVqZWN0IGZyYW1lICovCi0gICAgdV9jaGFyICpuYWtwOwkJLyogUG9pbnRlciB0byBuZXh0IGNoYXIgaW4gTmFrIGZyYW1lICovCi0gICAgaW50IGwgPSAqbGVucDsJCS8qIExlbmd0aCBsZWZ0ICovCi0KLSAgICAvKgotICAgICAqIFJlc2V0IGFsbCBoaXMgb3B0aW9ucy4KLSAgICAgKi8KLSAgICBCWkVSTyhobywgc2l6ZW9mKCpobykpOwotCi0gICAgLyoKLSAgICAgKiBQcm9jZXNzIGFsbCBoaXMgb3B0aW9ucy4KLSAgICAgKi8KLSAgICBuZXh0ID0gaW5wOwotICAgIG5ha3AgPSBuYWtfYnVmZmVyOwotICAgIHJlanAgPSBpbnA7Ci0gICAgd2hpbGUgKGwpIHsKLQlvcmMgPSBDT05GQUNLOwkJCS8qIEFzc3VtZSBzdWNjZXNzICovCi0JY2lwID0gcCA9IG5leHQ7CQkJLyogUmVtZW1iZXIgYmVnaW5pbmcgb2YgQ0kgKi8KLQlpZiAobCA8IDIgfHwJCQkvKiBOb3QgZW5vdWdoIGRhdGEgZm9yIENJIGhlYWRlciBvciAqLwotCSAgICBwWzFdIDwgMiB8fAkJCS8qICBDSSBsZW5ndGggdG9vIHNtYWxsIG9yICovCi0JICAgIHBbMV0gPiBsKSB7CQkJLyogIENJIGxlbmd0aCB0b28gYmlnPyAqLwotCSAgICBMQ1BERUJVRygoImxjcF9yZXFjaTogYmFkIENJIGxlbmd0aCEiKSk7Ci0JICAgIG9yYyA9IENPTkZSRUo7CQkvKiBSZWplY3QgYmFkIENJICovCi0JICAgIGNpbGVuID0gbDsJCQkvKiBSZWplY3QgdGlsbCBlbmQgb2YgcGFja2V0ICovCi0JICAgIGwgPSAwOwkJCS8qIERvbid0IGxvb3AgYWdhaW4gKi8KLQkgICAgY2l0eXBlID0gMDsKLQkgICAgZ290byBlbmRzd2l0Y2g7Ci0JfQotCUdFVENIQVIoY2l0eXBlLCBwKTsJCS8qIFBhcnNlIENJIHR5cGUgKi8KLQlHRVRDSEFSKGNpbGVuLCBwKTsJCS8qIFBhcnNlIENJIGxlbmd0aCAqLwotCWwgLT0gY2lsZW47CQkJLyogQWRqdXN0IHJlbWFpbmluZyBsZW5ndGggKi8KLQluZXh0ICs9IGNpbGVuOwkJCS8qIFN0ZXAgdG8gbmV4dCBDSSAqLwotCi0Jc3dpdGNoIChjaXR5cGUpIHsJCS8qIENoZWNrIENJIHR5cGUgKi8KLQljYXNlIENJX01SVToKLQkgICAgaWYgKCFhby0+bmVnX21ydSB8fAkJLyogQWxsb3cgb3B0aW9uPyAqLwotCQljaWxlbiAhPSBDSUxFTl9TSE9SVCkgewkvKiBDaGVjayBDSSBsZW5ndGggKi8KLQkJb3JjID0gQ09ORlJFSjsJCS8qIFJlamVjdCBDSSAqLwotCQlicmVhazsKLQkgICAgfQotCSAgICBHRVRTSE9SVChjaXNob3J0LCBwKTsJLyogUGFyc2UgTVJVICovCi0KLQkgICAgLyoKLQkgICAgICogSGUgbXVzdCBiZSBhYmxlIHRvIHJlY2VpdmUgYXQgbGVhc3Qgb3VyIG1pbmltdW0uCi0JICAgICAqIE5vIG5lZWQgdG8gY2hlY2sgYSBtYXhpbXVtLiAgSWYgaGUgc2VuZHMgYSBsYXJnZSBudW1iZXIsCi0JICAgICAqIHdlJ2xsIGp1c3QgaWdub3JlIGl0LgotCSAgICAgKi8KLQkgICAgaWYgKGNpc2hvcnQgPCBNSU5NUlUpIHsKLQkJb3JjID0gQ09ORk5BSzsJCS8qIE5hayBDSSAqLwotCQlQVVRDSEFSKENJX01SVSwgbmFrcCk7Ci0JCVBVVENIQVIoQ0lMRU5fU0hPUlQsIG5ha3ApOwotCQlQVVRTSE9SVChNSU5NUlUsIG5ha3ApOwkvKiBHaXZlIGhpbSBhIGhpbnQgKi8KLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgaG8tPm5lZ19tcnUgPSAxOwkJLyogUmVtZW1iZXIgaGUgc2VudCBNUlUgKi8KLQkgICAgaG8tPm1ydSA9IGNpc2hvcnQ7CQkvKiBBbmQgcmVtZW1iZXIgdmFsdWUgKi8KLQkgICAgYnJlYWs7Ci0KLQljYXNlIENJX0FTWU5DTUFQOgotCSAgICBpZiAoIWFvLT5uZWdfYXN5bmNtYXAgfHwKLQkJY2lsZW4gIT0gQ0lMRU5fTE9ORykgewotCQlvcmMgPSBDT05GUkVKOwotCQlicmVhazsKLQkgICAgfQotCSAgICBHRVRMT05HKGNpbG9uZywgcCk7Ci0KLQkgICAgLyoKLQkgICAgICogQXN5bmNtYXAgbXVzdCBoYXZlIHNldCBhdCBsZWFzdCB0aGUgYml0cwotCSAgICAgKiB3aGljaCBhcmUgc2V0IGluIGxjcF9hbGxvd29wdGlvbnNbdW5pdF0uYXN5bmNtYXAuCi0JICAgICAqLwotCSAgICBpZiAoKGFvLT5hc3luY21hcCAmIH5jaWxvbmcpICE9IDApIHsKLQkJb3JjID0gQ09ORk5BSzsKLQkJUFVUQ0hBUihDSV9BU1lOQ01BUCwgbmFrcCk7Ci0JCVBVVENIQVIoQ0lMRU5fTE9ORywgbmFrcCk7Ci0JCVBVVExPTkcoYW8tPmFzeW5jbWFwIHwgY2lsb25nLCBuYWtwKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgaG8tPm5lZ19hc3luY21hcCA9IDE7Ci0JICAgIGhvLT5hc3luY21hcCA9IGNpbG9uZzsKLQkgICAgYnJlYWs7Ci0KLQljYXNlIENJX0FVVEhUWVBFOgotCSAgICBpZiAoY2lsZW4gPCBDSUxFTl9TSE9SVCB8fAotCQkhKGFvLT5uZWdfdXBhcCB8fCBhby0+bmVnX2NoYXAgfHwgYW8tPm5lZ19lYXApKSB7Ci0JCS8qCi0JCSAqIFJlamVjdCB0aGUgb3B0aW9uIGlmIHdlJ3JlIG5vdCB3aWxsaW5nIHRvIGF1dGhlbnRpY2F0ZS4KLQkJICovCi0JCWRiZ2xvZygiTm8gYXV0aCBpcyBwb3NzaWJsZSIpOwotCQlvcmMgPSBDT05GUkVKOwotCQlicmVhazsKLQkgICAgfQotCSAgICBHRVRTSE9SVChjaXNob3J0LCBwKTsKLQotCSAgICAvKgotCSAgICAgKiBBdXRodHlwZSBtdXN0IGJlIFBBUCwgQ0hBUCwgb3IgRUFQLgotCSAgICAgKgotCSAgICAgKiBOb3RlOiBpZiBtb3JlIHRoYW4gb25lIG9mIGFvLT5uZWdfdXBhcCwgYW8tPm5lZ19jaGFwLCBhbmQKLQkgICAgICogYW8tPm5lZ19lYXAgYXJlIHNldCwgYW5kIHRoZSBwZWVyIHNlbmRzIGEgQ29uZmlndXJlLVJlcXVlc3QKLQkgICAgICogd2l0aCB0d28gb3IgbW9yZSBhdXRoZW50aWNhdGUtcHJvdG9jb2wgcmVxdWVzdHMsIHRoZW4gd2Ugd2lsbAotCSAgICAgKiByZWplY3QgdGhlIHNlY29uZCByZXF1ZXN0LgotCSAgICAgKiBXaGV0aGVyIHdlIGVuZCB1cCBkb2luZyBDSEFQLCBVUEFQLCBvciBFQVAgZGVwZW5kcyB0aGVuIG9uCi0JICAgICAqIHRoZSBvcmRlcmluZyBvZiB0aGUgQ0lzIGluIHRoZSBwZWVyJ3MgQ29uZmlndXJlLVJlcXVlc3QuCi0gICAgICAgICAgICAgKi8KLQotCSAgICBpZiAoY2lzaG9ydCA9PSBQUFBfUEFQKSB7Ci0JCS8qIHdlJ3ZlIGFscmVhZHkgYWNjZXB0ZWQgQ0hBUCBvciBFQVAgKi8KLQkJaWYgKGhvLT5uZWdfY2hhcCB8fCBoby0+bmVnX2VhcCB8fAotCQkgICAgY2lsZW4gIT0gQ0lMRU5fU0hPUlQpIHsKLQkJICAgIExDUERFQlVHKCgibGNwX3JlcWNpOiByY3ZkIEFVVEhUWVBFIFBBUCwgcmVqZWN0aW5nLi4uIikpOwotCQkgICAgb3JjID0gQ09ORlJFSjsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCWlmICghYW8tPm5lZ191cGFwKSB7CS8qIHdlIGRvbid0IHdhbnQgdG8gZG8gUEFQICovCi0JCSAgICBvcmMgPSBDT05GTkFLOwkvKiBOQUsgaXQgYW5kIHN1Z2dlc3QgQ0hBUCBvciBFQVAgKi8KLQkJICAgIFBVVENIQVIoQ0lfQVVUSFRZUEUsIG5ha3ApOwotCQkgICAgaWYgKGFvLT5uZWdfZWFwKSB7Ci0JCQlQVVRDSEFSKENJTEVOX1NIT1JULCBuYWtwKTsKLQkJCVBVVFNIT1JUKFBQUF9FQVAsIG5ha3ApOwotCQkgICAgfSBlbHNlIHsKLQkJCVBVVENIQVIoQ0lMRU5fQ0hBUCwgbmFrcCk7Ci0JCQlQVVRTSE9SVChQUFBfQ0hBUCwgbmFrcCk7Ci0JCQlQVVRDSEFSKENIQVBfRElHRVNUKGFvLT5jaGFwX21kdHlwZSksIG5ha3ApOwotCQkgICAgfQotCQkgICAgYnJlYWs7Ci0JCX0KLQkJaG8tPm5lZ191cGFwID0gMTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgaWYgKGNpc2hvcnQgPT0gUFBQX0NIQVApIHsKLQkJLyogd2UndmUgYWxyZWFkeSBhY2NlcHRlZCBQQVAgb3IgRUFQICovCi0JCWlmIChoby0+bmVnX3VwYXAgfHwgaG8tPm5lZ19lYXAgfHwKLQkJICAgIGNpbGVuICE9IENJTEVOX0NIQVApIHsKLQkJICAgIExDUERFQlVHKCgibGNwX3JlcWNpOiByY3ZkIEFVVEhUWVBFIENIQVAsIHJlamVjdGluZy4uLiIpKTsKLQkJICAgIG9yYyA9IENPTkZSRUo7Ci0JCSAgICBicmVhazsKLQkJfQotCQlpZiAoIWFvLT5uZWdfY2hhcCkgewkvKiB3ZSBkb24ndCB3YW50IHRvIGRvIENIQVAgKi8KLQkJICAgIG9yYyA9IENPTkZOQUs7CS8qIE5BSyBpdCBhbmQgc3VnZ2VzdCBFQVAgb3IgUEFQICovCi0JCSAgICBQVVRDSEFSKENJX0FVVEhUWVBFLCBuYWtwKTsKLQkJICAgIFBVVENIQVIoQ0lMRU5fU0hPUlQsIG5ha3ApOwotCQkgICAgaWYgKGFvLT5uZWdfZWFwKSB7Ci0JCQlQVVRTSE9SVChQUFBfRUFQLCBuYWtwKTsKLQkJICAgIH0gZWxzZSB7Ci0JCQlQVVRTSE9SVChQUFBfUEFQLCBuYWtwKTsKLQkJICAgIH0KLQkJICAgIGJyZWFrOwotCQl9Ci0JCUdFVENIQVIoY2ljaGFyLCBwKTsJLyogZ2V0IGRpZ2VzdCB0eXBlICovCi0JCWlmICghKENIQVBfQ0FORElHRVNUKGFvLT5jaGFwX21kdHlwZSwgY2ljaGFyKSkpIHsKLQkJICAgIC8qCi0JCSAgICAgKiBXZSBjYW4ndC93b24ndCBkbyB0aGUgcmVxdWVzdGVkIHR5cGUsCi0JCSAgICAgKiBzdWdnZXN0IHNvbWV0aGluZyBlbHNlLgotCQkgICAgICovCi0JCSAgICBvcmMgPSBDT05GTkFLOwotCQkgICAgUFVUQ0hBUihDSV9BVVRIVFlQRSwgbmFrcCk7Ci0JCSAgICBQVVRDSEFSKENJTEVOX0NIQVAsIG5ha3ApOwotCQkgICAgUFVUU0hPUlQoUFBQX0NIQVAsIG5ha3ApOwotCQkgICAgUFVUQ0hBUihDSEFQX0RJR0VTVChhby0+Y2hhcF9tZHR5cGUpLCBuYWtwKTsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCWhvLT5jaGFwX21kdHlwZSA9IENIQVBfTURUWVBFX0QoY2ljaGFyKTsgLyogc2F2ZSBtZCB0eXBlICovCi0JCWhvLT5uZWdfY2hhcCA9IDE7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGlmIChjaXNob3J0ID09IFBQUF9FQVApIHsKLQkJLyogd2UndmUgYWxyZWFkeSBhY2NlcHRlZCBDSEFQIG9yIFBBUCAqLwotCQlpZiAoaG8tPm5lZ19jaGFwIHx8IGhvLT5uZWdfdXBhcCB8fCBjaWxlbiAhPSBDSUxFTl9TSE9SVCkgewotCQkgICAgTENQREVCVUcoKCJsY3BfcmVxY2k6IHJjdmQgQVVUSFRZUEUgRUFQLCByZWplY3RpbmcuLi4iKSk7Ci0JCSAgICBvcmMgPSBDT05GUkVKOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkJaWYgKCFhby0+bmVnX2VhcCkgewkvKiB3ZSBkb24ndCB3YW50IHRvIGRvIEVBUCAqLwotCQkgICAgb3JjID0gQ09ORk5BSzsJLyogTkFLIGl0IGFuZCBzdWdnZXN0IENIQVAgb3IgUEFQICovCi0JCSAgICBQVVRDSEFSKENJX0FVVEhUWVBFLCBuYWtwKTsKLQkJICAgIGlmIChhby0+bmVnX2NoYXApIHsKLQkJCVBVVENIQVIoQ0lMRU5fQ0hBUCwgbmFrcCk7Ci0JCQlQVVRTSE9SVChQUFBfQ0hBUCwgbmFrcCk7Ci0JCQlQVVRDSEFSKENIQVBfRElHRVNUKGFvLT5jaGFwX21kdHlwZSksIG5ha3ApOwotCQkgICAgfSBlbHNlIHsKLQkJCVBVVENIQVIoQ0lMRU5fU0hPUlQsIG5ha3ApOwotCQkJUFVUU0hPUlQoUFBQX1BBUCwgbmFrcCk7Ci0JCSAgICB9Ci0JCSAgICBicmVhazsKLQkJfQotCQloby0+bmVnX2VhcCA9IDE7Ci0JCWJyZWFrOwotCSAgICB9Ci0KLQkgICAgLyoKLQkgICAgICogV2UgZG9uJ3QgcmVjb2duaXplIHRoZSBwcm90b2NvbCB0aGV5J3JlIGFza2luZyBmb3IuCi0JICAgICAqIE5hayBpdCB3aXRoIHNvbWV0aGluZyB3ZSdyZSB3aWxsaW5nIHRvIGRvLgotCSAgICAgKiAoQXQgdGhpcyBwb2ludCB3ZSBrbm93IGFvLT5uZWdfdXBhcCB8fCBhby0+bmVnX2NoYXAgfHwKLQkgICAgICogYW8tPm5lZ19lYXAuKQotCSAgICAgKi8KLQkgICAgb3JjID0gQ09ORk5BSzsKLQkgICAgUFVUQ0hBUihDSV9BVVRIVFlQRSwgbmFrcCk7Ci0JICAgIGlmIChhby0+bmVnX2VhcCkgewotCQlQVVRDSEFSKENJTEVOX1NIT1JULCBuYWtwKTsKLQkJUFVUU0hPUlQoUFBQX0VBUCwgbmFrcCk7Ci0JICAgIH0gZWxzZSBpZiAoYW8tPm5lZ19jaGFwKSB7Ci0JCVBVVENIQVIoQ0lMRU5fQ0hBUCwgbmFrcCk7Ci0JCVBVVFNIT1JUKFBQUF9DSEFQLCBuYWtwKTsKLQkJUFVUQ0hBUihDSEFQX0RJR0VTVChhby0+Y2hhcF9tZHR5cGUpLCBuYWtwKTsKLQkgICAgfSBlbHNlIHsKLQkJUFVUQ0hBUihDSUxFTl9TSE9SVCwgbmFrcCk7Ci0JCVBVVFNIT1JUKFBQUF9QQVAsIG5ha3ApOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBDSV9RVUFMSVRZOgotCSAgICBpZiAoIWFvLT5uZWdfbHFyIHx8Ci0JCWNpbGVuICE9IENJTEVOX0xRUikgewotCQlvcmMgPSBDT05GUkVKOwotCQlicmVhazsKLQkgICAgfQotCi0JICAgIEdFVFNIT1JUKGNpc2hvcnQsIHApOwotCSAgICBHRVRMT05HKGNpbG9uZywgcCk7Ci0KLQkgICAgLyoKLQkgICAgICogQ2hlY2sgdGhlIHByb3RvY29sIGFuZCB0aGUgcmVwb3J0aW5nIHBlcmlvZC4KLQkgICAgICogWFhYIFdoZW4gc2hvdWxkIHdlIE5hayB0aGlzLCBhbmQgd2hhdCB3aXRoPwotCSAgICAgKi8KLQkgICAgaWYgKGNpc2hvcnQgIT0gUFBQX0xRUikgewotCQlvcmMgPSBDT05GTkFLOwotCQlQVVRDSEFSKENJX1FVQUxJVFksIG5ha3ApOwotCQlQVVRDSEFSKENJTEVOX0xRUiwgbmFrcCk7Ci0JCVBVVFNIT1JUKFBQUF9MUVIsIG5ha3ApOwotCQlQVVRMT05HKGFvLT5scXJfcGVyaW9kLCBuYWtwKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQljYXNlIENJX01BR0lDTlVNQkVSOgotCSAgICBpZiAoIShhby0+bmVnX21hZ2ljbnVtYmVyIHx8IGdvLT5uZWdfbWFnaWNudW1iZXIpIHx8Ci0JCWNpbGVuICE9IENJTEVOX0xPTkcpIHsKLQkJb3JjID0gQ09ORlJFSjsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgR0VUTE9ORyhjaWxvbmcsIHApOwotCi0JICAgIC8qCi0JICAgICAqIEhlIG11c3QgaGF2ZSBhIGRpZmZlcmVudCBtYWdpYyBudW1iZXIuCi0JICAgICAqLwotCSAgICBpZiAoZ28tPm5lZ19tYWdpY251bWJlciAmJgotCQljaWxvbmcgPT0gZ28tPm1hZ2ljbnVtYmVyKSB7Ci0JCWNpbG9uZyA9IG1hZ2ljKCk7CS8qIERvbid0IHB1dCBtYWdpYygpIGluc2lkZSBtYWNybyEgKi8KLQkJb3JjID0gQ09ORk5BSzsKLQkJUFVUQ0hBUihDSV9NQUdJQ05VTUJFUiwgbmFrcCk7Ci0JCVBVVENIQVIoQ0lMRU5fTE9ORywgbmFrcCk7Ci0JCVBVVExPTkcoY2lsb25nLCBuYWtwKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgaG8tPm5lZ19tYWdpY251bWJlciA9IDE7Ci0JICAgIGhvLT5tYWdpY251bWJlciA9IGNpbG9uZzsKLQkgICAgYnJlYWs7Ci0KLQotCWNhc2UgQ0lfUENPTVBSRVNTSU9OOgotCSAgICBpZiAoIWFvLT5uZWdfcGNvbXByZXNzaW9uIHx8Ci0JCWNpbGVuICE9IENJTEVOX1ZPSUQpIHsKLQkJb3JjID0gQ09ORlJFSjsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgaG8tPm5lZ19wY29tcHJlc3Npb24gPSAxOwotCSAgICBicmVhazsKLQotCWNhc2UgQ0lfQUNDT01QUkVTU0lPTjoKLQkgICAgaWYgKCFhby0+bmVnX2FjY29tcHJlc3Npb24gfHwKLQkJY2lsZW4gIT0gQ0lMRU5fVk9JRCkgewotCQlvcmMgPSBDT05GUkVKOwotCQlicmVhazsKLQkgICAgfQotCSAgICBoby0+bmVnX2FjY29tcHJlc3Npb24gPSAxOwotCSAgICBicmVhazsKLQotCWNhc2UgQ0lfTVJSVToKLQkgICAgaWYgKCFhby0+bmVnX21ycnUgfHwgIW11bHRpbGluayB8fAotCQljaWxlbiAhPSBDSUxFTl9TSE9SVCkgewotCQlvcmMgPSBDT05GUkVKOwotCQlicmVhazsKLQkgICAgfQotCi0JICAgIEdFVFNIT1JUKGNpc2hvcnQsIHApOwotCSAgICAvKiBwb3NzaWJseSBzaG91bGQgaW5zaXN0IG9uIGEgbWluaW11bS9tYXhpbXVtIE1SUlUgaGVyZSAqLwotCSAgICBoby0+bmVnX21ycnUgPSAxOwotCSAgICBoby0+bXJydSA9IGNpc2hvcnQ7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBDSV9TU05IRjoKLQkgICAgaWYgKCFhby0+bmVnX3NzbmhmIHx8ICFtdWx0aWxpbmsgfHwKLQkJY2lsZW4gIT0gQ0lMRU5fVk9JRCkgewotCQlvcmMgPSBDT05GUkVKOwotCQlicmVhazsKLQkgICAgfQotCSAgICBoby0+bmVnX3NzbmhmID0gMTsKLQkgICAgYnJlYWs7Ci0KLQljYXNlIENJX0VQRElTQzoKLQkgICAgaWYgKCFhby0+bmVnX2VuZHBvaW50IHx8Ci0JCWNpbGVuIDwgQ0lMRU5fQ0hBUiB8fAotCQljaWxlbiA+IENJTEVOX0NIQVIgKyBNQVhfRU5EUF9MRU4pIHsKLQkJb3JjID0gQ09ORlJFSjsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgR0VUQ0hBUihjaWNoYXIsIHApOwotCSAgICBjaWxlbiAtPSBDSUxFTl9DSEFSOwotCSAgICBoby0+bmVnX2VuZHBvaW50ID0gMTsKLQkgICAgaG8tPmVuZHBvaW50LmNsYXNzID0gY2ljaGFyOwotCSAgICBoby0+ZW5kcG9pbnQubGVuZ3RoID0gY2lsZW47Ci0JICAgIEJDT1BZKHAsIGhvLT5lbmRwb2ludC52YWx1ZSwgY2lsZW4pOwotCSAgICBJTkNQVFIoY2lsZW4sIHApOwotCSAgICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICAgIExDUERFQlVHKCgibGNwX3JlcWNpOiByY3ZkIHVua25vd24gb3B0aW9uICVkIiwgY2l0eXBlKSk7Ci0JICAgIG9yYyA9IENPTkZSRUo7Ci0JICAgIGJyZWFrOwotCX0KLQotZW5kc3dpdGNoOgotCWlmIChvcmMgPT0gQ09ORkFDSyAmJgkJLyogR29vZCBDSSAqLwotCSAgICByYyAhPSBDT05GQUNLKQkJLyogIGJ1dCBwcmlvciBDSSB3YXNudD8gKi8KLQkgICAgY29udGludWU7CQkJLyogRG9uJ3Qgc2VuZCB0aGlzIG9uZSAqLwotCi0JaWYgKG9yYyA9PSBDT05GTkFLKSB7CQkvKiBOYWsgdGhpcyBDST8gKi8KLQkgICAgaWYgKHJlamVjdF9pZl9kaXNhZ3JlZQkvKiBHZXR0aW5nIGZlZCB1cCB3aXRoIHNlbmRpbmcgTkFLcz8gKi8KLQkJJiYgY2l0eXBlICE9IENJX01BR0lDTlVNQkVSKSB7Ci0JCW9yYyA9IENPTkZSRUo7CQkvKiBHZXQgdG91Z2ggaWYgc28gKi8KLQkgICAgfSBlbHNlIHsKLQkJaWYgKHJjID09IENPTkZSRUopCS8qIFJlamVjdGluZyBwcmlvciBDST8gKi8KLQkJICAgIGNvbnRpbnVlOwkJLyogRG9uJ3Qgc2VuZCB0aGlzIG9uZSAqLwotCQlyYyA9IENPTkZOQUs7Ci0JICAgIH0KLQl9Ci0JaWYgKG9yYyA9PSBDT05GUkVKKSB7CQkvKiBSZWplY3QgdGhpcyBDSSAqLwotCSAgICByYyA9IENPTkZSRUo7Ci0JICAgIGlmIChjaXAgIT0gcmVqcCkJCS8qIE5lZWQgdG8gbW92ZSByZWplY3RlZCBDST8gKi8KLQkJQkNPUFkoY2lwLCByZWpwLCBjaWxlbik7IC8qIE1vdmUgaXQgKi8KLQkgICAgSU5DUFRSKGNpbGVuLCByZWpwKTsJLyogVXBkYXRlIG91dHB1dCBwb2ludGVyICovCi0JfQotICAgIH0KLQotICAgIC8qCi0gICAgICogSWYgd2Ugd2FudGVkIHRvIHNlbmQgYWRkaXRpb25hbCBOQUtzIChmb3IgdW5zZW50IENJcyksIHRoZQotICAgICAqIGNvZGUgd291bGQgZ28gaGVyZS4gIFRoZSBleHRyYSBOQUtzIHdvdWxkIGdvIGF0ICpuYWtwLgotICAgICAqIEF0IHByZXNlbnQgdGhlcmUgYXJlIG5vIGNhc2VzIHdoZXJlIHdlIHdhbnQgdG8gYXNrIHRoZQotICAgICAqIHBlZXIgdG8gbmVnb3RpYXRlIGFuIG9wdGlvbi4KLSAgICAgKi8KLQotICAgIHN3aXRjaCAocmMpIHsKLSAgICBjYXNlIENPTkZBQ0s6Ci0JKmxlbnAgPSBuZXh0IC0gaW5wOwotCWJyZWFrOwotICAgIGNhc2UgQ09ORk5BSzoKLQkvKgotCSAqIENvcHkgdGhlIE5haydkIG9wdGlvbnMgZnJvbSB0aGUgbmFrX2J1ZmZlciB0byB0aGUgY2FsbGVyJ3MgYnVmZmVyLgotCSAqLwotCSpsZW5wID0gbmFrcCAtIG5ha19idWZmZXI7Ci0JQkNPUFkobmFrX2J1ZmZlciwgaW5wLCAqbGVucCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBDT05GUkVKOgotCSpsZW5wID0gcmVqcCAtIGlucDsKLQlicmVhazsKLSAgICB9Ci0KLSAgICBMQ1BERUJVRygoImxjcF9yZXFjaTogcmV0dXJuaW5nIENPTkYlcy4iLCBDT0RFTkFNRShyYykpKTsKLSAgICByZXR1cm4gKHJjKTsJCQkvKiBSZXR1cm4gZmluYWwgY29kZSAqLwotfQotCi0KLS8qCi0gKiBsY3BfdXAgLSBMQ1AgaGFzIGNvbWUgVVAuCi0gKi8KLXN0YXRpYyB2b2lkCi1sY3BfdXAoZikKLSAgICBmc20gKmY7Ci17Ci0gICAgbGNwX29wdGlvbnMgKndvID0gJmxjcF93YW50b3B0aW9uc1tmLT51bml0XTsKLSAgICBsY3Bfb3B0aW9ucyAqaG8gPSAmbGNwX2hpc29wdGlvbnNbZi0+dW5pdF07Ci0gICAgbGNwX29wdGlvbnMgKmdvID0gJmxjcF9nb3RvcHRpb25zW2YtPnVuaXRdOwotICAgIGxjcF9vcHRpb25zICphbyA9ICZsY3BfYWxsb3dvcHRpb25zW2YtPnVuaXRdOwotICAgIGludCBtdHUsIG1ydTsKLQotICAgIGlmICghZ28tPm5lZ19tYWdpY251bWJlcikKLQlnby0+bWFnaWNudW1iZXIgPSAwOwotICAgIGlmICghaG8tPm5lZ19tYWdpY251bWJlcikKLQloby0+bWFnaWNudW1iZXIgPSAwOwotCi0gICAgLyoKLSAgICAgKiBTZXQgb3VyIE1UVSB0byB0aGUgc21hbGxlciBvZiB0aGUgTVRVIHdlIHdhbnRlZCBhbmQKLSAgICAgKiB0aGUgTVJVIG91ciBwZWVyIHdhbnRlZC4gIElmIHdlIG5lZ290aWF0ZWQgYW4gTVJVLAotICAgICAqIHNldCBvdXIgTVJVIHRvIHRoZSBsYXJnZXIgb2YgdmFsdWUgd2Ugd2FudGVkIGFuZAotICAgICAqIHRoZSB2YWx1ZSB3ZSBnb3QgaW4gdGhlIG5lZ290aWF0aW9uLgotICAgICAqIE5vdGUgb24gdGhlIE1UVTogdGhlIGxpbmsgTVRVIGNhbiBiZSB0aGUgTVJVIHRoZSBwZWVyIHdhbnRlZCwKLSAgICAgKiB0aGUgaW50ZXJmYWNlIE1UVSBpcyBzZXQgdG8gdGhlIGxvd2VzdCBvZiB0aGF0LCB0aGUKLSAgICAgKiBNVFUgd2Ugd2FudCB0byB1c2UsIGFuZCBvdXIgbGluayBNUlUuCi0gICAgICovCi0gICAgbXR1ID0gaG8tPm5lZ19tcnU/IGhvLT5tcnU6IFBQUF9NUlU7Ci0gICAgbXJ1ID0gZ28tPm5lZ19tcnU/IE1BWCh3by0+bXJ1LCBnby0+bXJ1KTogUFBQX01SVTsKLSNpZmRlZiBIQVZFX01VTFRJTElOSwotICAgIGlmICghKG11bHRpbGluayAmJiBnby0+bmVnX21ycnUgJiYgaG8tPm5lZ19tcnJ1KSkKLSNlbmRpZiAvKiBIQVZFX01VTFRJTElOSyAqLwotCW5ldGlmX3NldF9tdHUoZi0+dW5pdCwgTUlOKE1JTihtdHUsIG1ydSksIGFvLT5tcnUpKTsKLSAgICBwcHBfc2VuZF9jb25maWcoZi0+dW5pdCwgbXR1LAotCQkgICAgKGhvLT5uZWdfYXN5bmNtYXA/IGhvLT5hc3luY21hcDogMHhmZmZmZmZmZiksCi0JCSAgICBoby0+bmVnX3Bjb21wcmVzc2lvbiwgaG8tPm5lZ19hY2NvbXByZXNzaW9uKTsKLSAgICBwcHBfcmVjdl9jb25maWcoZi0+dW5pdCwgbXJ1LAotCQkgICAgKGxheF9yZWN2PyAwOiBnby0+bmVnX2FzeW5jbWFwPyBnby0+YXN5bmNtYXA6IDB4ZmZmZmZmZmYpLAotCQkgICAgZ28tPm5lZ19wY29tcHJlc3Npb24sIGdvLT5uZWdfYWNjb21wcmVzc2lvbik7Ci0KLSAgICBpZiAoaG8tPm5lZ19tcnUpCi0JcGVlcl9tcnVbZi0+dW5pdF0gPSBoby0+bXJ1OwotCi0gICAgbGNwX2VjaG9fbG93ZXJ1cChmLT51bml0KTsgIC8qIEVuYWJsZSBlY2hvIG1lc3NhZ2VzICovCi0KLSAgICBsaW5rX2VzdGFibGlzaGVkKGYtPnVuaXQpOwotfQotCi0KLS8qCi0gKiBsY3BfZG93biAtIExDUCBoYXMgZ29uZSBET1dOLgotICoKLSAqIEFsZXJ0IG90aGVyIHByb3RvY29scy4KLSAqLwotc3RhdGljIHZvaWQKLWxjcF9kb3duKGYpCi0gICAgZnNtICpmOwotewotICAgIGxjcF9vcHRpb25zICpnbyA9ICZsY3BfZ290b3B0aW9uc1tmLT51bml0XTsKLQotICAgIGxjcF9lY2hvX2xvd2VyZG93bihmLT51bml0KTsKLQotICAgIGxpbmtfZG93bihmLT51bml0KTsKLQotICAgIHBwcF9zZW5kX2NvbmZpZyhmLT51bml0LCBQUFBfTVJVLCAweGZmZmZmZmZmLCAwLCAwKTsKLSAgICBwcHBfcmVjdl9jb25maWcoZi0+dW5pdCwgUFBQX01SVSwKLQkJICAgIChnby0+bmVnX2FzeW5jbWFwPyBnby0+YXN5bmNtYXA6IDB4ZmZmZmZmZmYpLAotCQkgICAgZ28tPm5lZ19wY29tcHJlc3Npb24sIGdvLT5uZWdfYWNjb21wcmVzc2lvbik7Ci0gICAgcGVlcl9tcnVbZi0+dW5pdF0gPSBQUFBfTVJVOwotfQotCi0KLS8qCi0gKiBsY3Bfc3RhcnRpbmcgLSBMQ1AgbmVlZHMgdGhlIGxvd2VyIGxheWVyIHVwLgotICovCi1zdGF0aWMgdm9pZAotbGNwX3N0YXJ0aW5nKGYpCi0gICAgZnNtICpmOwotewotICAgIGxpbmtfcmVxdWlyZWQoZi0+dW5pdCk7Ci19Ci0KLQotLyoKLSAqIGxjcF9maW5pc2hlZCAtIExDUCBoYXMgZmluaXNoZWQgd2l0aCB0aGUgbG93ZXIgbGF5ZXIuCi0gKi8KLXN0YXRpYyB2b2lkCi1sY3BfZmluaXNoZWQoZikKLSAgICBmc20gKmY7Ci17Ci0gICAgbGlua190ZXJtaW5hdGVkKGYtPnVuaXQpOwotfQotCi0KLS8qCi0gKiBsY3BfcHJpbnRwa3QgLSBwcmludCB0aGUgY29udGVudHMgb2YgYW4gTENQIHBhY2tldC4KLSAqLwotc3RhdGljIGNoYXIgKmxjcF9jb2RlbmFtZXNbXSA9IHsKLSAgICAiQ29uZlJlcSIsICJDb25mQWNrIiwgIkNvbmZOYWsiLCAiQ29uZlJlaiIsCi0gICAgIlRlcm1SZXEiLCAiVGVybUFjayIsICJDb2RlUmVqIiwgIlByb3RSZWoiLAotICAgICJFY2hvUmVxIiwgIkVjaG9SZXAiLCAiRGlzY1JlcSIsICJJZGVudCIsCi0gICAgIlRpbWVSZW0iCi19OwotCi1zdGF0aWMgaW50Ci1sY3BfcHJpbnRwa3QocCwgcGxlbiwgcHJpbnRlciwgYXJnKQotICAgIHVfY2hhciAqcDsKLSAgICBpbnQgcGxlbjsKLSAgICB2b2lkICgqcHJpbnRlcikgX19QKCh2b2lkICosIGNoYXIgKiwgLi4uKSk7Ci0gICAgdm9pZCAqYXJnOwotewotICAgIGludCBjb2RlLCBpZCwgbGVuLCBvbGVuLCBpOwotICAgIHVfY2hhciAqcHN0YXJ0LCAqb3B0ZW5kOwotICAgIHVfc2hvcnQgY2lzaG9ydDsKLSAgICB1X2ludDMyX3QgY2lsb25nOwotCi0gICAgaWYgKHBsZW4gPCBIRUFERVJMRU4pCi0JcmV0dXJuIDA7Ci0gICAgcHN0YXJ0ID0gcDsKLSAgICBHRVRDSEFSKGNvZGUsIHApOwotICAgIEdFVENIQVIoaWQsIHApOwotICAgIEdFVFNIT1JUKGxlbiwgcCk7Ci0gICAgaWYgKGxlbiA8IEhFQURFUkxFTiB8fCBsZW4gPiBwbGVuKQotCXJldHVybiAwOwotCi0gICAgaWYgKGNvZGUgPj0gMSAmJiBjb2RlIDw9IHNpemVvZihsY3BfY29kZW5hbWVzKSAvIHNpemVvZihjaGFyICopKQotCXByaW50ZXIoYXJnLCAiICVzIiwgbGNwX2NvZGVuYW1lc1tjb2RlLTFdKTsKLSAgICBlbHNlCi0JcHJpbnRlcihhcmcsICIgY29kZT0weCV4IiwgY29kZSk7Ci0gICAgcHJpbnRlcihhcmcsICIgaWQ9MHgleCIsIGlkKTsKLSAgICBsZW4gLT0gSEVBREVSTEVOOwotICAgIHN3aXRjaCAoY29kZSkgewotICAgIGNhc2UgQ09ORlJFUToKLSAgICBjYXNlIENPTkZBQ0s6Ci0gICAgY2FzZSBDT05GTkFLOgotICAgIGNhc2UgQ09ORlJFSjoKLQkvKiBwcmludCBvcHRpb24gbGlzdCAqLwotCXdoaWxlIChsZW4gPj0gMikgewotCSAgICBHRVRDSEFSKGNvZGUsIHApOwotCSAgICBHRVRDSEFSKG9sZW4sIHApOwotCSAgICBwIC09IDI7Ci0JICAgIGlmIChvbGVuIDwgMiB8fCBvbGVuID4gbGVuKSB7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIHByaW50ZXIoYXJnLCAiIDwiKTsKLQkgICAgbGVuIC09IG9sZW47Ci0JICAgIG9wdGVuZCA9IHAgKyBvbGVuOwotCSAgICBzd2l0Y2ggKGNvZGUpIHsKLQkgICAgY2FzZSBDSV9NUlU6Ci0JCWlmIChvbGVuID09IENJTEVOX1NIT1JUKSB7Ci0JCSAgICBwICs9IDI7Ci0JCSAgICBHRVRTSE9SVChjaXNob3J0LCBwKTsKLQkJICAgIHByaW50ZXIoYXJnLCAibXJ1ICVkIiwgY2lzaG9ydCk7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgQ0lfQVNZTkNNQVA6Ci0JCWlmIChvbGVuID09IENJTEVOX0xPTkcpIHsKLQkJICAgIHAgKz0gMjsKLQkJICAgIEdFVExPTkcoY2lsb25nLCBwKTsKLQkJICAgIHByaW50ZXIoYXJnLCAiYXN5bmNtYXAgMHgleCIsIGNpbG9uZyk7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgQ0lfQVVUSFRZUEU6Ci0JCWlmIChvbGVuID49IENJTEVOX1NIT1JUKSB7Ci0JCSAgICBwICs9IDI7Ci0JCSAgICBwcmludGVyKGFyZywgImF1dGggIik7Ci0JCSAgICBHRVRTSE9SVChjaXNob3J0LCBwKTsKLQkJICAgIHN3aXRjaCAoY2lzaG9ydCkgewotCQkgICAgY2FzZSBQUFBfUEFQOgotCQkJcHJpbnRlcihhcmcsICJwYXAiKTsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSBQUFBfQ0hBUDoKLQkJCXByaW50ZXIoYXJnLCAiY2hhcCIpOwotCQkJaWYgKHAgPCBvcHRlbmQpIHsKLQkJCSAgICBzd2l0Y2ggKCpwKSB7Ci0JCQkgICAgY2FzZSBDSEFQX01ENToKLQkJCQlwcmludGVyKGFyZywgIiBNRDUiKTsKLQkJCQkrK3A7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgY2FzZSBDSEFQX01JQ1JPU09GVDoKLQkJCQlwcmludGVyKGFyZywgIiBNUyIpOwotCQkJCSsrcDsKLQkJCQlicmVhazsKLQotCQkJICAgIGNhc2UgQ0hBUF9NSUNST1NPRlRfVjI6Ci0JCQkJcHJpbnRlcihhcmcsICIgTVMtdjIiKTsKLQkJCQkrK3A7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgfQotCQkJfQotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIFBQUF9FQVA6Ci0JCQlwcmludGVyKGFyZywgImVhcCIpOwotCQkJYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkJcHJpbnRlcihhcmcsICIweCV4IiwgY2lzaG9ydCk7Ci0JCSAgICB9Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgQ0lfUVVBTElUWToKLQkJaWYgKG9sZW4gPj0gQ0lMRU5fU0hPUlQpIHsKLQkJICAgIHAgKz0gMjsKLQkJICAgIHByaW50ZXIoYXJnLCAicXVhbGl0eSAiKTsKLQkJICAgIEdFVFNIT1JUKGNpc2hvcnQsIHApOwotCQkgICAgc3dpdGNoIChjaXNob3J0KSB7Ci0JCSAgICBjYXNlIFBQUF9MUVI6Ci0JCQlwcmludGVyKGFyZywgImxxciIpOwotCQkJYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkJcHJpbnRlcihhcmcsICIweCV4IiwgY2lzaG9ydCk7Ci0JCSAgICB9Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgQ0lfQ0FMTEJBQ0s6Ci0JCWlmIChvbGVuID49IENJTEVOX0NIQVIpIHsKLQkJICAgIHAgKz0gMjsKLQkJICAgIHByaW50ZXIoYXJnLCAiY2FsbGJhY2sgIik7Ci0JCSAgICBHRVRDSEFSKGNpc2hvcnQsIHApOwotCQkgICAgc3dpdGNoIChjaXNob3J0KSB7Ci0JCSAgICBjYXNlIENCQ1BfT1BUOgotCQkJcHJpbnRlcihhcmcsICJDQkNQIik7Ci0JCQlicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCQlwcmludGVyKGFyZywgIjB4JXgiLCBjaXNob3J0KTsKLQkJICAgIH0KLQkJfQotCQlicmVhazsKLQkgICAgY2FzZSBDSV9NQUdJQ05VTUJFUjoKLQkJaWYgKG9sZW4gPT0gQ0lMRU5fTE9ORykgewotCQkgICAgcCArPSAyOwotCQkgICAgR0VUTE9ORyhjaWxvbmcsIHApOwotCQkgICAgcHJpbnRlcihhcmcsICJtYWdpYyAweCV4IiwgY2lsb25nKTsKLQkJfQotCQlicmVhazsKLQkgICAgY2FzZSBDSV9QQ09NUFJFU1NJT046Ci0JCWlmIChvbGVuID09IENJTEVOX1ZPSUQpIHsKLQkJICAgIHAgKz0gMjsKLQkJICAgIHByaW50ZXIoYXJnLCAicGNvbXAiKTsKLQkJfQotCQlicmVhazsKLQkgICAgY2FzZSBDSV9BQ0NPTVBSRVNTSU9OOgotCQlpZiAob2xlbiA9PSBDSUxFTl9WT0lEKSB7Ci0JCSAgICBwICs9IDI7Ci0JCSAgICBwcmludGVyKGFyZywgImFjY29tcCIpOwotCQl9Ci0JCWJyZWFrOwotCSAgICBjYXNlIENJX01SUlU6Ci0JCWlmIChvbGVuID09IENJTEVOX1NIT1JUKSB7Ci0JCSAgICBwICs9IDI7Ci0JCSAgICBHRVRTSE9SVChjaXNob3J0LCBwKTsKLQkJICAgIHByaW50ZXIoYXJnLCAibXJydSAlZCIsIGNpc2hvcnQpOwotCQl9Ci0JCWJyZWFrOwotCSAgICBjYXNlIENJX1NTTkhGOgotCQlpZiAob2xlbiA9PSBDSUxFTl9WT0lEKSB7Ci0JCSAgICBwICs9IDI7Ci0JCSAgICBwcmludGVyKGFyZywgInNzbmhmIik7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgQ0lfRVBESVNDOgotI2lmZGVmIEhBVkVfTVVMVElMSU5LCi0JCWlmIChvbGVuID49IENJTEVOX0NIQVIpIHsKLQkJICAgIHN0cnVjdCBlcGRpc2MgZXBkOwotCQkgICAgcCArPSAyOwotCQkgICAgR0VUQ0hBUihlcGQuY2xhc3MsIHApOwotCQkgICAgZXBkLmxlbmd0aCA9IG9sZW4gLSBDSUxFTl9DSEFSOwotCQkgICAgaWYgKGVwZC5sZW5ndGggPiBNQVhfRU5EUF9MRU4pCi0JCQllcGQubGVuZ3RoID0gTUFYX0VORFBfTEVOOwotCQkgICAgaWYgKGVwZC5sZW5ndGggPiAwKSB7Ci0JCQlCQ09QWShwLCBlcGQudmFsdWUsIGVwZC5sZW5ndGgpOwotCQkJcCArPSBlcGQubGVuZ3RoOwotCQkgICAgfQotCQkgICAgcHJpbnRlcihhcmcsICJlbmRwb2ludCBbJXNdIiwgZXBkaXNjX3RvX3N0cigmZXBkKSk7Ci0JCX0KLSNlbHNlCi0JCXByaW50ZXIoYXJnLCAiZW5kcG9pbnQiKTsKLSNlbmRpZgotCQlicmVhazsKLQkgICAgfQotCSAgICB3aGlsZSAocCA8IG9wdGVuZCkgewotCQlHRVRDSEFSKGNvZGUsIHApOwotCQlwcmludGVyKGFyZywgIiAlLjJ4IiwgY29kZSk7Ci0JICAgIH0KLQkgICAgcHJpbnRlcihhcmcsICI+Iik7Ci0JfQotCWJyZWFrOwotCi0gICAgY2FzZSBURVJNQUNLOgotICAgIGNhc2UgVEVSTVJFUToKLQlpZiAobGVuID4gMCAmJiAqcCA+PSAnICcgJiYgKnAgPCAweDdmKSB7Ci0JICAgIHByaW50ZXIoYXJnLCAiICIpOwotCSAgICBwcmludF9zdHJpbmcoKGNoYXIgKilwLCBsZW4sIHByaW50ZXIsIGFyZyk7Ci0JICAgIHAgKz0gbGVuOwotCSAgICBsZW4gPSAwOwotCX0KLQlicmVhazsKLQotICAgIGNhc2UgRUNIT1JFUToKLSAgICBjYXNlIEVDSE9SRVA6Ci0gICAgY2FzZSBESVNDUkVROgotCWlmIChsZW4gPj0gNCkgewotCSAgICBHRVRMT05HKGNpbG9uZywgcCk7Ci0JICAgIHByaW50ZXIoYXJnLCAiIG1hZ2ljPTB4JXgiLCBjaWxvbmcpOwotCSAgICBsZW4gLT0gNDsKLQl9Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIElERU5USUY6Ci0gICAgY2FzZSBUSU1FUkVNOgotCWlmIChsZW4gPj0gNCkgewotCSAgICBHRVRMT05HKGNpbG9uZywgcCk7Ci0JICAgIHByaW50ZXIoYXJnLCAiIG1hZ2ljPTB4JXgiLCBjaWxvbmcpOwotCSAgICBsZW4gLT0gNDsKLQl9Ci0JaWYgKGNvZGUgPT0gVElNRVJFTSkgewotCSAgICBpZiAobGVuIDwgNCkKLQkJYnJlYWs7Ci0JICAgIEdFVExPTkcoY2lsb25nLCBwKTsKLQkgICAgcHJpbnRlcihhcmcsICIgc2Vjb25kcz0ldSIsIGNpbG9uZyk7Ci0JICAgIGxlbiAtPSA0OwotCX0KLQlpZiAobGVuID4gMCkgewotCSAgICBwcmludGVyKGFyZywgIiAiKTsKLQkgICAgcHJpbnRfc3RyaW5nKChjaGFyICopcCwgbGVuLCBwcmludGVyLCBhcmcpOwotCSAgICBwICs9IGxlbjsKLQkgICAgbGVuID0gMDsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotCi0gICAgLyogcHJpbnQgdGhlIHJlc3Qgb2YgdGhlIGJ5dGVzIGluIHRoZSBwYWNrZXQgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuICYmIGkgPCAzMjsgKytpKSB7Ci0JR0VUQ0hBUihjb2RlLCBwKTsKLQlwcmludGVyKGFyZywgIiAlLjJ4IiwgY29kZSk7Ci0gICAgfQotICAgIGlmIChpIDwgbGVuKSB7Ci0JcHJpbnRlcihhcmcsICIgLi4uIik7Ci0JcCArPSBsZW4gLSBpOwotICAgIH0KLQotICAgIHJldHVybiBwIC0gcHN0YXJ0OwotfQotCi0vKgotICogVGltZSB0byBzaHV0IGRvd24gdGhlIGxpbmsgYmVjYXVzZSB0aGVyZSBpcyBub3RoaW5nIG91dCB0aGVyZS4KLSAqLwotCi1zdGF0aWMKLXZvaWQgTGNwTGlua0ZhaWx1cmUgKGYpCi0gICAgZnNtICpmOwotewotICAgIGlmIChmLT5zdGF0ZSA9PSBPUEVORUQpIHsKLQlpbmZvKCJObyByZXNwb25zZSB0byAlZCBlY2hvLXJlcXVlc3RzIiwgbGNwX2VjaG9zX3BlbmRpbmcpOwotICAgICAgICBub3RpY2UoIlNlcmlhbCBsaW5rIGFwcGVhcnMgdG8gYmUgZGlzY29ubmVjdGVkLiIpOwotCXN0YXR1cyA9IEVYSVRfUEVFUl9ERUFEOwotCWxjcF9jbG9zZShmLT51bml0LCAiUGVlciBub3QgcmVzcG9uZGluZyIpOwotICAgIH0KLX0KLQotLyoKLSAqIFRpbWVyIGV4cGlyZWQgZm9yIHRoZSBMQ1AgZWNobyByZXF1ZXN0cyBmcm9tIHRoaXMgcHJvY2Vzcy4KLSAqLwotCi1zdGF0aWMgdm9pZAotTGNwRWNob0NoZWNrIChmKQotICAgIGZzbSAqZjsKLXsKLSAgICBMY3BTZW5kRWNob1JlcXVlc3QgKGYpOwotICAgIGlmIChmLT5zdGF0ZSAhPSBPUEVORUQpCi0JcmV0dXJuOwotCi0gICAgLyoKLSAgICAgKiBTdGFydCB0aGUgdGltZXIgZm9yIHRoZSBuZXh0IGludGVydmFsLgotICAgICAqLwotICAgIGlmIChsY3BfZWNob190aW1lcl9ydW5uaW5nKQotCXdhcm4oImFzc2VydGlvbiBsY3BfZWNob190aW1lcl9ydW5uaW5nPT0wIGZhaWxlZCIpOwotICAgIFRJTUVPVVQgKExjcEVjaG9UaW1lb3V0LCBmLCBsY3BfZWNob19pbnRlcnZhbCk7Ci0gICAgbGNwX2VjaG9fdGltZXJfcnVubmluZyA9IDE7Ci19Ci0KLS8qCi0gKiBMY3BFY2hvVGltZW91dCAtIFRpbWVyIGV4cGlyZWQgb24gdGhlIExDUCBlY2hvCi0gKi8KLQotc3RhdGljIHZvaWQKLUxjcEVjaG9UaW1lb3V0IChhcmcpCi0gICAgdm9pZCAqYXJnOwotewotICAgIGlmIChsY3BfZWNob190aW1lcl9ydW5uaW5nICE9IDApIHsKLSAgICAgICAgbGNwX2VjaG9fdGltZXJfcnVubmluZyA9IDA7Ci0gICAgICAgIExjcEVjaG9DaGVjayAoKGZzbSAqKSBhcmcpOwotICAgIH0KLX0KLQotLyoKLSAqIExjcEVjaG9SZXBseSAtIExDUCBoYXMgcmVjZWl2ZWQgYSByZXBseSB0byB0aGUgZWNobwotICovCi0KLXN0YXRpYyB2b2lkCi1sY3BfcmVjZWl2ZWRfZWNob19yZXBseSAoZiwgaWQsIGlucCwgbGVuKQotICAgIGZzbSAqZjsKLSAgICBpbnQgaWQ7Ci0gICAgdV9jaGFyICppbnA7Ci0gICAgaW50IGxlbjsKLXsKLSAgICB1X2ludDMyX3QgbWFnaWM7Ci0KLSAgICAvKiBDaGVjayB0aGUgbWFnaWMgbnVtYmVyIC0gZG9uJ3QgY291bnQgcmVwbGllcyBmcm9tIG91cnNlbHZlcy4gKi8KLSAgICBpZiAobGVuIDwgNCkgewotCWRiZ2xvZygibGNwOiByZWNlaXZlZCBzaG9ydCBFY2hvLVJlcGx5LCBsZW5ndGggJWQiLCBsZW4pOwotCXJldHVybjsKLSAgICB9Ci0gICAgR0VUTE9ORyhtYWdpYywgaW5wKTsKLSAgICBpZiAobGNwX2dvdG9wdGlvbnNbZi0+dW5pdF0ubmVnX21hZ2ljbnVtYmVyCi0JJiYgbWFnaWMgPT0gbGNwX2dvdG9wdGlvbnNbZi0+dW5pdF0ubWFnaWNudW1iZXIpIHsKLQl3YXJuKCJhcHBlYXIgdG8gaGF2ZSByZWNlaXZlZCBvdXIgb3duIGVjaG8tcmVwbHkhIik7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIC8qIFJlc2V0IHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgZWNobyBmcmFtZXMgKi8KLSAgICBsY3BfZWNob3NfcGVuZGluZyA9IDA7Ci19Ci0KLS8qCi0gKiBMY3BTZW5kRWNob1JlcXVlc3QgLSBTZW5kIGFuIGVjaG8gcmVxdWVzdCBmcmFtZSB0byB0aGUgcGVlcgotICovCi0KLXN0YXRpYyB2b2lkCi1MY3BTZW5kRWNob1JlcXVlc3QgKGYpCi0gICAgZnNtICpmOwotewotICAgIHVfaW50MzJfdCBsY3BfbWFnaWM7Ci0gICAgdV9jaGFyIHBrdFs0XSwgKnBrdHA7Ci0KLSAgICAvKgotICAgICAqIERldGVjdCB0aGUgZmFpbHVyZSBvZiB0aGUgcGVlciBhdCB0aGlzIHBvaW50LgotICAgICAqLwotICAgIGlmIChsY3BfZWNob19mYWlscyAhPSAwKSB7Ci0gICAgICAgIGlmIChsY3BfZWNob3NfcGVuZGluZyA+PSBsY3BfZWNob19mYWlscykgewotICAgICAgICAgICAgTGNwTGlua0ZhaWx1cmUoZik7Ci0JICAgIGxjcF9lY2hvc19wZW5kaW5nID0gMDsKLQl9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBNYWtlIGFuZCBzZW5kIHRoZSBlY2hvIHJlcXVlc3QgZnJhbWUuCi0gICAgICovCi0gICAgaWYgKGYtPnN0YXRlID09IE9QRU5FRCkgewotICAgICAgICBsY3BfbWFnaWMgPSBsY3BfZ290b3B0aW9uc1tmLT51bml0XS5tYWdpY251bWJlcjsKLQlwa3RwID0gcGt0OwotCVBVVExPTkcobGNwX21hZ2ljLCBwa3RwKTsKLSAgICAgICAgZnNtX3NkYXRhKGYsIEVDSE9SRVEsIGxjcF9lY2hvX251bWJlcisrICYgMHhGRiwgcGt0LCBwa3RwIC0gcGt0KTsKLQkrK2xjcF9lY2hvc19wZW5kaW5nOwotICAgIH0KLX0KLQotLyoKLSAqIGxjcF9lY2hvX2xvd2VydXAgLSBTdGFydCB0aGUgdGltZXIgZm9yIHRoZSBMQ1AgZnJhbWUKLSAqLwotCi1zdGF0aWMgdm9pZAotbGNwX2VjaG9fbG93ZXJ1cCAodW5pdCkKLSAgICBpbnQgdW5pdDsKLXsKLSAgICBmc20gKmYgPSAmbGNwX2ZzbVt1bml0XTsKLQotICAgIC8qIENsZWFyIHRoZSBwYXJhbWV0ZXJzIGZvciBnZW5lcmF0aW5nIGVjaG8gZnJhbWVzICovCi0gICAgbGNwX2VjaG9zX3BlbmRpbmcgICAgICA9IDA7Ci0gICAgbGNwX2VjaG9fbnVtYmVyICAgICAgICA9IDA7Ci0gICAgbGNwX2VjaG9fdGltZXJfcnVubmluZyA9IDA7Ci0gIAotICAgIC8qIElmIGEgdGltZW91dCBpbnRlcnZhbCBpcyBzcGVjaWZpZWQgdGhlbiBzdGFydCB0aGUgdGltZXIgKi8KLSAgICBpZiAobGNwX2VjaG9faW50ZXJ2YWwgIT0gMCkKLSAgICAgICAgTGNwRWNob0NoZWNrIChmKTsKLX0KLQotLyoKLSAqIGxjcF9lY2hvX2xvd2VyZG93biAtIFN0b3AgdGhlIHRpbWVyIGZvciB0aGUgTENQIGZyYW1lCi0gKi8KLQotc3RhdGljIHZvaWQKLWxjcF9lY2hvX2xvd2VyZG93biAodW5pdCkKLSAgICBpbnQgdW5pdDsKLXsKLSAgICBmc20gKmYgPSAmbGNwX2ZzbVt1bml0XTsKLQotICAgIGlmIChsY3BfZWNob190aW1lcl9ydW5uaW5nICE9IDApIHsKLSAgICAgICAgVU5USU1FT1VUIChMY3BFY2hvVGltZW91dCwgZik7Ci0gICAgICAgIGxjcF9lY2hvX3RpbWVyX3J1bm5pbmcgPSAwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BwcGQvbGNwLmggYi9wcHBkL2xjcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWY4YWVlLi4wMDAwMDAwCi0tLSBhL3BwcGQvbGNwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIGxjcC5oIC0gTGluayBDb250cm9sIFByb3RvY29sIGRlZmluaXRpb25zLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk4NC0yMDAwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBuYW1lICJDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHBlcm1pc3Npb24gb3IgYW55IGxlZ2FsCi0gKiAgICBkZXRhaWxzLCBwbGVhc2UgY29udGFjdAotICogICAgICBPZmZpY2Ugb2YgVGVjaG5vbG9neSBUcmFuc2ZlcgotICogICAgICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQotICogICAgICA1MDAwIEZvcmJlcyBBdmVudWUKLSAqICAgICAgUGl0dHNidXJnaCwgUEEgIDE1MjEzLTM4OTAKLSAqICAgICAgKDQxMikgMjY4LTQzODcsIGZheDogKDQxMikgMjY4LTczOTUKLSAqICAgICAgdGVjaC10cmFuc2ZlckBhbmRyZXcuY211LmVkdQotICoKLSAqIDQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQ29tcHV0aW5nIFNlcnZpY2VzCi0gKiAgICAgYXQgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkgKGh0dHA6Ly93d3cuY211LmVkdS9jb21wdXRpbmcvKS4iCi0gKgotICogQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi0gKiBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLSAqIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLSAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLSAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICoKLSAqICRJZDogbGNwLmgsdiAxLjIwIDIwMDQvMTEvMTQgMjI6NTM6NDIgY2FybHNvbmogRXhwICQKLSAqLwotCi0vKgotICogT3B0aW9ucy4KLSAqLwotI2RlZmluZSBDSV9WRU5ET1IJMAkvKiBWZW5kb3IgU3BlY2lmaWMgKi8KLSNkZWZpbmUgQ0lfTVJVCQkxCS8qIE1heGltdW0gUmVjZWl2ZSBVbml0ICovCi0jZGVmaW5lIENJX0FTWU5DTUFQCTIJLyogQXN5bmMgQ29udHJvbCBDaGFyYWN0ZXIgTWFwICovCi0jZGVmaW5lIENJX0FVVEhUWVBFCTMJLyogQXV0aGVudGljYXRpb24gVHlwZSAqLwotI2RlZmluZSBDSV9RVUFMSVRZCTQJLyogUXVhbGl0eSBQcm90b2NvbCAqLwotI2RlZmluZSBDSV9NQUdJQ05VTUJFUgk1CS8qIE1hZ2ljIE51bWJlciAqLwotI2RlZmluZSBDSV9QQ09NUFJFU1NJT04JNwkvKiBQcm90b2NvbCBGaWVsZCBDb21wcmVzc2lvbiAqLwotI2RlZmluZSBDSV9BQ0NPTVBSRVNTSU9OIDgJLyogQWRkcmVzcy9Db250cm9sIEZpZWxkIENvbXByZXNzaW9uICovCi0jZGVmaW5lIENJX0ZDU0FMVEVSTgk5CS8qIEZDUy1BbHRlcm5hdGl2ZXMgKi8KLSNkZWZpbmUgQ0lfU0RQCQkxMAkvKiBTZWxmLURlc2NyaWJpbmctUGFkICovCi0jZGVmaW5lIENJX05VTUJFUkVECTExCS8qIE51bWJlcmVkLU1vZGUgKi8KLSNkZWZpbmUgQ0lfQ0FMTEJBQ0sJMTMJLyogY2FsbGJhY2sgKi8KLSNkZWZpbmUgQ0lfTVJSVQkJMTcJLyogbWF4IHJlY29uc3RydWN0ZWQgcmVjZWl2ZSB1bml0OyBtdWx0aWxpbmsgKi8KLSNkZWZpbmUgQ0lfU1NOSEYJMTgJLyogc2hvcnQgc2VxdWVuY2UgbnVtYmVycyBmb3IgbXVsdGlsaW5rICovCi0jZGVmaW5lIENJX0VQRElTQwkxOQkvKiBlbmRwb2ludCBkaXNjcmltaW5hdG9yICovCi0jZGVmaW5lIENJX01QUExVUwkyMgkvKiBNdWx0aS1MaW5rLVBsdXMtUHJvY2VkdXJlICovCi0jZGVmaW5lIENJX0xESVNDCTIzCS8qIExpbmstRGlzY3JpbWluYXRvciAqLwotI2RlZmluZSBDSV9MQ1BBVVRICTI0CS8qIExDUCBBdXRoZW50aWNhdGlvbiAqLwotI2RlZmluZSBDSV9DT0JTCQkyNQkvKiBDb25zaXN0ZW50IE92ZXJoZWFkIEJ5dGUgU3R1ZmZpbmcgKi8KLSNkZWZpbmUgQ0lfUFJFRkVMSVMJMjYJLyogUHJlZml4IEVsaXNpb24gKi8KLSNkZWZpbmUgQ0lfTVBIRFJGTVQJMjcJLyogTVAgSGVhZGVyIEZvcm1hdCAqLwotI2RlZmluZSBDSV9JMThOCQkyOAkvKiBJbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotI2RlZmluZSBDSV9TREwJCTI5CS8qIFNpbXBsZSBEYXRhIExpbmsgKi8KLQotLyoKLSAqIExDUC1zcGVjaWZpYyBwYWNrZXQgdHlwZXMgKGNvZGUgbnVtYmVycykuCi0gKi8KLSNkZWZpbmUgUFJPVFJFSgkJOAkvKiBQcm90b2NvbCBSZWplY3QgKi8KLSNkZWZpbmUgRUNIT1JFUQkJOQkvKiBFY2hvIFJlcXVlc3QgKi8KLSNkZWZpbmUgRUNIT1JFUAkJMTAJLyogRWNobyBSZXBseSAqLwotI2RlZmluZSBESVNDUkVRCQkxMQkvKiBEaXNjYXJkIFJlcXVlc3QgKi8KLSNkZWZpbmUgSURFTlRJRgkJMTIJLyogSWRlbnRpZmljYXRpb24gKi8KLSNkZWZpbmUgVElNRVJFTQkJMTMJLyogVGltZSBSZW1haW5pbmcgKi8KLQotLyogVmFsdWUgdXNlZCBhcyBkYXRhIGZvciBDSV9DQUxMQkFDSyBvcHRpb24gKi8KLSNkZWZpbmUgQ0JDUF9PUFQJNgkvKiBVc2UgY2FsbGJhY2sgY29udHJvbCBwcm90b2NvbCAqLwotCi0vKgotICogVGhlIHN0YXRlIG9mIG9wdGlvbnMgaXMgZGVzY3JpYmVkIGJ5IGFuIGxjcF9vcHRpb25zIHN0cnVjdHVyZS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgbGNwX29wdGlvbnMgewotICAgIGJvb2wgcGFzc2l2ZTsJCS8qIERvbid0IGRpZSBpZiB3ZSBkb24ndCBnZXQgYSByZXNwb25zZSAqLwotICAgIGJvb2wgc2lsZW50OwkJLyogV2FpdCBmb3IgdGhlIG90aGVyIGVuZCB0byBzdGFydCBmaXJzdCAqLwotICAgIGJvb2wgcmVzdGFydDsJCS8qIFJlc3RhcnQgdnMuIGV4aXQgYWZ0ZXIgY2xvc2UgKi8KLSAgICBib29sIG5lZ19tcnU7CQkvKiBOZWdvdGlhdGUgdGhlIE1SVT8gKi8KLSAgICBib29sIG5lZ19hc3luY21hcDsJCS8qIE5lZ290aWF0ZSB0aGUgYXN5bmMgbWFwPyAqLwotICAgIGJvb2wgbmVnX3VwYXA7CQkvKiBBc2sgZm9yIFVQQVAgYXV0aGVudGljYXRpb24/ICovCi0gICAgYm9vbCBuZWdfY2hhcDsJCS8qIEFzayBmb3IgQ0hBUCBhdXRoZW50aWNhdGlvbj8gKi8KLSAgICBib29sIG5lZ19lYXA7CQkvKiBBc2sgZm9yIEVBUCBhdXRoZW50aWNhdGlvbj8gKi8KLSAgICBib29sIG5lZ19tYWdpY251bWJlcjsJLyogQXNrIGZvciBtYWdpYyBudW1iZXI/ICovCi0gICAgYm9vbCBuZWdfcGNvbXByZXNzaW9uOwkvKiBIRExDIFByb3RvY29sIEZpZWxkIENvbXByZXNzaW9uPyAqLwotICAgIGJvb2wgbmVnX2FjY29tcHJlc3Npb247CS8qIEhETEMgQWRkcmVzcy9Db250cm9sIEZpZWxkIENvbXByZXNzaW9uPyAqLwotICAgIGJvb2wgbmVnX2xxcjsJCS8qIE5lZ290aWF0ZSB1c2Ugb2YgTGluayBRdWFsaXR5IFJlcG9ydHMgKi8KLSAgICBib29sIG5lZ19jYmNwOwkJLyogTmVnb3RpYXRlIHVzZSBvZiBDQkNQICovCi0gICAgYm9vbCBuZWdfbXJydTsJCS8qIG5lZ290aWF0ZSBtdWx0aWxpbmsgTVJSVSAqLwotICAgIGJvb2wgbmVnX3NzbmhmOwkJLyogbmVnb3RpYXRlIHNob3J0IHNlcXVlbmNlIG51bWJlcnMgKi8KLSAgICBib29sIG5lZ19lbmRwb2ludDsJCS8qIG5lZ290aWF0ZSBlbmRwb2ludCBkaXNjcmltaW5hdG9yICovCi0gICAgaW50ICBtcnU7CQkJLyogVmFsdWUgb2YgTVJVICovCi0gICAgaW50CSBtcnJ1OwkJCS8qIFZhbHVlIG9mIE1SUlUsIGFuZCBtdWx0aWxpbmsgZW5hYmxlICovCi0gICAgdV9jaGFyIGNoYXBfbWR0eXBlOwkJLyogd2hpY2ggTUQgdHlwZXMgKGhhc2hpbmcgYWxnb3JpdGhtKSAqLwotICAgIHVfaW50MzJfdCBhc3luY21hcDsJCS8qIFZhbHVlIG9mIGFzeW5jIG1hcCAqLwotICAgIHVfaW50MzJfdCBtYWdpY251bWJlcjsKLSAgICBpbnQgIG51bWxvb3BzOwkJLyogTnVtYmVyIG9mIGxvb3BzIGR1cmluZyBtYWdpYyBudW1iZXIgbmVnLiAqLwotICAgIHVfaW50MzJfdCBscXJfcGVyaW9kOwkvKiBSZXBvcnRpbmcgcGVyaW9kIGZvciBMUVIgMS8xMDB0aHMgc2Vjb25kICovCi0gICAgc3RydWN0IGVwZGlzYyBlbmRwb2ludDsJLyogZW5kcG9pbnQgZGlzY3JpbWluYXRvciAqLwotfSBsY3Bfb3B0aW9uczsKLQotZXh0ZXJuIGZzbSBsY3BfZnNtW107Ci1leHRlcm4gbGNwX29wdGlvbnMgbGNwX3dhbnRvcHRpb25zW107Ci1leHRlcm4gbGNwX29wdGlvbnMgbGNwX2dvdG9wdGlvbnNbXTsKLWV4dGVybiBsY3Bfb3B0aW9ucyBsY3BfYWxsb3dvcHRpb25zW107Ci1leHRlcm4gbGNwX29wdGlvbnMgbGNwX2hpc29wdGlvbnNbXTsKLQotI2RlZmluZSBERUZNUlUJMTUwMAkJLyogVHJ5IGZvciB0aGlzICovCi0jZGVmaW5lIE1JTk1SVQkxMjgJCS8qIE5vIE1SVXMgYmVsb3cgdGhpcyAqLwotI2RlZmluZSBNQVhNUlUJMTYzODQJCS8qIE5vcm1hbGx5IGxpbWl0IE1SVSB0byB0aGlzICovCi0KLXZvaWQgbGNwX29wZW4gX19QKChpbnQpKTsKLXZvaWQgbGNwX2Nsb3NlIF9fUCgoaW50LCBjaGFyICopKTsKLXZvaWQgbGNwX2xvd2VydXAgX19QKChpbnQpKTsKLXZvaWQgbGNwX2xvd2VyZG93biBfX1AoKGludCkpOwotdm9pZCBsY3Bfc3Byb3RyZWogX19QKChpbnQsIHVfY2hhciAqLCBpbnQpKTsJLyogc2VuZCBwcm90b2NvbCByZWplY3QgKi8KLQotZXh0ZXJuIHN0cnVjdCBwcm90ZW50IGxjcF9wcm90ZW50OwotCi0vKiBEZWZhdWx0IG51bWJlciBvZiB0aW1lcyB3ZSByZWNlaXZlIG91ciBtYWdpYyBudW1iZXIgZnJvbSB0aGUgcGVlcgotICAgYmVmb3JlIGRlY2lkaW5nIHRoZSBsaW5rIGlzIGxvb3BlZC1iYWNrLiAqLwotI2RlZmluZSBERUZMT09QQkFDS0ZBSUwJMTAKZGlmZiAtLWdpdCBhL3BwcGQvbWFnaWMuYyBiL3BwcGQvbWFnaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZiMjNmZi4uMDAwMDAwMAotLS0gYS9wcHBkL21hZ2ljLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIG1hZ2ljLmMgLSBQUFAgTWFnaWMgTnVtYmVyIHJvdXRpbmVzLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk4NC0yMDAwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBuYW1lICJDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHBlcm1pc3Npb24gb3IgYW55IGxlZ2FsCi0gKiAgICBkZXRhaWxzLCBwbGVhc2UgY29udGFjdAotICogICAgICBPZmZpY2Ugb2YgVGVjaG5vbG9neSBUcmFuc2ZlcgotICogICAgICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQotICogICAgICA1MDAwIEZvcmJlcyBBdmVudWUKLSAqICAgICAgUGl0dHNidXJnaCwgUEEgIDE1MjEzLTM4OTAKLSAqICAgICAgKDQxMikgMjY4LTQzODcsIGZheDogKDQxMikgMjY4LTczOTUKLSAqICAgICAgdGVjaC10cmFuc2ZlckBhbmRyZXcuY211LmVkdQotICoKLSAqIDQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQ29tcHV0aW5nIFNlcnZpY2VzCi0gKiAgICAgYXQgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkgKGh0dHA6Ly93d3cuY211LmVkdS9jb21wdXRpbmcvKS4iCi0gKgotICogQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi0gKiBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLSAqIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLSAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLSAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNkZWZpbmUgUkNTSUQJIiRJZDogbWFnaWMuYyx2IDEuMTEgMjAwMy8wNi8xMSAyMzo1NjoyNiBwYXVsdXMgRXhwICQiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KLSNpbmNsdWRlICJwcHBkLmgiCi0jaW5jbHVkZSAibWFnaWMuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSA9IFJDU0lEOwotCi1leHRlcm4gbG9uZyBtcmFuZDQ4IF9fUCgodm9pZCkpOwotZXh0ZXJuIHZvaWQgc3JhbmQ0OCBfX1AoKGxvbmcpKTsKLQotLyoKLSAqIG1hZ2ljX2luaXQgLSBJbml0aWFsaXplIHRoZSBtYWdpYyBudW1iZXIgZ2VuZXJhdG9yLgotICoKLSAqIEF0dGVtcHRzIHRvIGNvbXB1dGUgYSByYW5kb20gbnVtYmVyIHNlZWQgd2hpY2ggd2lsbCBub3QgcmVwZWF0LgotICogVGhlIGN1cnJlbnQgbWV0aG9kIHVzZXMgdGhlIGN1cnJlbnQgaG9zdGlkLCBjdXJyZW50IHByb2Nlc3MgSUQKLSAqIGFuZCBjdXJyZW50IHRpbWUsIGN1cnJlbnRseS4KLSAqLwotdm9pZAotbWFnaWNfaW5pdCgpCi17Ci0gICAgbG9uZyBzZWVkOwotICAgIHN0cnVjdCB0aW1ldmFsIHQ7Ci0KLSAgICBnZXR0aW1lb2ZkYXkoJnQsIE5VTEwpOwotICAgIHNlZWQgPSBnZXRfaG9zdF9zZWVkKCkgXiB0LnR2X3NlYyBeIHQudHZfdXNlYyBeIGdldHBpZCgpOwotICAgIHNyYW5kNDgoc2VlZCk7Ci19Ci0KLS8qCi0gKiBtYWdpYyAtIFJldHVybnMgdGhlIG5leHQgbWFnaWMgbnVtYmVyLgotICovCi11X2ludDMyX3QKLW1hZ2ljKCkKLXsKLSAgICByZXR1cm4gKHVfaW50MzJfdCkgbXJhbmQ0OCgpOwotfQotCi0vKgotICogcmFuZG9tX2J5dGVzIC0gRmlsbCBhIGJ1ZmZlciB3aXRoIHJhbmRvbSBieXRlcy4KLSAqLwotdm9pZAotcmFuZG9tX2J5dGVzKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKLQkJYnVmW2ldID0gbXJhbmQ0OCgpID4+IDI0OwotfQotCi0jaWZkZWYgTk9fRFJBTkQ0OAotLyoKLSAqIFN1YnN0aXR1dGUgcHJvY2VkdXJlcyBmb3IgdGhvc2Ugc3lzdGVtcyB3aGljaCBkb24ndCBoYXZlCi0gKiBkcmFuZDQ4IGV0IGFsLgotICovCi0KLWRvdWJsZQotZHJhbmQ0OCgpCi17Ci0gICAgcmV0dXJuIChkb3VibGUpcmFuZG9tKCkgLyAoZG91YmxlKTB4N2ZmZmZmZmZMOyAvKiAyKiozMS0xICovCi19Ci0KLWxvbmcKLW1yYW5kNDgoKQotewotICAgIHJldHVybiByYW5kb20oKTsKLX0KLQotdm9pZAotc3JhbmQ0OChzZWVkdmFsKQotbG9uZyBzZWVkdmFsOwotewotICAgIHNyYW5kb20oKGludClzZWVkdmFsKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9wcHBkL21hZ2ljLmggYi9wcHBkL21hZ2ljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MTIxM2IuLjAwMDAwMDAKLS0tIGEvcHBwZC9tYWdpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIG1hZ2ljLmggLSBQUFAgTWFnaWMgTnVtYmVyIGRlZmluaXRpb25zLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk4NC0yMDAwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBuYW1lICJDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHBlcm1pc3Npb24gb3IgYW55IGxlZ2FsCi0gKiAgICBkZXRhaWxzLCBwbGVhc2UgY29udGFjdAotICogICAgICBPZmZpY2Ugb2YgVGVjaG5vbG9neSBUcmFuc2ZlcgotICogICAgICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQotICogICAgICA1MDAwIEZvcmJlcyBBdmVudWUKLSAqICAgICAgUGl0dHNidXJnaCwgUEEgIDE1MjEzLTM4OTAKLSAqICAgICAgKDQxMikgMjY4LTQzODcsIGZheDogKDQxMikgMjY4LTczOTUKLSAqICAgICAgdGVjaC10cmFuc2ZlckBhbmRyZXcuY211LmVkdQotICoKLSAqIDQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQ29tcHV0aW5nIFNlcnZpY2VzCi0gKiAgICAgYXQgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkgKGh0dHA6Ly93d3cuY211LmVkdS9jb21wdXRpbmcvKS4iCi0gKgotICogQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi0gKiBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLSAqIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLSAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLSAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICoKLSAqICRJZDogbWFnaWMuaCx2IDEuNSAyMDAzLzA2LzExIDIzOjU2OjI2IHBhdWx1cyBFeHAgJAotICovCi0KLXZvaWQgbWFnaWNfaW5pdCBfX1AoKHZvaWQpKTsJLyogSW5pdGlhbGl6ZSB0aGUgbWFnaWMgbnVtYmVyIGdlbmVyYXRvciAqLwotdV9pbnQzMl90IG1hZ2ljIF9fUCgodm9pZCkpOwkvKiBSZXR1cm5zIHRoZSBuZXh0IG1hZ2ljIG51bWJlciAqLwotCi0vKiBGaWxsIGJ1ZmZlciB3aXRoIHJhbmRvbSBieXRlcyAqLwotdm9pZCByYW5kb21fYnl0ZXMgX19QKCh1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pKTsKZGlmZiAtLWdpdCBhL3BwcGQvbWFpbi5jIGIvcHBwZC9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNGUzNmMuLjAwMDAwMDAKLS0tIGEvcHBwZC9tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjY4ICswLDAgQEAKLS8qCi0gKiBtYWluLmMgLSBQb2ludC10by1Qb2ludCBQcm90b2NvbCBtYWluIG1vZHVsZQotICoKLSAqIENvcHlyaWdodCAoYykgMTk4NC0yMDAwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBuYW1lICJDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHBlcm1pc3Npb24gb3IgYW55IGxlZ2FsCi0gKiAgICBkZXRhaWxzLCBwbGVhc2UgY29udGFjdAotICogICAgICBPZmZpY2Ugb2YgVGVjaG5vbG9neSBUcmFuc2ZlcgotICogICAgICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQotICogICAgICA1MDAwIEZvcmJlcyBBdmVudWUKLSAqICAgICAgUGl0dHNidXJnaCwgUEEgIDE1MjEzLTM4OTAKLSAqICAgICAgKDQxMikgMjY4LTQzODcsIGZheDogKDQxMikgMjY4LTczOTUKLSAqICAgICAgdGVjaC10cmFuc2ZlckBhbmRyZXcuY211LmVkdQotICoKLSAqIDQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQ29tcHV0aW5nIFNlcnZpY2VzCi0gKiAgICAgYXQgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkgKGh0dHA6Ly93d3cuY211LmVkdS9jb21wdXRpbmcvKS4iCi0gKgotICogQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi0gKiBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLSAqIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLSAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLSAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA0IFBhdWwgTWFja2VycmFzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIDMuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgUGF1bCBNYWNrZXJyYXMKLSAqICAgICA8cGF1bHVzQHNhbWJhLm9yZz4iLgotICoKLSAqIFRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLSAqIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotICogQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2RlZmluZSBSQ1NJRAkiJElkOiBtYWluLmMsdiAxLjE1NiAyMDA4LzA2LzIzIDExOjQ3OjE4IHBhdWx1cyBFeHAgJCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzbG9nLmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLSNpbmNsdWRlIDx1dG1wLmg+Ci0jaW5jbHVkZSA8cHdkLmg+Ci0jaW5jbHVkZSA8c2V0am1wLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLQotI2luY2x1ZGUgInBwcGQuaCIKLSNpbmNsdWRlICJtYWdpYy5oIgotI2luY2x1ZGUgImZzbS5oIgotI2luY2x1ZGUgImxjcC5oIgotI2luY2x1ZGUgImlwY3AuaCIKLSNpZmRlZiBJTkVUNgotI2luY2x1ZGUgImlwdjZjcC5oIgotI2VuZGlmCi0jaW5jbHVkZSAidXBhcC5oIgotI2luY2x1ZGUgImNoYXAtbmV3LmgiCi0jaW5jbHVkZSAiZWFwLmgiCi0jaW5jbHVkZSAiY2NwLmgiCi0jaW5jbHVkZSAiZWNwLmgiCi0jaW5jbHVkZSAicGF0aG5hbWVzLmgiCi0KLSNpZmRlZiBVU0VfVERCCi0jaW5jbHVkZSAidGRiLmgiCi0jZW5kaWYKLQotI2lmZGVmIENCQ1BfU1VQUE9SVAotI2luY2x1ZGUgImNiY3AuaCIKLSNlbmRpZgotCi0jaWZkZWYgSVBYX0NIQU5HRQotI2luY2x1ZGUgImlweGNwLmgiCi0jZW5kaWYgLyogSVBYX0NIQU5HRSAqLwotI2lmZGVmIEFUX0NIQU5HRQotI2luY2x1ZGUgImF0Y3AuaCIKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdID0gUkNTSUQ7Ci0KLS8qIGludGVyZmFjZSB2YXJzICovCi1jaGFyIGlmbmFtZVszMl07CQkvKiBJbnRlcmZhY2UgbmFtZSAqLwotaW50IGlmdW5pdDsJCQkvKiBJbnRlcmZhY2UgdW5pdCBudW1iZXIgKi8KLQotc3RydWN0IGNoYW5uZWwgKnRoZV9jaGFubmVsOwotCi1jaGFyICpwcm9nbmFtZTsJCQkvKiBOYW1lIG9mIHRoaXMgcHJvZ3JhbSAqLwotY2hhciBob3N0bmFtZVtNQVhOQU1FTEVOXTsJLyogT3VyIGhvc3RuYW1lICovCi1zdGF0aWMgY2hhciBwaWRmaWxlbmFtZVtNQVhQQVRITEVOXTsJLyogbmFtZSBvZiBwaWQgZmlsZSAqLwotc3RhdGljIGNoYXIgbGlua3BpZGZpbGVbTUFYUEFUSExFTl07CS8qIG5hbWUgb2YgbGlua25hbWUgcGlkIGZpbGUgKi8KLWNoYXIgcHBwX2Rldm5hbVtNQVhQQVRITEVOXTsJLyogbmFtZSBvZiBQUFAgdHR5IChtYXliZSB0dHlweCkgKi8KLXVpZF90IHVpZDsJCQkvKiBPdXIgcmVhbCB1c2VyLWlkICovCi1zdHJ1Y3Qgbm90aWZpZXIgKnBpZGNoYW5nZSA9IE5VTEw7Ci1zdHJ1Y3Qgbm90aWZpZXIgKnBoYXNlY2hhbmdlID0gTlVMTDsKLXN0cnVjdCBub3RpZmllciAqZXhpdG5vdGlmeSA9IE5VTEw7Ci1zdHJ1Y3Qgbm90aWZpZXIgKnNpZ3JlY2VpdmVkID0gTlVMTDsKLXN0cnVjdCBub3RpZmllciAqZm9ya19ub3RpZmllciA9IE5VTEw7Ci0KLWludCBodW5ndXA7CQkJLyogdGVybWluYWwgaGFzIGJlZW4gaHVuZyB1cCAqLwotaW50IHByaXZpbGVnZWQ7CQkJLyogd2UncmUgcnVubmluZyBhcyByZWFsIHVpZCByb290ICovCi1pbnQgbmVlZF9ob2xkb2ZmOwkJLyogbmVlZCBob2xkb2ZmIHBlcmlvZCBiZWZvcmUgcmVzdGFydGluZyAqLwotaW50IGRldGFjaGVkOwkJCS8qIGhhdmUgZGV0YWNoZWQgZnJvbSB0ZXJtaW5hbCAqLwotdm9sYXRpbGUgaW50IHN0YXR1czsJCS8qIGV4aXQgc3RhdHVzIGZvciBwcHBkICovCi1pbnQgdW5zdWNjZXNzOwkJCS8qICMgdW5zdWNjZXNzZnVsIGNvbm5lY3Rpb24gYXR0ZW1wdHMgKi8KLWludCBkb19jYWxsYmFjazsJCS8qICE9IDAgaWYgd2Ugc2hvdWxkIGRvIGNhbGxiYWNrIG5leHQgKi8KLWludCBkb2luZ19jYWxsYmFjazsJCS8qICE9IDAgaWYgd2UgYXJlIGRvaW5nIGNhbGxiYWNrICovCi1pbnQgcHBwX3Nlc3Npb25fbnVtYmVyOwkJLyogU2Vzc2lvbiBudW1iZXIsIGZvciBjaGFubmVscyB3aXRoIHN1Y2ggYQotCQkJCSAgIGNvbmNlcHQgKGVnIFBQUG9FKSAqLwotaW50IGNoaWxkd2FpdF9kb25lOwkJLyogaGF2ZSB0aW1lZCBvdXQgd2FpdGluZyBmb3IgY2hpbGRyZW4gKi8KLQotI2lmZGVmIFVTRV9UREIKLVREQl9DT05URVhUICpwcHBkYjsJCS8qIGRhdGFiYXNlIGZvciBzdG9yaW5nIHN0YXR1cyBldGMuICovCi0jZW5kaWYKLQotY2hhciBkYl9rZXlbMzJdOwotCi1pbnQgKCpob2xkb2ZmX2hvb2spIF9fUCgodm9pZCkpID0gTlVMTDsKLWludCAoKm5ld19waGFzZV9ob29rKSBfX1AoKGludCkpID0gTlVMTDsKLXZvaWQgKCpzbm9vcF9yZWN2X2hvb2spIF9fUCgodW5zaWduZWQgY2hhciAqcCwgaW50IGxlbikpID0gTlVMTDsKLXZvaWQgKCpzbm9vcF9zZW5kX2hvb2spIF9fUCgodW5zaWduZWQgY2hhciAqcCwgaW50IGxlbikpID0gTlVMTDsKLQotc3RhdGljIGludCBjb25uX3J1bm5pbmc7CS8qIHdlIGhhdmUgYSBbZGlzXWNvbm5lY3RvciBydW5uaW5nICovCi1zdGF0aWMgaW50IGZkX2xvb3A7CQkvKiBmZCBmb3IgZ2V0dGluZyBkZW1hbmQtZGlhbCBwYWNrZXRzICovCi0KLWludCBmZF9kZXZudWxsOwkJCS8qIGZkIGZvciAvZGV2L251bGwgKi8KLWludCBkZXZmZCA9IC0xOwkJCS8qIGZkIG9mIHVuZGVybHlpbmcgZGV2aWNlICovCi1pbnQgZmRfcHBwID0gLTE7CQkvKiBmZCBmb3IgdGFsa2luZyBQUFAgKi8KLWludCBwaGFzZTsJCQkvKiB3aGVyZSB0aGUgbGluayBpcyBhdCAqLwotaW50IGtpbGxfbGluazsKLWludCBhc2tlZF90b19xdWl0OwotaW50IG9wZW5fY2NwX2ZsYWc7Ci1pbnQgbGlzdGVuX3RpbWU7Ci1pbnQgZ290X3NpZ3VzcjI7Ci1pbnQgZ290X3NpZ3Rlcm07Ci1pbnQgZ290X3NpZ2h1cDsKLQotc3RhdGljIHNpZ3NldF90IHNpZ25hbHNfaGFuZGxlZDsKLXN0YXRpYyBpbnQgd2FpdGluZzsKLXN0YXRpYyBzaWdqbXBfYnVmIHNpZ2ptcDsKLQotY2hhciAqKnNjcmlwdF9lbnY7CQkvKiBFbnYuIHZhcmlhYmxlIHZhbHVlcyBmb3Igc2NyaXB0cyAqLwotaW50IHNfZW52X25hbGxvYzsJCS8qICMgd29yZHMgYXZhaWwgYXQgc2NyaXB0X2VudiAqLwotCi11X2NoYXIgb3V0cGFja2V0X2J1ZltQUFBfTVJVK1BQUF9IRFJMRU5dOyAvKiBidWZmZXIgZm9yIG91dGdvaW5nIHBhY2tldCAqLwotdV9jaGFyIGlucGFja2V0X2J1ZltQUFBfTVJVK1BQUF9IRFJMRU5dOyAvKiBidWZmZXIgZm9yIGluY29taW5nIHBhY2tldCAqLwotCi1zdGF0aWMgaW50IG5fY2hpbGRyZW47CQkvKiAjIGNoaWxkIHByb2Nlc3NlcyBzdGlsbCBydW5uaW5nICovCi1zdGF0aWMgaW50IGdvdF9zaWdjaGxkOwkJLyogc2V0IGlmIHdlIGhhdmUgcmVjZWl2ZWQgYSBTSUdDSExEICovCi0KLWludCBwcml2b3BlbjsJCQkvKiBkb24ndCBsb2NrLCBvcGVuIGRldmljZSBhcyByb290ICovCi0KLWNoYXIgKm5vX3BwcF9tc2cgPSAiU29ycnkgLSB0aGlzIHN5c3RlbSBsYWNrcyBQUFAga2VybmVsIHN1cHBvcnRcbiI7Ci0KLUdJRFNFVF9UWVBFIGdyb3Vwc1tOR1JPVVBTX01BWF07LyogZ3JvdXBzIHRoZSB1c2VyIGlzIGluICovCi1pbnQgbmdyb3VwczsJCQkvKiBIb3cgbWFueSBncm91cHMgdmFsaWQgaW4gZ3JvdXBzICovCi0KLXN0YXRpYyBzdHJ1Y3QgdGltZXZhbCBzdGFydF90aW1lOwkvKiBUaW1lIHdoZW4gbGluayB3YXMgc3RhcnRlZC4gKi8KLQotc3RhdGljIHN0cnVjdCBwcHBkX3N0YXRzIG9sZF9saW5rX3N0YXRzOwotc3RydWN0IHBwcGRfc3RhdHMgbGlua19zdGF0czsKLXVuc2lnbmVkIGxpbmtfY29ubmVjdF90aW1lOwotaW50IGxpbmtfc3RhdHNfdmFsaWQ7Ci0KLWludCBlcnJvcl9jb3VudDsKLQotYm9vbCBidW5kbGVfZW9mOwotYm9vbCBidW5kbGVfdGVybWluYXRpbmc7Ci0KLS8qCi0gKiBXZSBtYWludGFpbiBhIGxpc3Qgb2YgY2hpbGQgcHJvY2VzcyBwaWRzIGFuZAotICogZnVuY3Rpb25zIHRvIGNhbGwgd2hlbiB0aGV5IGV4aXQuCi0gKi8KLXN0cnVjdCBzdWJwcm9jZXNzIHsKLSAgICBwaWRfdAlwaWQ7Ci0gICAgY2hhcgkqcHJvZzsKLSAgICB2b2lkCSgqZG9uZSkgX19QKCh2b2lkICopKTsKLSAgICB2b2lkCSphcmc7Ci0gICAgaW50CQlraWxsYWJsZTsKLSAgICBzdHJ1Y3Qgc3VicHJvY2VzcyAqbmV4dDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3VicHJvY2VzcyAqY2hpbGRyZW47Ci0KLS8qIFByb3RvdHlwZXMgZm9yIHByb2NlZHVyZXMgbG9jYWwgdG8gdGhpcyBmaWxlLiAqLwotCi1zdGF0aWMgdm9pZCBzZXR1cF9zaWduYWxzIF9fUCgodm9pZCkpOwotc3RhdGljIHZvaWQgY3JlYXRlX3BpZGZpbGUgX19QKChpbnQgcGlkKSk7Ci1zdGF0aWMgdm9pZCBjcmVhdGVfbGlua3BpZGZpbGUgX19QKChpbnQgcGlkKSk7Ci1zdGF0aWMgdm9pZCBjbGVhbnVwIF9fUCgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2V0X2lucHV0IF9fUCgodm9pZCkpOwotc3RhdGljIHZvaWQgY2FsbHRpbWVvdXQgX19QKCh2b2lkKSk7Ci1zdGF0aWMgc3RydWN0IHRpbWV2YWwgKnRpbWVsZWZ0IF9fUCgoc3RydWN0IHRpbWV2YWwgKikpOwotc3RhdGljIHZvaWQga2lsbF9teV9wZyBfX1AoKGludCkpOwotc3RhdGljIHZvaWQgaHVwIF9fUCgoaW50KSk7Ci1zdGF0aWMgdm9pZCB0ZXJtIF9fUCgoaW50KSk7Ci1zdGF0aWMgdm9pZCBjaGxkIF9fUCgoaW50KSk7Ci1zdGF0aWMgdm9pZCB0b2dnbGVfZGVidWcgX19QKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9wZW5fY2NwIF9fUCgoaW50KSk7Ci1zdGF0aWMgdm9pZCBiYWRfc2lnbmFsIF9fUCgoaW50KSk7Ci1zdGF0aWMgdm9pZCBob2xkb2ZmX2VuZCBfX1AoKHZvaWQgKikpOwotc3RhdGljIHZvaWQgZm9yZ2V0X2NoaWxkIF9fUCgoaW50IHBpZCwgaW50IHN0YXR1cykpOwotc3RhdGljIGludCByZWFwX2tpZHMgX19QKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBjaGlsZHdhaXRfZW5kIF9fUCgodm9pZCAqKSk7Ci0KLSNpZmRlZiBVU0VfVERCCi1zdGF0aWMgdm9pZCB1cGRhdGVfZGJfZW50cnkgX19QKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBhZGRfZGJfa2V5IF9fUCgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkZWxldGVfZGJfa2V5IF9fUCgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBjbGVhbnVwX2RiIF9fUCgodm9pZCkpOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGhhbmRsZV9ldmVudHMgX19QKCh2b2lkKSk7Ci12b2lkIHByaW50X2xpbmtfc3RhdHMgX19QKCh2b2lkKSk7Ci0KLWV4dGVybgljaGFyCSp0dHluYW1lIF9fUCgoaW50KSk7Ci1leHRlcm4JY2hhcgkqZ2V0bG9naW4gX19QKCh2b2lkKSk7Ci1pbnQgbWFpbiBfX1AoKGludCwgY2hhciAqW10pKTsKLQotI2lmZGVmIHVsdHJpeAotI3VuZGVmCU9fTk9OQkxPQ0sKLSNkZWZpbmUJT19OT05CTE9DSwlPX05ERUxBWQotI2VuZGlmCi0KLSNpZmRlZiBVTFRSSVgKLSNkZWZpbmUgc2V0bG9nbWFzayh4KQotI2VuZGlmCi0KLS8qCi0gKiBQUFAgRGF0YSBMaW5rIExheWVyICJwcm90b2NvbCIgdGFibGUuCi0gKiBPbmUgZW50cnkgcGVyIHN1cHBvcnRlZCBwcm90b2NvbC4KLSAqIFRoZSBsYXN0IGVudHJ5IG11c3QgYmUgTlVMTC4KLSAqLwotc3RydWN0IHByb3RlbnQgKnByb3RvY29sc1tdID0gewotICAgICZsY3BfcHJvdGVudCwKLSAgICAmcGFwX3Byb3RlbnQsCi0gICAgJmNoYXBfcHJvdGVudCwKLSNpZmRlZiBDQkNQX1NVUFBPUlQKLSAgICAmY2JjcF9wcm90ZW50LAotI2VuZGlmCi0gICAgJmlwY3BfcHJvdGVudCwKLSNpZmRlZiBJTkVUNgotICAgICZpcHY2Y3BfcHJvdGVudCwKLSNlbmRpZgotICAgICZjY3BfcHJvdGVudCwKLSAgICAmZWNwX3Byb3RlbnQsCi0jaWZkZWYgSVBYX0NIQU5HRQotICAgICZpcHhjcF9wcm90ZW50LAotI2VuZGlmCi0jaWZkZWYgQVRfQ0hBTkdFCi0gICAgJmF0Y3BfcHJvdGVudCwKLSNlbmRpZgotICAgICZlYXBfcHJvdGVudCwKLSAgICBOVUxMCi19OwotCi0vKgotICogSWYgUFBQX0RSVl9OQU1FIGlzIG5vdCBkZWZpbmVkLCB1c2UgdGhlIGRlZmF1bHQgInBwcCIgYXMgdGhlIGRldmljZSBuYW1lLgotICovCi0jaWYgIWRlZmluZWQoUFBQX0RSVl9OQU1FKQotI2RlZmluZSBQUFBfRFJWX05BTUUJInBwcCIKLSNlbmRpZiAvKiAhZGVmaW5lZChQUFBfRFJWX05BTUUpICovCi0KLWludAotbWFpbihhcmdjLCBhcmd2KQotICAgIGludCBhcmdjOwotICAgIGNoYXIgKmFyZ3ZbXTsKLXsKLSAgICBpbnQgaSwgdDsKLSAgICBjaGFyICpwOwotICAgIHN0cnVjdCBwYXNzd2QgKnB3OwotICAgIHN0cnVjdCBwcm90ZW50ICpwcm90cDsKLSAgICBjaGFyIG51bWJ1ZlsxNl07Ci0KLSAgICBsaW5rX3N0YXRzX3ZhbGlkID0gMDsKLSAgICBuZXdfcGhhc2UoUEhBU0VfSU5JVElBTElaRSk7Ci0KLSAgICBzY3JpcHRfZW52ID0gTlVMTDsKLQotICAgIC8qIEluaXRpYWxpemUgc3lzbG9nIGZhY2lsaXRpZXMgKi8KLSAgICByZW9wZW5fbG9nKCk7Ci0KLSAgICBpZiAoZ2V0aG9zdG5hbWUoaG9zdG5hbWUsIE1BWE5BTUVMRU4pIDwgMCApIHsKLQlvcHRpb25fZXJyb3IoIkNvdWxkbid0IGdldCBob3N0bmFtZTogJW0iKTsKLQlleGl0KDEpOwotICAgIH0KLSAgICBob3N0bmFtZVtNQVhOQU1FTEVOLTFdID0gMDsKLQotICAgIC8qIG1ha2Ugc3VyZSB3ZSBkb24ndCBjcmVhdGUgd29ybGQgb3IgZ3JvdXAgd3JpdGFibGUgZmlsZXMuICovCi0gICAgdW1hc2sodW1hc2soMDc3NykgfCAwMjIpOwotCi0gICAgdWlkID0gZ2V0dWlkKCk7Ci0gICAgcHJpdmlsZWdlZCA9IHVpZCA9PSAwOwotICAgIHNscHJpbnRmKG51bWJ1Ziwgc2l6ZW9mKG51bWJ1ZiksICIlZCIsIHVpZCk7Ci0gICAgc2NyaXB0X3NldGVudigiT1JJR19VSUQiLCBudW1idWYsIDApOwotCi0gICAgbmdyb3VwcyA9IGdldGdyb3VwcyhOR1JPVVBTX01BWCwgZ3JvdXBzKTsKLQotICAgIC8qCi0gICAgICogSW5pdGlhbGl6ZSBtYWdpYyBudW1iZXIgZ2VuZXJhdG9yIG5vdyBzbyB0aGF0IHByb3RvY29scyBtYXkKLSAgICAgKiB1c2UgbWFnaWMgbnVtYmVycyBpbiBpbml0aWFsaXphdGlvbi4KLSAgICAgKi8KLSAgICBtYWdpY19pbml0KCk7Ci0KLSAgICAvKgotICAgICAqIEluaXRpYWxpemUgZWFjaCBwcm90b2NvbC4KLSAgICAgKi8KLSAgICBmb3IgKGkgPSAwOyAocHJvdHAgPSBwcm90b2NvbHNbaV0pICE9IE5VTEw7ICsraSkKLSAgICAgICAgKCpwcm90cC0+aW5pdCkoMCk7Ci0KLSAgICAvKgotICAgICAqIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgY2hhbm5lbC4KLSAgICAgKi8KLSAgICB0dHlfaW5pdCgpOwotCi0jaWYgZGVmaW5lZChfX0FORFJPSURfXykKLSAgICB7Ci0gICAgICAgIGV4dGVybiB2b2lkIHBwcG94X2luaXQoKTsKLSAgICAgICAgcHBwb3hfaW5pdCgpOwotICAgICAgICBwcml2aWxlZ2VkID0gMTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHByb2duYW1lID0gKmFyZ3Y7Ci0KLSAgICAvKgotICAgICAqIFBhcnNlLCBpbiBvcmRlciwgdGhlIHN5c3RlbSBvcHRpb25zIGZpbGUsIHRoZSB1c2VyJ3Mgb3B0aW9ucyBmaWxlLAotICAgICAqIGFuZCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KLSAgICAgKi8KLSNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKQotICAgIC8qIEFuZHJvaWQ6IG9ubHkgdGFrZSBvcHRpb25zIGZyb20gY29tbWFuZGxpbmUgKi8KLSAgICBpZiAoIXBhcnNlX2FyZ3MoYXJnYy0xLCBhcmd2KzEpKQotCWV4aXQoRVhJVF9PUFRJT05fRVJST1IpOwotCi0jZWxzZQotICAgIGlmICghb3B0aW9uc19mcm9tX2ZpbGUoX1BBVEhfU1lTT1BUSU9OUywgIXByaXZpbGVnZWQsIDAsIDEpCi0JfHwgIW9wdGlvbnNfZnJvbV91c2VyKCkKLQl8fCAhcGFyc2VfYXJncyhhcmdjLTEsIGFyZ3YrMSkpCi0JZXhpdChFWElUX09QVElPTl9FUlJPUik7Ci0KLSNlbmRpZgotCi0gICAgZGV2bmFtX2ZpeGVkID0gMTsJCS8qIGNhbiBubyBsb25nZXIgY2hhbmdlIGRldmljZSBuYW1lICovCi0KLSAgICAvKgotICAgICAqIFdvcmsgb3V0IHRoZSBkZXZpY2UgbmFtZSwgaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiBzcGVjaWZpZWQsCi0gICAgICogYW5kIHBhcnNlIHRoZSB0dHkncyBvcHRpb25zIGZpbGUuCi0gICAgICovCi0gICAgaWYgKHRoZV9jaGFubmVsLT5wcm9jZXNzX2V4dHJhX29wdGlvbnMpCi0JKCp0aGVfY2hhbm5lbC0+cHJvY2Vzc19leHRyYV9vcHRpb25zKSgpOwotCi0gICAgaWYgKGRlYnVnKQotCXNldGxvZ21hc2soTE9HX1VQVE8oTE9HX0RFQlVHKSk7Ci0KLSNpZiAhZGVmaW5lZChfX0FORFJPSURfXykKLSAgICAvKgotICAgICAqIENoZWNrIHRoYXQgd2UgYXJlIHJ1bm5pbmcgYXMgcm9vdC4KLSAgICAgKi8KLSAgICBpZiAoZ2V0ZXVpZCgpICE9IDApIHsKLQlvcHRpb25fZXJyb3IoIm11c3QgYmUgcm9vdCB0byBydW4gJXMsIHNpbmNlIGl0IGlzIG5vdCBzZXR1aWQtcm9vdCIsCi0JCSAgICAgYXJndlswXSk7Ci0JZXhpdChFWElUX05PVF9ST09UKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGlmICghcHBwX2F2YWlsYWJsZSgpKSB7Ci0Jb3B0aW9uX2Vycm9yKCIlcyIsIG5vX3BwcF9tc2cpOwotCWV4aXQoRVhJVF9OT19LRVJORUxfU1VQUE9SVCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDaGVjayB0aGF0IHRoZSBvcHRpb25zIGdpdmVuIGFyZSB2YWxpZCBhbmQgY29uc2lzdGVudC4KLSAgICAgKi8KLSAgICBjaGVja19vcHRpb25zKCk7Ci0gICAgaWYgKCFzeXNfY2hlY2tfb3B0aW9ucygpKQotCWV4aXQoRVhJVF9PUFRJT05fRVJST1IpOwotICAgIGF1dGhfY2hlY2tfb3B0aW9ucygpOwotI2lmZGVmIEhBVkVfTVVMVElMSU5LCi0gICAgbXBfY2hlY2tfb3B0aW9ucygpOwotI2VuZGlmCi0gICAgZm9yIChpID0gMDsgKHByb3RwID0gcHJvdG9jb2xzW2ldKSAhPSBOVUxMOyArK2kpCi0JaWYgKHByb3RwLT5jaGVja19vcHRpb25zICE9IE5VTEwpCi0JICAgICgqcHJvdHAtPmNoZWNrX29wdGlvbnMpKCk7Ci0gICAgaWYgKHRoZV9jaGFubmVsLT5jaGVja19vcHRpb25zKQotCSgqdGhlX2NoYW5uZWwtPmNoZWNrX29wdGlvbnMpKCk7Ci0KLQotICAgIGlmIChkdW1wX29wdGlvbnMgfHwgZHJ5cnVuKSB7Ci0JaW5pdF9wcl9sb2coTlVMTCwgTE9HX0lORk8pOwotCXByaW50X29wdGlvbnMocHJfbG9nLCBOVUxMKTsKLQllbmRfcHJfbG9nKCk7Ci0gICAgfQotCi0gICAgaWYgKGRyeXJ1bikKLQlkaWUoMCk7Ci0KLSAgICAvKiBNYWtlIHN1cmUgZmRzIDAsIDEsIDIgYXJlIG9wZW4gdG8gc29tZXdoZXJlLiAqLwotICAgIGZkX2Rldm51bGwgPSBvcGVuKF9QQVRIX0RFVk5VTEwsIE9fUkRXUik7Ci0gICAgaWYgKGZkX2Rldm51bGwgPCAwKQotCWZhdGFsKCJDb3VsZG4ndCBvcGVuICVzOiAlbSIsIF9QQVRIX0RFVk5VTEwpOwotICAgIHdoaWxlIChmZF9kZXZudWxsIDw9IDIpIHsKLQlpID0gZHVwKGZkX2Rldm51bGwpOwotCWlmIChpIDwgMCkKLQkgICAgZmF0YWwoIkNyaXRpY2FsIHNob3J0YWdlIG9mIGZpbGUgZGVzY3JpcHRvcnM6IGR1cCBmYWlsZWQ6ICVtIik7Ci0JZmRfZGV2bnVsbCA9IGk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBJbml0aWFsaXplIHN5c3RlbS1kZXBlbmRlbnQgc3R1ZmYuCi0gICAgICovCi0gICAgc3lzX2luaXQoKTsKLSNpZmRlZiBVU0VfVERCCi0gICAgcHBwZGIgPSB0ZGJfb3BlbihfUEFUSF9QUFBEQiwgMCwgMCwgT19SRFdSfE9fQ1JFQVQsIDA2NDQpOwotICAgIGlmIChwcHBkYiAhPSBOVUxMKSB7Ci0Jc2xwcmludGYoZGJfa2V5LCBzaXplb2YoZGJfa2V5KSwgInBwcGQlZCIsIGdldHBpZCgpKTsKLQl1cGRhdGVfZGJfZW50cnkoKTsKLSAgICB9IGVsc2UgewotCXdhcm4oIldhcm5pbmc6IGNvdWxkbid0IG9wZW4gcHBwIGRhdGFiYXNlICVzIiwgX1BBVEhfUFBQREIpOwotCWlmIChtdWx0aWxpbmspIHsKLQkgICAgd2FybigiV2FybmluZzogZGlzYWJsaW5nIG11bHRpbGluayIpOwotCSAgICBtdWx0aWxpbmsgPSAwOwotCX0KLSAgICB9Ci0jZW5kaWYKLQotICAgIC8qCi0gICAgICogRGV0YWNoIG91cnNlbHZlcyBmcm9tIHRoZSB0ZXJtaW5hbCwgaWYgcmVxdWlyZWQsCi0gICAgICogYW5kIGlkZW50aWZ5IHdobyBpcyBydW5uaW5nIHVzLgotICAgICAqLwotICAgIGlmICghbm9kZXRhY2ggJiYgIXVwZGV0YWNoKQotCWRldGFjaCgpOwotICAgIHAgPSBnZXRsb2dpbigpOwotICAgIGlmIChwID09IE5VTEwpIHsKLQlwdyA9IGdldHB3dWlkKHVpZCk7Ci0JaWYgKHB3ICE9IE5VTEwgJiYgcHctPnB3X25hbWUgIT0gTlVMTCkKLQkgICAgcCA9IHB3LT5wd19uYW1lOwotCWVsc2UKLQkgICAgcCA9ICIodW5rbm93bikiOwotICAgIH0KLSAgICBzeXNsb2coTE9HX05PVElDRSwgInBwcGQgJXMgc3RhcnRlZCBieSAlcywgdWlkICVkIiwgVkVSU0lPTiwgcCwgdWlkKTsKLSAgICBzY3JpcHRfc2V0ZW52KCJQUFBMT0dOQU1FIiwgcCwgMCk7Ci0KLSAgICBpZiAoZGV2bmFtWzBdKQotCXNjcmlwdF9zZXRlbnYoIkRFVklDRSIsIGRldm5hbSwgMSk7Ci0gICAgc2xwcmludGYobnVtYnVmLCBzaXplb2YobnVtYnVmKSwgIiVkIiwgZ2V0cGlkKCkpOwotICAgIHNjcmlwdF9zZXRlbnYoIlBQUERfUElEIiwgbnVtYnVmLCAxKTsKLQotICAgIHNldHVwX3NpZ25hbHMoKTsKLQotICAgIGNyZWF0ZV9saW5rcGlkZmlsZShnZXRwaWQoKSk7Ci0KLSAgICB3YWl0aW5nID0gMDsKLQotICAgIC8qCi0gICAgICogSWYgd2UncmUgZG9pbmcgZGlhbC1vbi1kZW1hbmQsIHNldCB1cCB0aGUgaW50ZXJmYWNlIG5vdy4KLSAgICAgKi8KLSAgICBpZiAoZGVtYW5kKSB7Ci0JLyoKLQkgKiBPcGVuIHRoZSBsb29wYmFjayBjaGFubmVsIGFuZCBzZXQgaXQgdXAgdG8gYmUgdGhlIHBwcCBpbnRlcmZhY2UuCi0JICovCi0JZmRfbG9vcCA9IG9wZW5fcHBwX2xvb3BiYWNrKCk7Ci0Jc2V0X2lmdW5pdCgxKTsKLQkvKgotCSAqIENvbmZpZ3VyZSB0aGUgaW50ZXJmYWNlIGFuZCBtYXJrIGl0IHVwLCBldGMuCi0JICovCi0JZGVtYW5kX2NvbmYoKTsKLSAgICB9Ci0KLSAgICBkb19jYWxsYmFjayA9IDA7Ci0gICAgZm9yICg7OykgewotCi0JYnVuZGxlX2VvZiA9IDA7Ci0JYnVuZGxlX3Rlcm1pbmF0aW5nID0gMDsKLQlsaXN0ZW5fdGltZSA9IDA7Ci0JbmVlZF9ob2xkb2ZmID0gMTsKLQlkZXZmZCA9IC0xOwotCXN0YXR1cyA9IEVYSVRfT0s7Ci0JKyt1bnN1Y2Nlc3M7Ci0JZG9pbmdfY2FsbGJhY2sgPSBkb19jYWxsYmFjazsKLQlkb19jYWxsYmFjayA9IDA7Ci0KLQlpZiAoZGVtYW5kICYmICFkb2luZ19jYWxsYmFjaykgewotCSAgICAvKgotCSAgICAgKiBEb24ndCBkbyBhbnl0aGluZyB1bnRpbCB3ZSBzZWUgc29tZSBhY3Rpdml0eS4KLQkgICAgICovCi0JICAgIG5ld19waGFzZShQSEFTRV9ET1JNQU5UKTsKLQkgICAgZGVtYW5kX3VuYmxvY2soKTsKLQkgICAgYWRkX2ZkKGZkX2xvb3ApOwotCSAgICBmb3IgKDs7KSB7Ci0JCWhhbmRsZV9ldmVudHMoKTsKLQkJaWYgKGFza2VkX3RvX3F1aXQpCi0JCSAgICBicmVhazsKLQkJaWYgKGdldF9sb29wX291dHB1dCgpKQotCQkgICAgYnJlYWs7Ci0JICAgIH0KLQkgICAgcmVtb3ZlX2ZkKGZkX2xvb3ApOwotCSAgICBpZiAoYXNrZWRfdG9fcXVpdCkKLQkJYnJlYWs7Ci0KLQkgICAgLyoKLQkgICAgICogTm93IHdlIHdhbnQgdG8gYnJpbmcgdXAgdGhlIGxpbmsuCi0JICAgICAqLwotCSAgICBkZW1hbmRfYmxvY2soKTsKLQkgICAgaW5mbygiU3RhcnRpbmcgbGluayIpOwotCX0KLQotCWdldHRpbWVvZmRheSgmc3RhcnRfdGltZSwgTlVMTCk7Ci0Jc2NyaXB0X3Vuc2V0ZW52KCJDT05ORUNUX1RJTUUiKTsKLQlzY3JpcHRfdW5zZXRlbnYoIkJZVEVTX1NFTlQiKTsKLQlzY3JpcHRfdW5zZXRlbnYoIkJZVEVTX1JDVkQiKTsKLQotCWxjcF9vcGVuKDApOwkJLyogU3RhcnQgcHJvdG9jb2wgKi8KLQlzdGFydF9saW5rKDApOwotCXdoaWxlIChwaGFzZSAhPSBQSEFTRV9ERUFEKSB7Ci0JICAgIGhhbmRsZV9ldmVudHMoKTsKLQkgICAgZ2V0X2lucHV0KCk7Ci0JICAgIGlmIChraWxsX2xpbmspCi0JCWxjcF9jbG9zZSgwLCAiVXNlciByZXF1ZXN0Iik7Ci0JICAgIGlmIChhc2tlZF90b19xdWl0KSB7Ci0JCWJ1bmRsZV90ZXJtaW5hdGluZyA9IDE7Ci0JCWlmIChwaGFzZSA9PSBQSEFTRV9NQVNURVIpCi0JCSAgICBtcF9idW5kbGVfdGVybWluYXRlZCgpOwotCSAgICB9Ci0JICAgIGlmIChvcGVuX2NjcF9mbGFnKSB7Ci0JCWlmIChwaGFzZSA9PSBQSEFTRV9ORVRXT1JLIHx8IHBoYXNlID09IFBIQVNFX1JVTk5JTkcpIHsKLQkJICAgIGNjcF9mc21bMF0uZmxhZ3MgPSBPUFRfUkVTVEFSVDsgLyogY2xlYXJzIE9QVF9TSUxFTlQgKi8KLQkJICAgICgqY2NwX3Byb3RlbnQub3BlbikoMCk7Ci0JCX0KLQkgICAgfQotCX0KLQkvKiByZXN0b3JlIEZTTXMgdG8gb3JpZ2luYWwgc3RhdGUgKi8KLQlsY3BfY2xvc2UoMCwgIiIpOwotCi0JaWYgKCFwZXJzaXN0IHx8IGFza2VkX3RvX3F1aXQgfHwgKG1heGZhaWwgPiAwICYmIHVuc3VjY2VzcyA+PSBtYXhmYWlsKSkKLQkgICAgYnJlYWs7Ci0KLQlpZiAoZGVtYW5kKQotCSAgICBkZW1hbmRfZGlzY2FyZCgpOwotCXQgPSBuZWVkX2hvbGRvZmY/IGhvbGRvZmY6IDA7Ci0JaWYgKGhvbGRvZmZfaG9vaykKLQkgICAgdCA9ICgqaG9sZG9mZl9ob29rKSgpOwotCWlmICh0ID4gMCkgewotCSAgICBuZXdfcGhhc2UoUEhBU0VfSE9MRE9GRik7Ci0JICAgIFRJTUVPVVQoaG9sZG9mZl9lbmQsIE5VTEwsIHQpOwotCSAgICBkbyB7Ci0JCWhhbmRsZV9ldmVudHMoKTsKLQkJaWYgKGtpbGxfbGluaykKLQkJICAgIG5ld19waGFzZShQSEFTRV9ET1JNQU5UKTsgLyogYWxsb3cgc2lnbmFsIHRvIGVuZCBob2xkb2ZmICovCi0JICAgIH0gd2hpbGUgKHBoYXNlID09IFBIQVNFX0hPTERPRkYpOwotCSAgICBpZiAoIXBlcnNpc3QpCi0JCWJyZWFrOwotCX0KLSAgICB9Ci0KLSAgICAvKiBXYWl0IGZvciBzY3JpcHRzIHRvIGZpbmlzaCAqLwotICAgIHJlYXBfa2lkcygpOwotICAgIGlmIChuX2NoaWxkcmVuID4gMCkgewotCWlmIChjaGlsZF93YWl0ID4gMCkKLQkgICAgVElNRU9VVChjaGlsZHdhaXRfZW5kLCBOVUxMLCBjaGlsZF93YWl0KTsKLQlpZiAoZGVidWcpIHsKLQkgICAgc3RydWN0IHN1YnByb2Nlc3MgKmNocDsKLQkgICAgZGJnbG9nKCJXYWl0aW5nIGZvciAlZCBjaGlsZCBwcm9jZXNzZXMuLi4iLCBuX2NoaWxkcmVuKTsKLQkgICAgZm9yIChjaHAgPSBjaGlsZHJlbjsgY2hwICE9IE5VTEw7IGNocCA9IGNocC0+bmV4dCkKLQkJZGJnbG9nKCIgIHNjcmlwdCAlcywgcGlkICVkIiwgY2hwLT5wcm9nLCBjaHAtPnBpZCk7Ci0JfQotCXdoaWxlIChuX2NoaWxkcmVuID4gMCAmJiAhY2hpbGR3YWl0X2RvbmUpIHsKLQkgICAgaGFuZGxlX2V2ZW50cygpOwotCSAgICBpZiAoa2lsbF9saW5rICYmICFjaGlsZHdhaXRfZG9uZSkKLQkJY2hpbGR3YWl0X2VuZChOVUxMKTsKLQl9Ci0gICAgfQotCi0gICAgZGllKHN0YXR1cyk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBoYW5kbGVfZXZlbnRzIC0gd2FpdCBmb3Igc29tZXRoaW5nIHRvIGhhcHBlbiBhbmQgcmVzcG9uZCB0byBpdC4KLSAqLwotc3RhdGljIHZvaWQKLWhhbmRsZV9ldmVudHMoKQotewotICAgIHN0cnVjdCB0aW1ldmFsIHRpbW87Ci0KLSAgICBraWxsX2xpbmsgPSBvcGVuX2NjcF9mbGFnID0gMDsKLSAgICBpZiAoc2lnc2V0am1wKHNpZ2ptcCwgMSkgPT0gMCkgewotCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNpZ25hbHNfaGFuZGxlZCwgTlVMTCk7Ci0JaWYgKGdvdF9zaWdodXAgfHwgZ290X3NpZ3Rlcm0gfHwgZ290X3NpZ3VzcjIgfHwgZ290X3NpZ2NobGQpIHsKLQkgICAgc2lncHJvY21hc2soU0lHX1VOQkxPQ0ssICZzaWduYWxzX2hhbmRsZWQsIE5VTEwpOwotCX0gZWxzZSB7Ci0JICAgIHdhaXRpbmcgPSAxOwotCSAgICBzaWdwcm9jbWFzayhTSUdfVU5CTE9DSywgJnNpZ25hbHNfaGFuZGxlZCwgTlVMTCk7Ci0JICAgIHdhaXRfaW5wdXQodGltZWxlZnQoJnRpbW8pKTsKLQl9Ci0gICAgfQotICAgIHdhaXRpbmcgPSAwOwotICAgIGNhbGx0aW1lb3V0KCk7Ci0gICAgaWYgKGdvdF9zaWdodXApIHsKLQlpbmZvKCJIYW5ndXAgKFNJR0hVUCkiKTsKLQlraWxsX2xpbmsgPSAxOwotCWdvdF9zaWdodXAgPSAwOwotCWlmIChzdGF0dXMgIT0gRVhJVF9IQU5HVVApCi0JICAgIHN0YXR1cyA9IEVYSVRfVVNFUl9SRVFVRVNUOwotICAgIH0KLSAgICBpZiAoZ290X3NpZ3Rlcm0pIHsKLQlpbmZvKCJUZXJtaW5hdGluZyBvbiBzaWduYWwgJWQiLCBnb3Rfc2lndGVybSk7Ci0Ja2lsbF9saW5rID0gMTsKLQlhc2tlZF90b19xdWl0ID0gMTsKLQlwZXJzaXN0ID0gMDsKLQlzdGF0dXMgPSBFWElUX1VTRVJfUkVRVUVTVDsKLQlnb3Rfc2lndGVybSA9IDA7Ci0gICAgfQotICAgIGlmIChnb3Rfc2lnY2hsZCkgewotCWdvdF9zaWdjaGxkID0gMDsKLQlyZWFwX2tpZHMoKTsJLyogRG9uJ3QgbGVhdmUgZGVhZCBraWRzIGx5aW5nIGFyb3VuZCAqLwotICAgIH0KLSAgICBpZiAoZ290X3NpZ3VzcjIpIHsKLQlvcGVuX2NjcF9mbGFnID0gMTsKLQlnb3Rfc2lndXNyMiA9IDA7Ci0gICAgfQotfQotCi0vKgotICogc2V0dXBfc2lnbmFscyAtIGluaXRpYWxpemUgc2lnbmFsIGhhbmRsaW5nLgotICovCi1zdGF0aWMgdm9pZAotc2V0dXBfc2lnbmFscygpCi17Ci0gICAgc3RydWN0IHNpZ2FjdGlvbiBzYTsKLQotICAgIC8qCi0gICAgICogQ29tcHV0ZSBtYXNrIG9mIGFsbCBpbnRlcmVzdGluZyBzaWduYWxzIGFuZCBpbnN0YWxsIHNpZ25hbCBoYW5kbGVycwotICAgICAqIGZvciBlYWNoLiAgT25seSBvbmUgc2lnbmFsIGhhbmRsZXIgbWF5IGJlIGFjdGl2ZSBhdCBhIHRpbWUuICBUaGVyZWZvcmUsCi0gICAgICogYWxsIG90aGVyIHNpZ25hbHMgc2hvdWxkIGJlIG1hc2tlZCB3aGVuIGFueSBoYW5kbGVyIGlzIGV4ZWN1dGluZy4KLSAgICAgKi8KLSAgICBzaWdlbXB0eXNldCgmc2lnbmFsc19oYW5kbGVkKTsKLSAgICBzaWdhZGRzZXQoJnNpZ25hbHNfaGFuZGxlZCwgU0lHSFVQKTsKLSAgICBzaWdhZGRzZXQoJnNpZ25hbHNfaGFuZGxlZCwgU0lHSU5UKTsKLSAgICBzaWdhZGRzZXQoJnNpZ25hbHNfaGFuZGxlZCwgU0lHVEVSTSk7Ci0gICAgc2lnYWRkc2V0KCZzaWduYWxzX2hhbmRsZWQsIFNJR0NITEQpOwotICAgIHNpZ2FkZHNldCgmc2lnbmFsc19oYW5kbGVkLCBTSUdVU1IyKTsKLQotI2RlZmluZSBTSUdOQUwocywgaGFuZGxlcikJZG8geyBcCi0Jc2Euc2FfaGFuZGxlciA9IGhhbmRsZXI7IFwKLQlpZiAoc2lnYWN0aW9uKHMsICZzYSwgTlVMTCkgPCAwKSBcCi0JICAgIGZhdGFsKCJDb3VsZG4ndCBlc3RhYmxpc2ggc2lnbmFsIGhhbmRsZXIgKCVkKTogJW0iLCBzKTsgXAotICAgIH0gd2hpbGUgKDApCi0KLSAgICBzYS5zYV9tYXNrID0gc2lnbmFsc19oYW5kbGVkOwotICAgIHNhLnNhX2ZsYWdzID0gMDsKLSAgICBTSUdOQUwoU0lHSFVQLCBodXApOwkJLyogSGFuZ3VwICovCi0gICAgU0lHTkFMKFNJR0lOVCwgdGVybSk7CQkvKiBJbnRlcnJ1cHQgKi8KLSAgICBTSUdOQUwoU0lHVEVSTSwgdGVybSk7CQkvKiBUZXJtaW5hdGUgKi8KLSAgICBTSUdOQUwoU0lHQ0hMRCwgY2hsZCk7Ci0KLSAgICBTSUdOQUwoU0lHVVNSMSwgdG9nZ2xlX2RlYnVnKTsJLyogVG9nZ2xlIGRlYnVnIGZsYWcgKi8KLSAgICBTSUdOQUwoU0lHVVNSMiwgb3Blbl9jY3ApOwkJLyogUmVvcGVuIENDUCAqLwotCi0gICAgLyoKLSAgICAgKiBJbnN0YWxsIGEgaGFuZGxlciBmb3Igb3RoZXIgc2lnbmFscyB3aGljaCB3b3VsZCBvdGhlcndpc2UKLSAgICAgKiBjYXVzZSBwcHBkIHRvIGV4aXQgd2l0aG91dCBjbGVhbmluZyB1cC4KLSAgICAgKi8KLSAgICBTSUdOQUwoU0lHQUJSVCwgYmFkX3NpZ25hbCk7Ci0gICAgU0lHTkFMKFNJR0FMUk0sIGJhZF9zaWduYWwpOwotICAgIFNJR05BTChTSUdGUEUsIGJhZF9zaWduYWwpOwotICAgIFNJR05BTChTSUdJTEwsIGJhZF9zaWduYWwpOwotICAgIFNJR05BTChTSUdQSVBFLCBiYWRfc2lnbmFsKTsKLSAgICBTSUdOQUwoU0lHUVVJVCwgYmFkX3NpZ25hbCk7Ci0gICAgU0lHTkFMKFNJR1NFR1YsIGJhZF9zaWduYWwpOwotI2lmZGVmIFNJR0JVUwotICAgIFNJR05BTChTSUdCVVMsIGJhZF9zaWduYWwpOwotI2VuZGlmCi0jaWZkZWYgU0lHRU1UCi0gICAgU0lHTkFMKFNJR0VNVCwgYmFkX3NpZ25hbCk7Ci0jZW5kaWYKLSNpZmRlZiBTSUdQT0xMCi0gICAgU0lHTkFMKFNJR1BPTEwsIGJhZF9zaWduYWwpOwotI2VuZGlmCi0jaWZkZWYgU0lHUFJPRgotICAgIFNJR05BTChTSUdQUk9GLCBiYWRfc2lnbmFsKTsKLSNlbmRpZgotI2lmZGVmIFNJR1NZUwotICAgIFNJR05BTChTSUdTWVMsIGJhZF9zaWduYWwpOwotI2VuZGlmCi0jaWZkZWYgU0lHVFJBUAotICAgIFNJR05BTChTSUdUUkFQLCBiYWRfc2lnbmFsKTsKLSNlbmRpZgotI2lmZGVmIFNJR1ZUQUxSTQotICAgIFNJR05BTChTSUdWVEFMUk0sIGJhZF9zaWduYWwpOwotI2VuZGlmCi0jaWZkZWYgU0lHWENQVQotICAgIFNJR05BTChTSUdYQ1BVLCBiYWRfc2lnbmFsKTsKLSNlbmRpZgotI2lmZGVmIFNJR1hGU1oKLSAgICBTSUdOQUwoU0lHWEZTWiwgYmFkX3NpZ25hbCk7Ci0jZW5kaWYKLQotICAgIC8qCi0gICAgICogQXBwYXJlbnRseSB3ZSBjYW4gZ2V0IGEgU0lHUElQRSB3aGVuIHdlIGNhbGwgc3lzbG9nLCBpZgotICAgICAqIHN5c2xvZ2QgaGFzIGRpZWQgYW5kIGJlZW4gcmVzdGFydGVkLiAgSWdub3JpbmcgaXQgc2VlbXMKLSAgICAgKiBiZSBzdWZmaWNpZW50LgotICAgICAqLwotICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKLX0KLQotLyoKLSAqIHNldF9pZnVuaXQgLSBkbyB0aGluZ3Mgd2UgbmVlZCB0byBkbyBvbmNlIHdlIGtub3cgd2hpY2ggcHBwCi0gKiB1bml0IHdlIGFyZSB1c2luZy4KLSAqLwotdm9pZAotc2V0X2lmdW5pdChpc2tleSkKLSAgICBpbnQgaXNrZXk7Ci17Ci0gICAgaW5mbygiVXNpbmcgaW50ZXJmYWNlICVzJWQiLCBQUFBfRFJWX05BTUUsIGlmdW5pdCk7Ci0gICAgc2xwcmludGYoaWZuYW1lLCBzaXplb2YoaWZuYW1lKSwgIiVzJWQiLCBQUFBfRFJWX05BTUUsIGlmdW5pdCk7Ci0gICAgc2NyaXB0X3NldGVudigiSUZOQU1FIiwgaWZuYW1lLCBpc2tleSk7Ci0gICAgaWYgKGlza2V5KSB7Ci0JY3JlYXRlX3BpZGZpbGUoZ2V0cGlkKCkpOwkvKiB3cml0ZSBwaWQgdG8gZmlsZSAqLwotCWNyZWF0ZV9saW5rcGlkZmlsZShnZXRwaWQoKSk7Ci0gICAgfQotfQotCi0vKgotICogZGV0YWNoIC0gZGV0YWNoIHVzIGZyb20gdGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsLgotICovCi12b2lkCi1kZXRhY2goKQotewotICAgIGludCBwaWQ7Ci0gICAgY2hhciBudW1idWZbMTZdOwotICAgIGludCBwaXBlZmRbMl07Ci0KLSAgICBpZiAoZGV0YWNoZWQpCi0JcmV0dXJuOwotICAgIGlmIChwaXBlKHBpcGVmZCkgPT0gLTEpCi0JcGlwZWZkWzBdID0gcGlwZWZkWzFdID0gLTE7Ci0gICAgaWYgKChwaWQgPSBmb3JrKCkpIDwgMCkgewotCWVycm9yKCJDb3VsZG4ndCBkZXRhY2ggKGZvcmsgZmFpbGVkOiAlbSkiKTsKLQlkaWUoMSk7CQkJLyogb3IganVzdCByZXR1cm4/ICovCi0gICAgfQotICAgIGlmIChwaWQgIT0gMCkgewotCS8qIHBhcmVudCAqLwotCW5vdGlmeShwaWRjaGFuZ2UsIHBpZCk7Ci0JLyogdXBkYXRlIHBpZCBmaWxlcyBpZiB0aGV5IGhhdmUgYmVlbiB3cml0dGVuIGFscmVhZHkgKi8KLQlpZiAocGlkZmlsZW5hbWVbMF0pCi0JICAgIGNyZWF0ZV9waWRmaWxlKHBpZCk7Ci0JaWYgKGxpbmtwaWRmaWxlWzBdKQotCSAgICBjcmVhdGVfbGlua3BpZGZpbGUocGlkKTsKLQlleGl0KDApOwkJLyogcGFyZW50IGRpZXMgKi8KLSAgICB9Ci0gICAgc2V0c2lkKCk7Ci0gICAgY2hkaXIoIi8iKTsKLSAgICBkdXAyKGZkX2Rldm51bGwsIDApOwotICAgIGR1cDIoZmRfZGV2bnVsbCwgMSk7Ci0gICAgZHVwMihmZF9kZXZudWxsLCAyKTsKLSAgICBkZXRhY2hlZCA9IDE7Ci0gICAgaWYgKGxvZ19kZWZhdWx0KQotCWxvZ190b19mZCA9IC0xOwotICAgIHNscHJpbnRmKG51bWJ1Ziwgc2l6ZW9mKG51bWJ1ZiksICIlZCIsIGdldHBpZCgpKTsKLSAgICBzY3JpcHRfc2V0ZW52KCJQUFBEX1BJRCIsIG51bWJ1ZiwgMSk7Ci0KLSAgICAvKiB3YWl0IGZvciBwYXJlbnQgdG8gZmluaXNoIHVwZGF0aW5nIHBpZCAmIGxvY2sgZmlsZXMgYW5kIGRpZSAqLwotICAgIGNsb3NlKHBpcGVmZFsxXSk7Ci0gICAgY29tcGxldGVfcmVhZChwaXBlZmRbMF0sIG51bWJ1ZiwgMSk7Ci0gICAgY2xvc2UocGlwZWZkWzBdKTsKLX0KLQotLyoKLSAqIHJlb3Blbl9sb2cgLSAocmUpb3BlbiBvdXIgY29ubmVjdGlvbiB0byBzeXNsb2cuCi0gKi8KLXZvaWQKLXJlb3Blbl9sb2coKQotewotICAgIG9wZW5sb2coInBwcGQiLCBMT0dfUElEIHwgTE9HX05ERUxBWSwgTE9HX1BQUCk7Ci0gICAgc2V0bG9nbWFzayhMT0dfVVBUTyhMT0dfSU5GTykpOwotfQotCi0vKgotICogQ3JlYXRlIGEgZmlsZSBjb250YWluaW5nIG91ciBwcm9jZXNzIElELgotICovCi1zdGF0aWMgdm9pZAotY3JlYXRlX3BpZGZpbGUocGlkKQotICAgIGludCBwaWQ7Ci17Ci0jaWYgIWRlZmluZWQoX19BTkRST0lEX18pCi0gICAgRklMRSAqcGlkZmlsZTsKLQotICAgIHNscHJpbnRmKHBpZGZpbGVuYW1lLCBzaXplb2YocGlkZmlsZW5hbWUpLCAiJXMlcy5waWQiLAotCSAgICAgX1BBVEhfVkFSUlVOLCBpZm5hbWUpOwotICAgIGlmICgocGlkZmlsZSA9IGZvcGVuKHBpZGZpbGVuYW1lLCAidyIpKSAhPSBOVUxMKSB7Ci0JZnByaW50ZihwaWRmaWxlLCAiJWRcbiIsIHBpZCk7Ci0JKHZvaWQpIGZjbG9zZShwaWRmaWxlKTsKLSAgICB9IGVsc2UgewotCWVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIHBpZCBmaWxlICVzOiAlbSIsIHBpZGZpbGVuYW1lKTsKLQlwaWRmaWxlbmFtZVswXSA9IDA7Ci0gICAgfQotI2VuZGlmCi19Ci0KLXZvaWQKLWNyZWF0ZV9saW5rcGlkZmlsZShwaWQpCi0gICAgaW50IHBpZDsKLXsKLSNpZiAhZGVmaW5lZChfX0FORFJPSURfXykKLSAgICBGSUxFICpwaWRmaWxlOwotCi0gICAgaWYgKGxpbmtuYW1lWzBdID09IDApCi0JcmV0dXJuOwotICAgIHNjcmlwdF9zZXRlbnYoIkxJTktOQU1FIiwgbGlua25hbWUsIDEpOwotICAgIHNscHJpbnRmKGxpbmtwaWRmaWxlLCBzaXplb2YobGlua3BpZGZpbGUpLCAiJXNwcHAtJXMucGlkIiwKLQkgICAgIF9QQVRIX1ZBUlJVTiwgbGlua25hbWUpOwotICAgIGlmICgocGlkZmlsZSA9IGZvcGVuKGxpbmtwaWRmaWxlLCAidyIpKSAhPSBOVUxMKSB7Ci0JZnByaW50ZihwaWRmaWxlLCAiJWRcbiIsIHBpZCk7Ci0JaWYgKGlmbmFtZVswXSkKLQkgICAgZnByaW50ZihwaWRmaWxlLCAiJXNcbiIsIGlmbmFtZSk7Ci0JKHZvaWQpIGZjbG9zZShwaWRmaWxlKTsKLSAgICB9IGVsc2UgewotCWVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIHBpZCBmaWxlICVzOiAlbSIsIGxpbmtwaWRmaWxlKTsKLQlsaW5rcGlkZmlsZVswXSA9IDA7Ci0gICAgfQotI2VuZGlmCi19Ci0KLS8qCi0gKiByZW1vdmVfcGlkZmlsZSAtIHJlbW92ZSBvdXIgcGlkIGZpbGVzCi0gKi8KLXZvaWQgcmVtb3ZlX3BpZGZpbGVzKCkKLXsKLSNpZiAhZGVmaW5lZChfX0FORFJPSURfXykKLSAgICBpZiAocGlkZmlsZW5hbWVbMF0gIT0gMCAmJiB1bmxpbmsocGlkZmlsZW5hbWUpIDwgMCAmJiBlcnJubyAhPSBFTk9FTlQpCi0Jd2FybigidW5hYmxlIHRvIGRlbGV0ZSBwaWQgZmlsZSAlczogJW0iLCBwaWRmaWxlbmFtZSk7Ci0gICAgcGlkZmlsZW5hbWVbMF0gPSAwOwotICAgIGlmIChsaW5rcGlkZmlsZVswXSAhPSAwICYmIHVubGluayhsaW5rcGlkZmlsZSkgPCAwICYmIGVycm5vICE9IEVOT0VOVCkKLQl3YXJuKCJ1bmFibGUgdG8gZGVsZXRlIHBpZCBmaWxlICVzOiAlbSIsIGxpbmtwaWRmaWxlKTsKLSAgICBsaW5rcGlkZmlsZVswXSA9IDA7Ci0jZW5kaWYKLX0KLQotLyoKLSAqIGhvbGRvZmZfZW5kIC0gY2FsbGVkIHZpYSBhIHRpbWVvdXQgd2hlbiB0aGUgaG9sZG9mZiBwZXJpb2QgZW5kcy4KLSAqLwotc3RhdGljIHZvaWQKLWhvbGRvZmZfZW5kKGFyZykKLSAgICB2b2lkICphcmc7Ci17Ci0gICAgbmV3X3BoYXNlKFBIQVNFX0RPUk1BTlQpOwotfQotCi0vKiBMaXN0IG9mIHByb3RvY29sIG5hbWVzLCB0byBtYWtlIG91ciBtZXNzYWdlcyBhIGxpdHRsZSBtb3JlIGluZm9ybWF0aXZlLiAqLwotc3RydWN0IHByb3RvY29sX2xpc3QgewotICAgIHVfc2hvcnQJcHJvdG87Ci0gICAgY29uc3QgY2hhcgkqbmFtZTsKLX0gcHJvdG9jb2xfbGlzdFtdID0gewotICAgIHsgMHgyMSwJIklQIiB9LAotICAgIHsgMHgyMywJIk9TSSBOZXR3b3JrIExheWVyIiB9LAotICAgIHsgMHgyNSwJIlhlcm94IE5TIElEUCIgfSwKLSAgICB7IDB4MjcsCSJERUNuZXQgUGhhc2UgSVYiIH0sCi0gICAgeyAweDI5LAkiQXBwbGV0YWxrIiB9LAotICAgIHsgMHgyYiwJIk5vdmVsbCBJUFgiIH0sCi0gICAgeyAweDJkLAkiVkogY29tcHJlc3NlZCBUQ1AvSVAiIH0sCi0gICAgeyAweDJmLAkiVkogdW5jb21wcmVzc2VkIFRDUC9JUCIgfSwKLSAgICB7IDB4MzEsCSJCcmlkZ2luZyBQRFUiIH0sCi0gICAgeyAweDMzLAkiU3RyZWFtIFByb3RvY29sIFNULUlJIiB9LAotICAgIHsgMHgzNSwJIkJhbnlhbiBWaW5lcyIgfSwKLSAgICB7IDB4MzksCSJBcHBsZVRhbGsgRUREUCIgfSwKLSAgICB7IDB4M2IsCSJBcHBsZVRhbGsgU21hcnRCdWZmZXJlZCIgfSwKLSAgICB7IDB4M2QsCSJNdWx0aS1MaW5rIiB9LAotICAgIHsgMHgzZiwJIk5FVEJJT1MgRnJhbWluZyIgfSwKLSAgICB7IDB4NDEsCSJDaXNjbyBTeXN0ZW1zIiB9LAotICAgIHsgMHg0MywJIkFzY29tIFRpbWVwbGV4IiB9LAotICAgIHsgMHg0NSwJIkZ1aml0c3UgTGluayBCYWNrdXAgYW5kIExvYWQgQmFsYW5jaW5nIChMQkxCKSIgfSwKLSAgICB7IDB4NDcsCSJEQ0EgUmVtb3RlIExhbiIgfSwKLSAgICB7IDB4NDksCSJTZXJpYWwgRGF0YSBUcmFuc3BvcnQgUHJvdG9jb2wgKFBQUC1TRFRQKSIgfSwKLSAgICB7IDB4NGIsCSJTTkEgb3ZlciA4MDIuMiIgfSwKLSAgICB7IDB4NGQsCSJTTkEiIH0sCi0gICAgeyAweDRmLAkiSVA2IEhlYWRlciBDb21wcmVzc2lvbiIgfSwKLSAgICB7IDB4NTEsCSJLTlggQnJpZGdpbmcgRGF0YSIgfSwKLSAgICB7IDB4NTMsCSJFbmNyeXB0aW9uIiB9LAotICAgIHsgMHg1NSwJIkluZGl2aWR1YWwgTGluayBFbmNyeXB0aW9uIiB9LAotICAgIHsgMHg1NywJIklQdjYiIH0sCi0gICAgeyAweDU5LAkiUFBQIE11eGluZyIgfSwKLSAgICB7IDB4NWIsCSJWZW5kb3ItU3BlY2lmaWMgTmV0d29yayBQcm90b2NvbCIgfSwKLSAgICB7IDB4NjEsCSJSVFAgSVBIQyBGdWxsIEhlYWRlciIgfSwKLSAgICB7IDB4NjMsCSJSVFAgSVBIQyBDb21wcmVzc2VkIFRDUCIgfSwKLSAgICB7IDB4NjUsCSJSVFAgSVBIQyBDb21wcmVzc2VkIG5vbi1UQ1AiIH0sCi0gICAgeyAweDY3LAkiUlRQIElQSEMgQ29tcHJlc3NlZCBVRFAgOCIgfSwKLSAgICB7IDB4NjksCSJSVFAgSVBIQyBDb21wcmVzc2VkIFJUUCA4IiB9LAotICAgIHsgMHg2ZiwJIlN0YW1wZWRlIEJyaWRnaW5nIiB9LAotICAgIHsgMHg3MywJIk1QKyIgfSwKLSAgICB7IDB4YzEsCSJOVENJVFMgSVBJIiB9LAotICAgIHsgMHhmYiwJInNpbmdsZS1saW5rIGNvbXByZXNzaW9uIiB9LAotICAgIHsgMHhmZCwJIkNvbXByZXNzZWQgRGF0YWdyYW0iIH0sCi0gICAgeyAweDAyMDEsCSI4MDIuMWQgSGVsbG8gUGFja2V0cyIgfSwKLSAgICB7IDB4MDIwMywJIklCTSBTb3VyY2UgUm91dGluZyBCUERVIiB9LAotICAgIHsgMHgwMjA1LAkiREVDIExBTkJyaWRnZTEwMCBTcGFubmluZyBUcmVlIiB9LAotICAgIHsgMHgwMjA3LAkiQ2lzY28gRGlzY292ZXJ5IFByb3RvY29sIiB9LAotICAgIHsgMHgwMjA5LAkiTmV0Y3MgVHdpbiBSb3V0aW5nIiB9LAotICAgIHsgMHgwMjBiLAkiU1RQIC0gU2NoZWR1bGVkIFRyYW5zZmVyIFByb3RvY29sIiB9LAotICAgIHsgMHgwMjBkLAkiRURQIC0gRXh0cmVtZSBEaXNjb3ZlcnkgUHJvdG9jb2wiIH0sCi0gICAgeyAweDAyMTEsCSJPcHRpY2FsIFN1cGVydmlzb3J5IENoYW5uZWwgUHJvdG9jb2wiIH0sCi0gICAgeyAweDAyMTMsCSJPcHRpY2FsIFN1cGVydmlzb3J5IENoYW5uZWwgUHJvdG9jb2wiIH0sCi0gICAgeyAweDAyMzEsCSJMdXhjb20iIH0sCi0gICAgeyAweDAyMzMsCSJTaWdtYSBOZXR3b3JrIFN5c3RlbXMiIH0sCi0gICAgeyAweDAyMzUsCSJBcHBsZSBDbGllbnQgU2VydmVyIFByb3RvY29sIiB9LAotICAgIHsgMHgwMjgxLAkiTVBMUyBVbmljYXN0IiB9LAotICAgIHsgMHgwMjgzLAkiTVBMUyBNdWx0aWNhc3QiIH0sCi0gICAgeyAweDAyODUsCSJJRUVFIHAxMjg0LjQgc3RhbmRhcmQgLSBkYXRhIHBhY2tldHMiIH0sCi0gICAgeyAweDAyODcsCSJFVFNJIFRFVFJBIE5ldHdvcmsgUHJvdG9jb2wgVHlwZSAxIiB9LAotICAgIHsgMHgwMjg5LAkiTXVsdGljaGFubmVsIEZsb3cgVHJlYXRtZW50IFByb3RvY29sIiB9LAotICAgIHsgMHgyMDYzLAkiUlRQIElQSEMgQ29tcHJlc3NlZCBUQ1AgTm8gRGVsdGEiIH0sCi0gICAgeyAweDIwNjUsCSJSVFAgSVBIQyBDb250ZXh0IFN0YXRlIiB9LAotICAgIHsgMHgyMDY3LAkiUlRQIElQSEMgQ29tcHJlc3NlZCBVRFAgMTYiIH0sCi0gICAgeyAweDIwNjksCSJSVFAgSVBIQyBDb21wcmVzc2VkIFJUUCAxNiIgfSwKLSAgICB7IDB4NDAwMSwJIkNyYXkgQ29tbXVuaWNhdGlvbnMgQ29udHJvbCBQcm90b2NvbCIgfSwKLSAgICB7IDB4NDAwMywJIkNEUEQgTW9iaWxlIE5ldHdvcmsgUmVnaXN0cmF0aW9uIFByb3RvY29sIiB9LAotICAgIHsgMHg0MDA1LAkiRXhwYW5kIGFjY2VsZXJhdG9yIHByb3RvY29sIiB9LAotICAgIHsgMHg0MDA3LAkiT0RTSUNQIE5DUCIgfSwKLSAgICB7IDB4NDAwOSwJIkRPQ1NJUyBETEwiIH0sCi0gICAgeyAweDQwMEIsCSJDZXRhY2VhbiBOZXR3b3JrIERldGVjdGlvbiBQcm90b2NvbCIgfSwKLSAgICB7IDB4NDAyMSwJIlN0YWNrZXIgTFpTIiB9LAotICAgIHsgMHg0MDIzLAkiUmVmVGVrIFByb3RvY29sIiB9LAotICAgIHsgMHg0MDI1LAkiRmlicmUgQ2hhbm5lbCIgfSwKLSAgICB7IDB4NDAyNywJIkVNSVQgUHJvdG9jb2xzIiB9LAotICAgIHsgMHg0MDViLAkiVmVuZG9yLVNwZWNpZmljIFByb3RvY29sIChWU1ApIiB9LAotICAgIHsgMHg4MDIxLAkiSW50ZXJuZXQgUHJvdG9jb2wgQ29udHJvbCBQcm90b2NvbCIgfSwKLSAgICB7IDB4ODAyMywJIk9TSSBOZXR3b3JrIExheWVyIENvbnRyb2wgUHJvdG9jb2wiIH0sCi0gICAgeyAweDgwMjUsCSJYZXJveCBOUyBJRFAgQ29udHJvbCBQcm90b2NvbCIgfSwKLSAgICB7IDB4ODAyNywJIkRFQ25ldCBQaGFzZSBJViBDb250cm9sIFByb3RvY29sIiB9LAotICAgIHsgMHg4MDI5LAkiQXBwbGV0YWxrIENvbnRyb2wgUHJvdG9jb2wiIH0sCi0gICAgeyAweDgwMmIsCSJOb3ZlbGwgSVBYIENvbnRyb2wgUHJvdG9jb2wiIH0sCi0gICAgeyAweDgwMzEsCSJCcmlkZ2luZyBOQ1AiIH0sCi0gICAgeyAweDgwMzMsCSJTdHJlYW0gUHJvdG9jb2wgQ29udHJvbCBQcm90b2NvbCIgfSwKLSAgICB7IDB4ODAzNSwJIkJhbnlhbiBWaW5lcyBDb250cm9sIFByb3RvY29sIiB9LAotICAgIHsgMHg4MDNkLAkiTXVsdGktTGluayBDb250cm9sIFByb3RvY29sIiB9LAotICAgIHsgMHg4MDNmLAkiTkVUQklPUyBGcmFtaW5nIENvbnRyb2wgUHJvdG9jb2wiIH0sCi0gICAgeyAweDgwNDEsCSJDaXNjbyBTeXN0ZW1zIENvbnRyb2wgUHJvdG9jb2wiIH0sCi0gICAgeyAweDgwNDMsCSJBc2NvbSBUaW1lcGxleCIgfSwKLSAgICB7IDB4ODA0NSwJIkZ1aml0c3UgTEJMQiBDb250cm9sIFByb3RvY29sIiB9LAotICAgIHsgMHg4MDQ3LAkiRENBIFJlbW90ZSBMYW4gTmV0d29yayBDb250cm9sIFByb3RvY29sIChSTE5DUCkiIH0sCi0gICAgeyAweDgwNDksCSJTZXJpYWwgRGF0YSBDb250cm9sIFByb3RvY29sIChQUFAtU0RDUCkiIH0sCi0gICAgeyAweDgwNGIsCSJTTkEgb3ZlciA4MDIuMiBDb250cm9sIFByb3RvY29sIiB9LAotICAgIHsgMHg4MDRkLAkiU05BIENvbnRyb2wgUHJvdG9jb2wiIH0sCi0gICAgeyAweDgwNGYsCSJJUDYgSGVhZGVyIENvbXByZXNzaW9uIENvbnRyb2wgUHJvdG9jb2wiIH0sCi0gICAgeyAweDgwNTEsCSJLTlggQnJpZGdpbmcgQ29udHJvbCBQcm90b2NvbCIgfSwKLSAgICB7IDB4ODA1MywJIkVuY3J5cHRpb24gQ29udHJvbCBQcm90b2NvbCIgfSwKLSAgICB7IDB4ODA1NSwJIkluZGl2aWR1YWwgTGluayBFbmNyeXB0aW9uIENvbnRyb2wgUHJvdG9jb2wiIH0sCi0gICAgeyAweDgwNTcsCSJJUHY2IENvbnRyb2wgUHJvdG9jb2wiIH0sCi0gICAgeyAweDgwNTksCSJQUFAgTXV4aW5nIENvbnRyb2wgUHJvdG9jb2wiIH0sCi0gICAgeyAweDgwNWIsCSJWZW5kb3ItU3BlY2lmaWMgTmV0d29yayBDb250cm9sIFByb3RvY29sIChWU05DUCkiIH0sCi0gICAgeyAweDgwNmYsCSJTdGFtcGVkZSBCcmlkZ2luZyBDb250cm9sIFByb3RvY29sIiB9LAotICAgIHsgMHg4MDczLAkiTVArIENvbnRyb2wgUHJvdG9jb2wiIH0sCi0gICAgeyAweDgwYzEsCSJOVENJVFMgSVBJIENvbnRyb2wgUHJvdG9jb2wiIH0sCi0gICAgeyAweDgwZmIsCSJTaW5nbGUgTGluayBDb21wcmVzc2lvbiBDb250cm9sIFByb3RvY29sIiB9LAotICAgIHsgMHg4MGZkLAkiQ29tcHJlc3Npb24gQ29udHJvbCBQcm90b2NvbCIgfSwKLSAgICB7IDB4ODIwNywJIkNpc2NvIERpc2NvdmVyeSBQcm90b2NvbCBDb250cm9sIiB9LAotICAgIHsgMHg4MjA5LAkiTmV0Y3MgVHdpbiBSb3V0aW5nIiB9LAotICAgIHsgMHg4MjBiLAkiU1RQIC0gQ29udHJvbCBQcm90b2NvbCIgfSwKLSAgICB7IDB4ODIwZCwJIkVEUENQIC0gRXh0cmVtZSBEaXNjb3ZlcnkgUHJvdG9jb2wgQ3RybCBQcnRjbCIgfSwKLSAgICB7IDB4ODIzNSwJIkFwcGxlIENsaWVudCBTZXJ2ZXIgUHJvdG9jb2wgQ29udHJvbCIgfSwKLSAgICB7IDB4ODI4MSwJIk1QTFNDUCIgfSwKLSAgICB7IDB4ODI4NSwJIklFRUUgcDEyODQuNCBzdGFuZGFyZCAtIFByb3RvY29sIENvbnRyb2wiIH0sCi0gICAgeyAweDgyODcsCSJFVFNJIFRFVFJBIFROUDEgQ29udHJvbCBQcm90b2NvbCIgfSwKLSAgICB7IDB4ODI4OSwJIk11bHRpY2hhbm5lbCBGbG93IFRyZWF0bWVudCBQcm90b2NvbCIgfSwKLSAgICB7IDB4YzAyMSwJIkxpbmsgQ29udHJvbCBQcm90b2NvbCIgfSwKLSAgICB7IDB4YzAyMywJIlBhc3N3b3JkIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sIiB9LAotICAgIHsgMHhjMDI1LAkiTGluayBRdWFsaXR5IFJlcG9ydCIgfSwKLSAgICB7IDB4YzAyNywJIlNoaXZhIFBhc3N3b3JkIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sIiB9LAotICAgIHsgMHhjMDI5LAkiQ2FsbEJhY2sgQ29udHJvbCBQcm90b2NvbCAoQ0JDUCkiIH0sCi0gICAgeyAweGMwMmIsCSJCQUNQIEJhbmR3aWR0aCBBbGxvY2F0aW9uIENvbnRyb2wgUHJvdG9jb2wiIH0sCi0gICAgeyAweGMwMmQsCSJCQVAiIH0sCi0gICAgeyAweGMwNWIsCSJWZW5kb3ItU3BlY2lmaWMgQXV0aGVudGljYXRpb24gUHJvdG9jb2wgKFZTQVApIiB9LAotICAgIHsgMHhjMDgxLAkiQ29udGFpbmVyIENvbnRyb2wgUHJvdG9jb2wiIH0sCi0gICAgeyAweGMyMjMsCSJDaGFsbGVuZ2UgSGFuZHNoYWtlIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sIiB9LAotICAgIHsgMHhjMjI1LAkiUlNBIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sIiB9LAotICAgIHsgMHhjMjI3LAkiRXh0ZW5zaWJsZSBBdXRoZW50aWNhdGlvbiBQcm90b2NvbCIgfSwKLSAgICB7IDB4YzIyOSwJIk1pdHN1YmlzaGkgU2VjdXJpdHkgSW5mbyBFeGNoIFB0Y2wgKFNJRVApIiB9LAotICAgIHsgMHhjMjZmLAkiU3RhbXBlZGUgQnJpZGdpbmcgQXV0aG9yaXphdGlvbiBQcm90b2NvbCIgfSwKLSAgICB7IDB4YzI4MSwJIlByb3ByaWV0YXJ5IEF1dGhlbnRpY2F0aW9uIFByb3RvY29sIiB9LAotICAgIHsgMHhjMjgzLAkiUHJvcHJpZXRhcnkgQXV0aGVudGljYXRpb24gUHJvdG9jb2wiIH0sCi0gICAgeyAweGM0ODEsCSJQcm9wcmlldGFyeSBOb2RlIElEIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sIiB9LAotICAgIHsgMCwJTlVMTCB9LAotfTsKLQotLyoKLSAqIHByb3RvY29sX25hbWUgLSBmaW5kIGEgbmFtZSBmb3IgYSBQUFAgcHJvdG9jb2wuCi0gKi8KLWNvbnN0IGNoYXIgKgotcHJvdG9jb2xfbmFtZShwcm90bykKLSAgICBpbnQgcHJvdG87Ci17Ci0gICAgc3RydWN0IHByb3RvY29sX2xpc3QgKmxwOwotCi0gICAgZm9yIChscCA9IHByb3RvY29sX2xpc3Q7IGxwLT5wcm90byAhPSAwOyArK2xwKQotCWlmIChwcm90byA9PSBscC0+cHJvdG8pCi0JICAgIHJldHVybiBscC0+bmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIGdldF9pbnB1dCAtIGNhbGxlZCB3aGVuIGluY29taW5nIGRhdGEgaXMgYXZhaWxhYmxlLgotICovCi1zdGF0aWMgdm9pZAotZ2V0X2lucHV0KCkKLXsKLSAgICBpbnQgbGVuLCBpOwotICAgIHVfY2hhciAqcDsKLSAgICB1X3Nob3J0IHByb3RvY29sOwotICAgIHN0cnVjdCBwcm90ZW50ICpwcm90cDsKLQotICAgIHAgPSBpbnBhY2tldF9idWY7CS8qIHBvaW50IHRvIGJlZ2lubmluZyBvZiBwYWNrZXQgYnVmZmVyICovCi0KLSAgICBsZW4gPSByZWFkX3BhY2tldChpbnBhY2tldF9idWYpOwotICAgIGlmIChsZW4gPCAwKQotCXJldHVybjsKLQotICAgIGlmIChsZW4gPT0gMCkgewotCWlmIChidW5kbGVfZW9mICYmIG11bHRpbGlua19tYXN0ZXIpIHsKLQkgICAgbm90aWNlKCJMYXN0IGNoYW5uZWwgaGFzIGRpc2Nvbm5lY3RlZCIpOwotCSAgICBtcF9idW5kbGVfdGVybWluYXRlZCgpOwotCSAgICByZXR1cm47Ci0JfQotCW5vdGljZSgiTW9kZW0gaGFuZ3VwIik7Ci0JaHVuZ3VwID0gMTsKLQlzdGF0dXMgPSBFWElUX0hBTkdVUDsKLQlsY3BfbG93ZXJkb3duKDApOwkvKiBzZXJpYWwgbGluayBpcyBubyBsb25nZXIgYXZhaWxhYmxlICovCi0JbGlua190ZXJtaW5hdGVkKDApOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobGVuIDwgUFBQX0hEUkxFTikgewotCWRiZ2xvZygicmVjZWl2ZWQgc2hvcnQgcGFja2V0OiUuKkIiLCBsZW4sIHApOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICBkdW1wX3BhY2tldCgicmN2ZCIsIHAsIGxlbik7Ci0gICAgaWYgKHNub29wX3JlY3ZfaG9vaykgc25vb3BfcmVjdl9ob29rKHAsIGxlbik7Ci0KLSAgICBwICs9IDI7CQkJCS8qIFNraXAgYWRkcmVzcyBhbmQgY29udHJvbCAqLwotICAgIEdFVFNIT1JUKHByb3RvY29sLCBwKTsKLSAgICBsZW4gLT0gUFBQX0hEUkxFTjsKLQotICAgIC8qCi0gICAgICogVG9zcyBhbGwgbm9uLUxDUCBwYWNrZXRzIHVubGVzcyBMQ1AgaXMgT1BFTi4KLSAgICAgKi8KLSAgICBpZiAocHJvdG9jb2wgIT0gUFBQX0xDUCAmJiBsY3BfZnNtWzBdLnN0YXRlICE9IE9QRU5FRCkgewotCWRiZ2xvZygiRGlzY2FyZGVkIG5vbi1MQ1AgcGFja2V0IHdoZW4gTENQIG5vdCBvcGVuIik7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVW50aWwgd2UgZ2V0IHBhc3QgdGhlIGF1dGhlbnRpY2F0aW9uIHBoYXNlLCB0b3NzIGFsbCBwYWNrZXRzCi0gICAgICogZXhjZXB0IExDUCwgTFFSIGFuZCBhdXRoZW50aWNhdGlvbiBwYWNrZXRzLgotICAgICAqLwotICAgIGlmIChwaGFzZSA8PSBQSEFTRV9BVVRIRU5USUNBVEUKLQkmJiAhKHByb3RvY29sID09IFBQUF9MQ1AgfHwgcHJvdG9jb2wgPT0gUFBQX0xRUgotCSAgICAgfHwgcHJvdG9jb2wgPT0gUFBQX1BBUCB8fCBwcm90b2NvbCA9PSBQUFBfQ0hBUCB8fAotCQlwcm90b2NvbCA9PSBQUFBfRUFQKSkgewotCWRiZ2xvZygiZGlzY2FyZGluZyBwcm90byAweCV4IGluIHBoYXNlICVkIiwKLQkJICAgcHJvdG9jb2wsIHBoYXNlKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBVcGNhbGwgdGhlIHByb3BlciBwcm90b2NvbCBpbnB1dCByb3V0aW5lLgotICAgICAqLwotICAgIGZvciAoaSA9IDA7IChwcm90cCA9IHByb3RvY29sc1tpXSkgIT0gTlVMTDsgKytpKSB7Ci0JaWYgKHByb3RwLT5wcm90b2NvbCA9PSBwcm90b2NvbCAmJiBwcm90cC0+ZW5hYmxlZF9mbGFnKSB7Ci0JICAgICgqcHJvdHAtPmlucHV0KSgwLCBwLCBsZW4pOwotCSAgICByZXR1cm47Ci0JfQotICAgICAgICBpZiAocHJvdG9jb2wgPT0gKHByb3RwLT5wcm90b2NvbCAmIH4weDgwMDApICYmIHByb3RwLT5lbmFibGVkX2ZsYWcKLQkgICAgJiYgcHJvdHAtPmRhdGFpbnB1dCAhPSBOVUxMKSB7Ci0JICAgICgqcHJvdHAtPmRhdGFpbnB1dCkoMCwgcCwgbGVuKTsKLQkgICAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgICBpZiAoZGVidWcpIHsKLQljb25zdCBjaGFyICpwbmFtZSA9IHByb3RvY29sX25hbWUocHJvdG9jb2wpOwotCWlmIChwbmFtZSAhPSBOVUxMKQotCSAgICB3YXJuKCJVbnN1cHBvcnRlZCBwcm90b2NvbCAnJXMnICgweCV4KSByZWNlaXZlZCIsIHBuYW1lLCBwcm90b2NvbCk7Ci0JZWxzZQotCSAgICB3YXJuKCJVbnN1cHBvcnRlZCBwcm90b2NvbCAweCV4IHJlY2VpdmVkIiwgcHJvdG9jb2wpOwotICAgIH0KLSAgICBsY3Bfc3Byb3RyZWooMCwgcCAtIFBQUF9IRFJMRU4sIGxlbiArIFBQUF9IRFJMRU4pOwotfQotCi0vKgotICogcHBwX3NlbmRfY29uZmlnIC0gY29uZmlndXJlIHRoZSB0cmFuc21pdC1zaWRlIGNoYXJhY3RlcmlzdGljcyBvZgotICogdGhlIHBwcCBpbnRlcmZhY2UuICBSZXR1cm5zIC0xLCBpbmRpY2F0aW5nIGFuIGVycm9yLCBpZiB0aGUgY2hhbm5lbAotICogc2VuZF9jb25maWcgcHJvY2VkdXJlIGNhbGxlZCBlcnJvcigpIChvciBpbmNyZW1lbnRlZCBlcnJvcl9jb3VudAotICogaXRzZWxmKSwgb3RoZXJ3aXNlIDAuCi0gKi8KLWludAotcHBwX3NlbmRfY29uZmlnKHVuaXQsIG10dSwgYWNjbSwgcGNvbXAsIGFjY29tcCkKLSAgICBpbnQgdW5pdCwgbXR1OwotICAgIHVfaW50MzJfdCBhY2NtOwotICAgIGludCBwY29tcCwgYWNjb21wOwotewotCWludCBlcnJzOwotCi0JaWYgKHRoZV9jaGFubmVsLT5zZW5kX2NvbmZpZyA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQllcnJzID0gZXJyb3JfY291bnQ7Ci0JKCp0aGVfY2hhbm5lbC0+c2VuZF9jb25maWcpKG10dSwgYWNjbSwgcGNvbXAsIGFjY29tcCk7Ci0JcmV0dXJuIChlcnJvcl9jb3VudCAhPSBlcnJzKT8gLTE6IDA7Ci19Ci0KLS8qCi0gKiBwcHBfcmVjdl9jb25maWcgLSBjb25maWd1cmUgdGhlIHJlY2VpdmUtc2lkZSBjaGFyYWN0ZXJpc3RpY3Mgb2YKLSAqIHRoZSBwcHAgaW50ZXJmYWNlLiAgUmV0dXJucyAtMSwgaW5kaWNhdGluZyBhbiBlcnJvciwgaWYgdGhlIGNoYW5uZWwKLSAqIHJlY3ZfY29uZmlnIHByb2NlZHVyZSBjYWxsZWQgZXJyb3IoKSAob3IgaW5jcmVtZW50ZWQgZXJyb3JfY291bnQKLSAqIGl0c2VsZiksIG90aGVyd2lzZSAwLgotICovCi1pbnQKLXBwcF9yZWN2X2NvbmZpZyh1bml0LCBtcnUsIGFjY20sIHBjb21wLCBhY2NvbXApCi0gICAgaW50IHVuaXQsIG1ydTsKLSAgICB1X2ludDMyX3QgYWNjbTsKLSAgICBpbnQgcGNvbXAsIGFjY29tcDsKLXsKLQlpbnQgZXJyczsKLQotCWlmICh0aGVfY2hhbm5lbC0+cmVjdl9jb25maWcgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JZXJycyA9IGVycm9yX2NvdW50OwotCSgqdGhlX2NoYW5uZWwtPnJlY3ZfY29uZmlnKShtcnUsIGFjY20sIHBjb21wLCBhY2NvbXApOwotCXJldHVybiAoZXJyb3JfY291bnQgIT0gZXJycyk/IC0xOiAwOwotfQotCi0vKgotICogbmV3X3BoYXNlIC0gc2lnbmFsIHRoZSBzdGFydCBvZiBhIG5ldyBwaGFzZSBvZiBwcHBkJ3Mgb3BlcmF0aW9uLgotICovCi12b2lkCi1uZXdfcGhhc2UocCkKLSAgICBpbnQgcDsKLXsKLSAgICBwaGFzZSA9IHA7Ci0gICAgaWYgKG5ld19waGFzZV9ob29rKQotCSgqbmV3X3BoYXNlX2hvb2spKHApOwotICAgIG5vdGlmeShwaGFzZWNoYW5nZSwgcCk7Ci19Ci0KLS8qCi0gKiBkaWUgLSBjbGVhbiB1cCBzdGF0ZSBhbmQgZXhpdCB3aXRoIHRoZSBzcGVjaWZpZWQgc3RhdHVzLgotICovCi12b2lkCi1kaWUoc3RhdHVzKQotICAgIGludCBzdGF0dXM7Ci17Ci0gICAgaWYgKCFkb2luZ19tdWx0aWxpbmsgfHwgbXVsdGlsaW5rX21hc3RlcikKLQlwcmludF9saW5rX3N0YXRzKCk7Ci0gICAgY2xlYW51cCgpOwotICAgIG5vdGlmeShleGl0bm90aWZ5LCBzdGF0dXMpOwotICAgIHN5c2xvZyhMT0dfSU5GTywgIkV4aXQuIik7Ci0gICAgZXhpdChzdGF0dXMpOwotfQotCi0vKgotICogY2xlYW51cCAtIHJlc3RvcmUgYW55dGhpbmcgd2hpY2ggbmVlZHMgdG8gYmUgcmVzdG9yZWQgYmVmb3JlIHdlIGV4aXQKLSAqLwotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1jbGVhbnVwKCkKLXsKLSAgICBzeXNfY2xlYW51cCgpOwotCi0gICAgaWYgKGZkX3BwcCA+PSAwKQotCXRoZV9jaGFubmVsLT5kaXNlc3RhYmxpc2hfcHBwKGRldmZkKTsKLSAgICBpZiAodGhlX2NoYW5uZWwtPmNsZWFudXApCi0JKCp0aGVfY2hhbm5lbC0+Y2xlYW51cCkoKTsKLSAgICByZW1vdmVfcGlkZmlsZXMoKTsKLQotI2lmZGVmIFVTRV9UREIKLSAgICBpZiAocHBwZGIgIT0gTlVMTCkKLQljbGVhbnVwX2RiKCk7Ci0jZW5kaWYKLQotfQotCi12b2lkCi1wcmludF9saW5rX3N0YXRzKCkKLXsKLSAgICAvKgotICAgICAqIFByaW50IGNvbm5lY3QgdGltZSBhbmQgc3RhdGlzdGljcy4KLSAgICAgKi8KLSAgICBpZiAobGlua19zdGF0c192YWxpZCkgewotICAgICAgIGludCB0ID0gKGxpbmtfY29ubmVjdF90aW1lICsgNSkgLyA2OyAgICAvKiAxLzEwdGhzIG9mIG1pbnV0ZXMgKi8KLSAgICAgICBpbmZvKCJDb25uZWN0IHRpbWUgJWQuJWQgbWludXRlcy4iLCB0LzEwLCB0JTEwKTsKLSAgICAgICBpbmZvKCJTZW50ICV1IGJ5dGVzLCByZWNlaXZlZCAldSBieXRlcy4iLAotCSAgICBsaW5rX3N0YXRzLmJ5dGVzX291dCwgbGlua19zdGF0cy5ieXRlc19pbik7Ci0gICAgICAgbGlua19zdGF0c192YWxpZCA9IDA7Ci0gICAgfQotfQotCi0vKgotICogcmVzZXRfbGlua19zdGF0cyAtICJyZXNldCIgc3RhdHMgd2hlbiBsaW5rIGdvZXMgdXAuCi0gKi8KLXZvaWQKLXJlc2V0X2xpbmtfc3RhdHModSkKLSAgICBpbnQgdTsKLXsKLSAgICBpZiAoIWdldF9wcHBfc3RhdHModSwgJm9sZF9saW5rX3N0YXRzKSkKLQlyZXR1cm47Ci0gICAgZ2V0dGltZW9mZGF5KCZzdGFydF90aW1lLCBOVUxMKTsKLX0KLQotLyoKLSAqIHVwZGF0ZV9saW5rX3N0YXRzIC0gZ2V0IHN0YXRzIGF0IGxpbmsgdGVybWluYXRpb24uCi0gKi8KLXZvaWQKLXVwZGF0ZV9saW5rX3N0YXRzKHUpCi0gICAgaW50IHU7Ci17Ci0gICAgc3RydWN0IHRpbWV2YWwgbm93OwotICAgIGNoYXIgbnVtYnVmWzMyXTsKLQotICAgIGlmICghZ2V0X3BwcF9zdGF0cyh1LCAmbGlua19zdGF0cykKLQl8fCBnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCkgPCAwKQotCXJldHVybjsKLSAgICBsaW5rX2Nvbm5lY3RfdGltZSA9IG5vdy50dl9zZWMgLSBzdGFydF90aW1lLnR2X3NlYzsKLSAgICBsaW5rX3N0YXRzX3ZhbGlkID0gMTsKLQotICAgIGxpbmtfc3RhdHMuYnl0ZXNfaW4gIC09IG9sZF9saW5rX3N0YXRzLmJ5dGVzX2luOwotICAgIGxpbmtfc3RhdHMuYnl0ZXNfb3V0IC09IG9sZF9saW5rX3N0YXRzLmJ5dGVzX291dDsKLSAgICBsaW5rX3N0YXRzLnBrdHNfaW4gICAtPSBvbGRfbGlua19zdGF0cy5wa3RzX2luOwotICAgIGxpbmtfc3RhdHMucGt0c19vdXQgIC09IG9sZF9saW5rX3N0YXRzLnBrdHNfb3V0OwotCi0gICAgc2xwcmludGYobnVtYnVmLCBzaXplb2YobnVtYnVmKSwgIiV1IiwgbGlua19jb25uZWN0X3RpbWUpOwotICAgIHNjcmlwdF9zZXRlbnYoIkNPTk5FQ1RfVElNRSIsIG51bWJ1ZiwgMCk7Ci0gICAgc2xwcmludGYobnVtYnVmLCBzaXplb2YobnVtYnVmKSwgIiV1IiwgbGlua19zdGF0cy5ieXRlc19vdXQpOwotICAgIHNjcmlwdF9zZXRlbnYoIkJZVEVTX1NFTlQiLCBudW1idWYsIDApOwotICAgIHNscHJpbnRmKG51bWJ1Ziwgc2l6ZW9mKG51bWJ1ZiksICIldSIsIGxpbmtfc3RhdHMuYnl0ZXNfaW4pOwotICAgIHNjcmlwdF9zZXRlbnYoIkJZVEVTX1JDVkQiLCBudW1idWYsIDApOwotfQotCi0KLXN0cnVjdAljYWxsb3V0IHsKLSAgICBzdHJ1Y3QgdGltZXZhbAljX3RpbWU7CQkvKiB0aW1lIGF0IHdoaWNoIHRvIGNhbGwgcm91dGluZSAqLwotICAgIHZvaWQJCSpjX2FyZzsJCS8qIGFyZ3VtZW50IHRvIHJvdXRpbmUgKi8KLSAgICB2b2lkCQkoKmNfZnVuYykgX19QKCh2b2lkICopKTsgLyogcm91dGluZSAqLwotICAgIHN0cnVjdAkJY2FsbG91dCAqY19uZXh0OwotfTsKLQotc3RhdGljIHN0cnVjdCBjYWxsb3V0ICpjYWxsb3V0ID0gTlVMTDsJLyogQ2FsbG91dCBsaXN0ICovCi1zdGF0aWMgc3RydWN0IHRpbWV2YWwgdGltZW5vdzsJCS8qIEN1cnJlbnQgdGltZSAqLwotCi0vKgotICogdGltZW91dCAtIFNjaGVkdWxlIGEgdGltZW91dC4KLSAqLwotdm9pZAotdGltZW91dChmdW5jLCBhcmcsIHNlY3MsIHVzZWNzKQotICAgIHZvaWQgKCpmdW5jKSBfX1AoKHZvaWQgKikpOwotICAgIHZvaWQgKmFyZzsKLSAgICBpbnQgc2VjcywgdXNlY3M7Ci17Ci0gICAgc3RydWN0IGNhbGxvdXQgKm5ld3AsICpwLCAqKnBwOwotCi0gICAgLyoKLSAgICAgKiBBbGxvY2F0ZSB0aW1lb3V0LgotICAgICAqLwotICAgIGlmICgobmV3cCA9IChzdHJ1Y3QgY2FsbG91dCAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBjYWxsb3V0KSkpID09IE5VTEwpCi0JZmF0YWwoIk91dCBvZiBtZW1vcnkgaW4gdGltZW91dCgpISIpOwotICAgIG5ld3AtPmNfYXJnID0gYXJnOwotICAgIG5ld3AtPmNfZnVuYyA9IGZ1bmM7Ci0gICAgZ2V0dGltZW9mZGF5KCZ0aW1lbm93LCBOVUxMKTsKLSAgICBuZXdwLT5jX3RpbWUudHZfc2VjID0gdGltZW5vdy50dl9zZWMgKyBzZWNzOwotICAgIG5ld3AtPmNfdGltZS50dl91c2VjID0gdGltZW5vdy50dl91c2VjICsgdXNlY3M7Ci0gICAgaWYgKG5ld3AtPmNfdGltZS50dl91c2VjID49IDEwMDAwMDApIHsKLQluZXdwLT5jX3RpbWUudHZfc2VjICs9IG5ld3AtPmNfdGltZS50dl91c2VjIC8gMTAwMDAwMDsKLQluZXdwLT5jX3RpbWUudHZfdXNlYyAlPSAxMDAwMDAwOwotICAgIH0KLQotICAgIC8qCi0gICAgICogRmluZCBjb3JyZWN0IHBsYWNlIGFuZCBsaW5rIGl0IGluLgotICAgICAqLwotICAgIGZvciAocHAgPSAmY2FsbG91dDsgKHAgPSAqcHApOyBwcCA9ICZwLT5jX25leHQpCi0JaWYgKG5ld3AtPmNfdGltZS50dl9zZWMgPCBwLT5jX3RpbWUudHZfc2VjCi0JICAgIHx8IChuZXdwLT5jX3RpbWUudHZfc2VjID09IHAtPmNfdGltZS50dl9zZWMKLQkJJiYgbmV3cC0+Y190aW1lLnR2X3VzZWMgPCBwLT5jX3RpbWUudHZfdXNlYykpCi0JICAgIGJyZWFrOwotICAgIG5ld3AtPmNfbmV4dCA9IHA7Ci0gICAgKnBwID0gbmV3cDsKLX0KLQotCi0vKgotICogdW50aW1lb3V0IC0gVW5zY2hlZHVsZSBhIHRpbWVvdXQuCi0gKi8KLXZvaWQKLXVudGltZW91dChmdW5jLCBhcmcpCi0gICAgdm9pZCAoKmZ1bmMpIF9fUCgodm9pZCAqKSk7Ci0gICAgdm9pZCAqYXJnOwotewotICAgIHN0cnVjdCBjYWxsb3V0ICoqY29wcCwgKmZyZWVwOwotCi0gICAgLyoKLSAgICAgKiBGaW5kIGZpcnN0IG1hdGNoaW5nIHRpbWVvdXQgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0LgotICAgICAqLwotICAgIGZvciAoY29wcCA9ICZjYWxsb3V0OyAoZnJlZXAgPSAqY29wcCk7IGNvcHAgPSAmZnJlZXAtPmNfbmV4dCkKLQlpZiAoZnJlZXAtPmNfZnVuYyA9PSBmdW5jICYmIGZyZWVwLT5jX2FyZyA9PSBhcmcpIHsKLQkgICAgKmNvcHAgPSBmcmVlcC0+Y19uZXh0OwotCSAgICBmcmVlKChjaGFyICopIGZyZWVwKTsKLQkgICAgYnJlYWs7Ci0JfQotfQotCi0KLS8qCi0gKiBjYWxsdGltZW91dCAtIENhbGwgYW55IHRpbWVvdXQgcm91dGluZXMgd2hpY2ggYXJlIG5vdyBkdWUuCi0gKi8KLXN0YXRpYyB2b2lkCi1jYWxsdGltZW91dCgpCi17Ci0gICAgc3RydWN0IGNhbGxvdXQgKnA7Ci0KLSAgICB3aGlsZSAoY2FsbG91dCAhPSBOVUxMKSB7Ci0JcCA9IGNhbGxvdXQ7Ci0KLQlpZiAoZ2V0dGltZW9mZGF5KCZ0aW1lbm93LCBOVUxMKSA8IDApCi0JICAgIGZhdGFsKCJGYWlsZWQgdG8gZ2V0IHRpbWUgb2YgZGF5OiAlbSIpOwotCWlmICghKHAtPmNfdGltZS50dl9zZWMgPCB0aW1lbm93LnR2X3NlYwotCSAgICAgIHx8IChwLT5jX3RpbWUudHZfc2VjID09IHRpbWVub3cudHZfc2VjCi0JCSAgJiYgcC0+Y190aW1lLnR2X3VzZWMgPD0gdGltZW5vdy50dl91c2VjKSkpCi0JICAgIGJyZWFrOwkJLyogbm8sIGl0J3Mgbm90IHRpbWUgeWV0ICovCi0KLQljYWxsb3V0ID0gcC0+Y19uZXh0OwotCSgqcC0+Y19mdW5jKShwLT5jX2FyZyk7Ci0KLQlmcmVlKChjaGFyICopIHApOwotICAgIH0KLX0KLQotCi0vKgotICogdGltZWxlZnQgLSByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aW1lIHVudGlsIHRoZSBuZXh0IHRpbWVvdXQgaXMgZHVlLgotICovCi1zdGF0aWMgc3RydWN0IHRpbWV2YWwgKgotdGltZWxlZnQodHZwKQotICAgIHN0cnVjdCB0aW1ldmFsICp0dnA7Ci17Ci0gICAgaWYgKGNhbGxvdXQgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLQotICAgIGdldHRpbWVvZmRheSgmdGltZW5vdywgTlVMTCk7Ci0gICAgdHZwLT50dl9zZWMgPSBjYWxsb3V0LT5jX3RpbWUudHZfc2VjIC0gdGltZW5vdy50dl9zZWM7Ci0gICAgdHZwLT50dl91c2VjID0gY2FsbG91dC0+Y190aW1lLnR2X3VzZWMgLSB0aW1lbm93LnR2X3VzZWM7Ci0gICAgaWYgKHR2cC0+dHZfdXNlYyA8IDApIHsKLQl0dnAtPnR2X3VzZWMgKz0gMTAwMDAwMDsKLQl0dnAtPnR2X3NlYyAtPSAxOwotICAgIH0KLSAgICBpZiAodHZwLT50dl9zZWMgPCAwKQotCXR2cC0+dHZfc2VjID0gdHZwLT50dl91c2VjID0gMDsKLQotICAgIHJldHVybiB0dnA7Ci19Ci0KLQotLyoKLSAqIGtpbGxfbXlfcGcgLSBzZW5kIGEgc2lnbmFsIHRvIG91ciBwcm9jZXNzIGdyb3VwLCBhbmQgaWdub3JlIGl0IG91cnNlbHZlcy4KLSAqIFdlIGFzc3VtZSB0aGF0IHNpZyBpcyBjdXJyZW50bHkgYmxvY2tlZC4KLSAqLwotc3RhdGljIHZvaWQKLWtpbGxfbXlfcGcoc2lnKQotICAgIGludCBzaWc7Ci17Ci0gICAgc3RydWN0IHNpZ2FjdGlvbiBhY3QsIG9sZGFjdDsKLSAgICBzdHJ1Y3Qgc3VicHJvY2VzcyAqY2hwOwotCi0gICAgaWYgKCFkZXRhY2hlZCkgewotCS8qCi0JICogVGhlcmUgbWlnaHQgYmUgb3RoZXIgdGhpbmdzIGluIG91ciBwcm9jZXNzIGdyb3VwIHRoYXQgd2UKLQkgKiBkaWRuJ3Qgc3RhcnQgdGhhdCB3b3VsZCBnZXQgaGl0IGlmIHdlIGRpZCBhIGtpbGwoMCksIHNvCi0JICoganVzdCBzZW5kIHRoZSBzaWduYWwgaW5kaXZpZHVhbGx5IHRvIG91ciBjaGlsZHJlbi4KLQkgKi8KLQlmb3IgKGNocCA9IGNoaWxkcmVuOyBjaHAgIT0gTlVMTDsgY2hwID0gY2hwLT5uZXh0KQotCSAgICBpZiAoY2hwLT5raWxsYWJsZSkKLQkJa2lsbChjaHAtPnBpZCwgc2lnKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgLyogV2UndmUgZG9uZSBhIHNldHNpZCgpLCBzbyB3ZSBjYW4ganVzdCB1c2UgYSBraWxsKDApICovCi0gICAgc2lnZW1wdHlzZXQoJmFjdC5zYV9tYXNrKTsJCS8qIHVubmVjZXNzYXJ5IGluIGZhY3QgKi8KLSAgICBhY3Quc2FfaGFuZGxlciA9IFNJR19JR047Ci0gICAgYWN0LnNhX2ZsYWdzID0gMDsKLSAgICBraWxsKDAsIHNpZyk7Ci0gICAgLyoKLSAgICAgKiBUaGUga2lsbCgpIGFib3ZlIG1hZGUgdGhlIHNpZ25hbCBwZW5kaW5nIGZvciB1cywgYXMgd2VsbCBhcwotICAgICAqIHRoZSByZXN0IG9mIG91ciBwcm9jZXNzIGdyb3VwLCBidXQgd2UgZG9uJ3Qgd2FudCBpdCBkZWxpdmVyZWQKLSAgICAgKiB0byB1cy4gIEl0IGlzIGJsb2NrZWQgYXQgdGhlIG1vbWVudC4gIFNldHRpbmcgaXQgdG8gYmUgaWdub3JlZAotICAgICAqIHdpbGwgY2F1c2UgdGhlIHBlbmRpbmcgc2lnbmFsIHRvIGJlIGRpc2NhcmRlZC4gIElmIHdlIGRpZCB0aGUKLSAgICAgKiBraWxsKCkgYWZ0ZXIgc2V0dGluZyB0aGUgc2lnbmFsIHRvIGJlIGlnbm9yZWQsIGl0IGlzIHVuc3BlY2lmaWVkCi0gICAgICogKGJ5IFBPU0lYKSB3aGV0aGVyIHRoZSBzaWduYWwgaXMgaW1tZWRpYXRlbHkgZGlzY2FyZGVkIG9yIGxlZnQKLSAgICAgKiBwZW5kaW5nLCBhbmQgaW4gZmFjdCBMaW51eCB3b3VsZCBsZWF2ZSBpdCBwZW5kaW5nLCBhbmQgc28gaXQKLSAgICAgKiB3b3VsZCBiZSBkZWxpdmVyZWQgYWZ0ZXIgdGhlIGN1cnJlbnQgc2lnbmFsIGhhbmRsZXIgZXhpdHMsCi0gICAgICogbGVhZGluZyB0byBhbiBpbmZpbml0ZSBsb29wLgotICAgICAqLwotICAgIHNpZ2FjdGlvbihzaWcsICZhY3QsICZvbGRhY3QpOwotICAgIHNpZ2FjdGlvbihzaWcsICZvbGRhY3QsIE5VTEwpOwotfQotCi0KLS8qCi0gKiBodXAgLSBDYXRjaCBTSUdIVVAgc2lnbmFsLgotICoKLSAqIEluZGljYXRlcyB0aGF0IHRoZSBwaHlzaWNhbCBsYXllciBoYXMgYmVlbiBkaXNjb25uZWN0ZWQuCi0gKiBXZSBkb24ndCByZWx5IG9uIHRoaXMgaW5kaWNhdGlvbjsgaWYgdGhlIHVzZXIgaGFzIHNlbnQgdGhpcwotICogc2lnbmFsLCB3ZSBqdXN0IHRha2UgdGhlIGxpbmsgZG93bi4KLSAqLwotc3RhdGljIHZvaWQKLWh1cChzaWcpCi0gICAgaW50IHNpZzsKLXsKLSAgICAvKiBjYW4ndCBsb2cgYSBtZXNzYWdlIGhlcmUsIGl0IGNhbiBkZWFkbG9jayAqLwotICAgIGdvdF9zaWdodXAgPSAxOwotICAgIGlmIChjb25uX3J1bm5pbmcpCi0JLyogU2VuZCB0aGUgc2lnbmFsIHRvIHRoZSBbZGlzXWNvbm5lY3RvciBwcm9jZXNzKGVzKSBhbHNvICovCi0Ja2lsbF9teV9wZyhzaWcpOwotICAgIG5vdGlmeShzaWdyZWNlaXZlZCwgc2lnKTsKLSAgICBpZiAod2FpdGluZykKLQlzaWdsb25nam1wKHNpZ2ptcCwgMSk7Ci19Ci0KLQotLyoKLSAqIHRlcm0gLSBDYXRjaCBTSUdURVJNIHNpZ25hbCBhbmQgU0lHSU5UIHNpZ25hbCAoXkMvZGVsKS4KLSAqCi0gKiBJbmRpY2F0ZXMgdGhhdCB3ZSBzaG91bGQgaW5pdGlhdGUgYSBncmFjZWZ1bCBkaXNjb25uZWN0IGFuZCBleGl0LgotICovCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi10ZXJtKHNpZykKLSAgICBpbnQgc2lnOwotewotICAgIC8qIGNhbid0IGxvZyBhIG1lc3NhZ2UgaGVyZSwgaXQgY2FuIGRlYWRsb2NrICovCi0gICAgZ290X3NpZ3Rlcm0gPSBzaWc7Ci0gICAgaWYgKGNvbm5fcnVubmluZykKLQkvKiBTZW5kIHRoZSBzaWduYWwgdG8gdGhlIFtkaXNdY29ubmVjdG9yIHByb2Nlc3MoZXMpIGFsc28gKi8KLQlraWxsX215X3BnKHNpZyk7Ci0gICAgbm90aWZ5KHNpZ3JlY2VpdmVkLCBzaWcpOwotICAgIGlmICh3YWl0aW5nKQotCXNpZ2xvbmdqbXAoc2lnam1wLCAxKTsKLX0KLQotCi0vKgotICogY2hsZCAtIENhdGNoIFNJR0NITEQgc2lnbmFsLgotICogU2V0cyBhIGZsYWcgc28gd2Ugd2lsbCBjYWxsIHJlYXBfa2lkcyBpbiB0aGUgbWFpbmxpbmUuCi0gKi8KLXN0YXRpYyB2b2lkCi1jaGxkKHNpZykKLSAgICBpbnQgc2lnOwotewotICAgIGdvdF9zaWdjaGxkID0gMTsKLSAgICBpZiAod2FpdGluZykKLQlzaWdsb25nam1wKHNpZ2ptcCwgMSk7Ci19Ci0KLQotLyoKLSAqIHRvZ2dsZV9kZWJ1ZyAtIENhdGNoIFNJR1VTUjEgc2lnbmFsLgotICoKLSAqIFRvZ2dsZSBkZWJ1ZyBmbGFnLgotICovCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi10b2dnbGVfZGVidWcoc2lnKQotICAgIGludCBzaWc7Ci17Ci0gICAgZGVidWcgPSAhZGVidWc7Ci0gICAgaWYgKGRlYnVnKSB7Ci0Jc2V0bG9nbWFzayhMT0dfVVBUTyhMT0dfREVCVUcpKTsKLSAgICB9IGVsc2UgewotCXNldGxvZ21hc2soTE9HX1VQVE8oTE9HX1dBUk5JTkcpKTsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIG9wZW5fY2NwIC0gQ2F0Y2ggU0lHVVNSMiBzaWduYWwuCi0gKgotICogVHJ5IHRvIChyZSluZWdvdGlhdGUgY29tcHJlc3Npb24uCi0gKi8KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLW9wZW5fY2NwKHNpZykKLSAgICBpbnQgc2lnOwotewotICAgIGdvdF9zaWd1c3IyID0gMTsKLSAgICBpZiAod2FpdGluZykKLQlzaWdsb25nam1wKHNpZ2ptcCwgMSk7Ci19Ci0KLQotLyoKLSAqIGJhZF9zaWduYWwgLSBXZSd2ZSBjYXVnaHQgYSBmYXRhbCBzaWduYWwuICBDbGVhbiB1cCBzdGF0ZSBhbmQgZXhpdC4KLSAqLwotc3RhdGljIHZvaWQKLWJhZF9zaWduYWwoc2lnKQotICAgIGludCBzaWc7Ci17Ci0gICAgc3RhdGljIGludCBjcmFzaGVkID0gMDsKLQotICAgIGlmIChjcmFzaGVkKQotCV9leGl0KDEyNyk7Ci0gICAgY3Jhc2hlZCA9IDE7Ci0gICAgZXJyb3IoIkZhdGFsIHNpZ25hbCAlZCIsIHNpZyk7Ci0gICAgaWYgKGNvbm5fcnVubmluZykKLQlraWxsX215X3BnKFNJR1RFUk0pOwotICAgIG5vdGlmeShzaWdyZWNlaXZlZCwgc2lnKTsKLSAgICBkaWUoMTI3KTsKLX0KLQotLyoKLSAqIHNhZmVfZm9yayAtIENyZWF0ZSBhIGNoaWxkIHByb2Nlc3MuICBUaGUgY2hpbGQgY2xvc2VzIGFsbCB0aGUKLSAqIGZpbGUgZGVzY3JpcHRvcnMgdGhhdCB3ZSBkb24ndCB3YW50IHRvIGxlYWsgdG8gYSBzY3JpcHQuCi0gKiBUaGUgcGFyZW50IHdhaXRzIGZvciB0aGUgY2hpbGQgdG8gZG8gdGhpcyBiZWZvcmUgcmV0dXJuaW5nLgotICogVGhpcyBhbHNvIGFycmFuZ2VzIGZvciB0aGUgc3BlY2lmaWVkIGZkcyB0byBiZSBkdXAnZCB0bwotICogZmRzIDAsIDEsIDIgaW4gdGhlIGNoaWxkLgotICovCi1waWRfdAotc2FmZV9mb3JrKGludCBpbmZkLCBpbnQgb3V0ZmQsIGludCBlcnJmZCkKLXsKLQlwaWRfdCBwaWQ7Ci0JaW50IGZkLCBwaXBlZmRbMl07Ci0JY2hhciBidWZbMV07Ci0KLQkvKiBtYWtlIHN1cmUgZmRzIDAsIDEsIDIgYXJlIG9jY3VwaWVkIChwcm9iYWJseSBub3QgbmVjZXNzYXJ5KSAqLwotCXdoaWxlICgoZmQgPSBkdXAoZmRfZGV2bnVsbCkpID49IDApIHsKLQkJaWYgKGZkID4gMikgewotCQkJY2xvc2UoZmQpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAocGlwZShwaXBlZmQpID09IC0xKQotCQlwaXBlZmRbMF0gPSBwaXBlZmRbMV0gPSAtMTsKLQlwaWQgPSBmb3JrKCk7Ci0JaWYgKHBpZCA8IDApIHsKLQkJZXJyb3IoImZvcmsgZmFpbGVkOiAlbSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChwaWQgPiAwKSB7Ci0JCS8qIHBhcmVudCAqLwotCQljbG9zZShwaXBlZmRbMV0pOwotCQkvKiB0aGlzIHJlYWQoKSBibG9ja3MgdW50aWwgdGhlIGNsb3NlKHBpcGVmZFsxXSkgYmVsb3cgKi8KLQkJY29tcGxldGVfcmVhZChwaXBlZmRbMF0sIGJ1ZiwgMSk7Ci0JCWNsb3NlKHBpcGVmZFswXSk7Ci0JCXJldHVybiBwaWQ7Ci0JfQotCi0JLyogRXhlY3V0aW5nIGluIHRoZSBjaGlsZCAqLwotCXN5c19jbG9zZSgpOwotI2lmZGVmIFVTRV9UREIKLQl0ZGJfY2xvc2UocHBwZGIpOwotI2VuZGlmCi0KLQkvKiBtYWtlIHN1cmUgaW5mZCwgb3V0ZmQgYW5kIGVycmZkIHdvbid0IGdldCB0cm9tcGVkIG9uIGJlbG93ICovCi0JaWYgKGluZmQgPT0gMSB8fCBpbmZkID09IDIpCi0JCWluZmQgPSBkdXAoaW5mZCk7Ci0JaWYgKG91dGZkID09IDAgfHwgb3V0ZmQgPT0gMikKLQkJb3V0ZmQgPSBkdXAob3V0ZmQpOwotCWlmIChlcnJmZCA9PSAwIHx8IGVycmZkID09IDEpCi0JCWVycmZkID0gZHVwKGVycmZkKTsKLQotCWNsb3NlbG9nKCk7Ci0KLQkvKiBkdXAgdGhlIGluLCBvdXQsIGVyciBmZHMgdG8gMCwgMSwgMiAqLwotCWlmIChpbmZkICE9IDApCi0JCWR1cDIoaW5mZCwgMCk7Ci0JaWYgKG91dGZkICE9IDEpCi0JCWR1cDIob3V0ZmQsIDEpOwotCWlmIChlcnJmZCAhPSAyKQotCQlkdXAyKGVycmZkLCAyKTsKLQotCWlmIChsb2dfdG9fZmQgPiAyKQotCQljbG9zZShsb2dfdG9fZmQpOwotCWlmICh0aGVfY2hhbm5lbC0+Y2xvc2UpCi0JCSgqdGhlX2NoYW5uZWwtPmNsb3NlKSgpOwotCWVsc2UKLQkJY2xvc2UoZGV2ZmQpOwkvKiBzb21lIHBsdWdpbnMgZG9uJ3QgaGF2ZSBhIGNsb3NlIGZ1bmN0aW9uICovCi0JY2xvc2UoZmRfcHBwKTsKLQljbG9zZShmZF9kZXZudWxsKTsKLQlpZiAoaW5mZCAhPSAwKQotCQljbG9zZShpbmZkKTsKLQlpZiAob3V0ZmQgIT0gMSkKLQkJY2xvc2Uob3V0ZmQpOwotCWlmIChlcnJmZCAhPSAyKQotCQljbG9zZShlcnJmZCk7Ci0KLQlub3RpZnkoZm9ya19ub3RpZmllciwgMCk7Ci0JY2xvc2UocGlwZWZkWzBdKTsKLQkvKiB0aGlzIGNsb3NlIHVuYmxvY2tzIHRoZSByZWFkKCkgY2FsbCBhYm92ZSBpbiB0aGUgcGFyZW50ICovCi0JY2xvc2UocGlwZWZkWzFdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbAotYWRkX3NjcmlwdF9lbnYocG9zLCBuZXdzdHJpbmcpCi0gICAgaW50IHBvczsKLSAgICBjaGFyICpuZXdzdHJpbmc7Ci17Ci0gICAgaWYgKHBvcyArIDEgPj0gc19lbnZfbmFsbG9jKSB7Ci0JaW50IG5ld19uID0gcG9zICsgMTc7Ci0JY2hhciAqKm5ld2VudiA9IHJlYWxsb2Moc2NyaXB0X2VudiwgbmV3X24gKiBzaXplb2YoY2hhciAqKSk7Ci0JaWYgKG5ld2VudiA9PSBOVUxMKSB7Ci0JICAgIGZyZWUobmV3c3RyaW5nIC0gMSk7Ci0JICAgIHJldHVybiAwOwotCX0KLQlzY3JpcHRfZW52ID0gbmV3ZW52OwotCXNfZW52X25hbGxvYyA9IG5ld19uOwotICAgIH0KLSAgICBzY3JpcHRfZW52W3Bvc10gPSBuZXdzdHJpbmc7Ci0gICAgc2NyaXB0X2Vudltwb3MgKyAxXSA9IE5VTEw7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZW1vdmVfc2NyaXB0X2Vudihwb3MpCi0gICAgaW50IHBvczsKLXsKLSAgICBmcmVlKHNjcmlwdF9lbnZbcG9zXSAtIDEpOwotICAgIHdoaWxlICgoc2NyaXB0X2Vudltwb3NdID0gc2NyaXB0X2Vudltwb3MgKyAxXSkgIT0gTlVMTCkKLQlwb3MrKzsKLX0KLQotLyoKLSAqIHVwZGF0ZV9zeXN0ZW1fZW52aXJvbm1lbnQgLSBwcm9jZXNzIHRoZSBsaXN0IG9mIHNldC91bnNldCBvcHRpb25zCi0gKiBhbmQgdXBkYXRlIHRoZSBzeXN0ZW0gZW52aXJvbm1lbnQuCi0gKi8KLXN0YXRpYyB2b2lkCi11cGRhdGVfc3lzdGVtX2Vudmlyb25tZW50KCkKLXsKLSAgICBzdHJ1Y3QgdXNlcmVudiAqdWVwOwotCi0gICAgZm9yICh1ZXAgPSB1c2VyZW52X2xpc3Q7IHVlcCAhPSBOVUxMOyB1ZXAgPSB1ZXAtPnVlX25leHQpIHsKLQlpZiAodWVwLT51ZV9pc3NldCkKLQkgICAgc2V0ZW52KHVlcC0+dWVfbmFtZSwgdWVwLT51ZV92YWx1ZSwgMSk7Ci0JZWxzZQotCSAgICB1bnNldGVudih1ZXAtPnVlX25hbWUpOwotICAgIH0KLX0KLQotLyoKLSAqIGRldmljZV9zY3JpcHQgLSBydW4gYSBwcm9ncmFtIHRvIHRhbGsgdG8gdGhlIHNwZWNpZmllZCBmZHMKLSAqIChlLmcuIHRvIHJ1biB0aGUgY29ubmVjdG9yIG9yIGRpc2Nvbm5lY3RvciBzY3JpcHQpLgotICogc3RkZXJyIGdldHMgY29ubmVjdGVkIHRvIHRoZSBsb2cgZmQgb3IgdG8gdGhlIF9QQVRIX0NPTk5FUlJTIGZpbGUuCi0gKi8KLWludAotZGV2aWNlX3NjcmlwdChwcm9ncmFtLCBpbiwgb3V0LCBkb250X3dhaXQpCi0gICAgY2hhciAqcHJvZ3JhbTsKLSAgICBpbnQgaW4sIG91dDsKLSAgICBpbnQgZG9udF93YWl0OwotewotICAgIGludCBwaWQ7Ci0gICAgaW50IHN0YXR1cyA9IC0xOwotICAgIGludCBlcnJmZDsKLQotICAgIGlmIChsb2dfdG9fZmQgPj0gMCkKLQllcnJmZCA9IGxvZ190b19mZDsKLSAgICBlbHNlCi0JZXJyZmQgPSBvcGVuKF9QQVRIX0NPTk5FUlJTLCBPX1dST05MWSB8IE9fQVBQRU5EIHwgT19DUkVBVCwgMDYwMCk7Ci0KLSAgICArK2Nvbm5fcnVubmluZzsKLSAgICBwaWQgPSBzYWZlX2ZvcmsoaW4sIG91dCwgZXJyZmQpOwotCi0gICAgaWYgKHBpZCAhPSAwICYmIGxvZ190b19mZCA8IDApCi0JY2xvc2UoZXJyZmQpOwotCi0gICAgaWYgKHBpZCA8IDApIHsKLQktLWNvbm5fcnVubmluZzsKLQllcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBjaGlsZCBwcm9jZXNzOiAlbSIpOwotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpZiAocGlkICE9IDApIHsKLQlyZWNvcmRfY2hpbGQocGlkLCBwcm9ncmFtLCBOVUxMLCBOVUxMLCAxKTsKLQlzdGF0dXMgPSAwOwotCWlmICghZG9udF93YWl0KSB7Ci0JICAgIHdoaWxlICh3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCkgPCAwKSB7Ci0JCWlmIChlcnJubyA9PSBFSU5UUikKLQkJICAgIGNvbnRpbnVlOwotCQlmYXRhbCgiZXJyb3Igd2FpdGluZyBmb3IgKGRpcyljb25uZWN0aW9uIHByb2Nlc3M6ICVtIik7Ci0JICAgIH0KLQkgICAgZm9yZ2V0X2NoaWxkKHBpZCwgc3RhdHVzKTsKLQkgICAgLS1jb25uX3J1bm5pbmc7Ci0JfQotCXJldHVybiAoc3RhdHVzID09IDAgPyAwIDogLTEpOwotICAgIH0KLQotICAgIC8qIGhlcmUgd2UgYXJlIGV4ZWN1dGluZyBpbiB0aGUgY2hpbGQgKi8KLQotICAgIHNldGdpZChnZXRnaWQoKSk7Ci0gICAgaWYgKHNldHVpZCh1aWQpIDwgMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInBwcGQ6IHNldHVpZCBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICB1cGRhdGVfc3lzdGVtX2Vudmlyb25tZW50KCk7Ci0jaWYgZGVmaW5lZChfX0FORFJPSURfXykKLSAgICBleGVjbCgiL3N5c3RlbS9iaW4vc2giLCAic2giLCAiLWMiLCBwcm9ncmFtLCBOVUxMKTsKLSNlbHNlCi0gICAgZXhlY2woIi9iaW4vc2giLCAic2giLCAiLWMiLCBwcm9ncmFtLCAoY2hhciAqKTApOwotI2VuZGlmCi0gICAgcGVycm9yKCJwcHBkOiBjb3VsZCBub3QgZXhlYyAvYmluL3NoIik7Ci0gICAgX2V4aXQoOTkpOwotICAgIC8qIE5PVFJFQUNIRUQgKi8KLX0KLQotCi0vKgotICogdXBkYXRlX3NjcmlwdF9lbnZpcm9ubWVudCAtIHByb2Nlc3MgdGhlIGxpc3Qgb2Ygc2V0L3Vuc2V0IG9wdGlvbnMKLSAqIGFuZCB1cGRhdGUgdGhlIHNjcmlwdCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3ZSBpbnRlbnRpb25hbGx5IGRvCi0gKiBub3QgdXBkYXRlIHRoZSBUREIuICBUaGVzZSBjaGFuZ2VzIGFyZSBsYXllcmVkIG9uIHRvcCByaWdodCBiZWZvcmUKLSAqIGV4ZWMuICBJdCBpcyBub3QgcG9zc2libGUgdG8gdXNlIHNjcmlwdF9zZXRlbnYoKSBvcgotICogc2NyaXB0X3Vuc2V0ZW52KCkgc2FmZWx5IGFmdGVyIHRoaXMgcm91dGluZSBpcyBydW4uCi0gKi8KLXN0YXRpYyB2b2lkCi11cGRhdGVfc2NyaXB0X2Vudmlyb25tZW50KCkKLXsKLSAgICBzdHJ1Y3QgdXNlcmVudiAqdWVwOwotCi0gICAgZm9yICh1ZXAgPSB1c2VyZW52X2xpc3Q7IHVlcCAhPSBOVUxMOyB1ZXAgPSB1ZXAtPnVlX25leHQpIHsKLQlpbnQgaTsKLQljaGFyICpwLCAqbmV3c3RyaW5nOwotCWludCBubGVuID0gc3RybGVuKHVlcC0+dWVfbmFtZSk7Ci0KLQlmb3IgKGkgPSAwOyAocCA9IHNjcmlwdF9lbnZbaV0pICE9IE5VTEw7IGkrKykgewotCSAgICBpZiAoc3RybmNtcChwLCB1ZXAtPnVlX25hbWUsIG5sZW4pID09IDAgJiYgcFtubGVuXSA9PSAnPScpCi0JCWJyZWFrOwotCX0KLQlpZiAodWVwLT51ZV9pc3NldCkgewotCSAgICBubGVuICs9IHN0cmxlbih1ZXAtPnVlX3ZhbHVlKSArIDI7Ci0JICAgIG5ld3N0cmluZyA9IG1hbGxvYyhubGVuICsgMSk7Ci0JICAgIGlmIChuZXdzdHJpbmcgPT0gTlVMTCkKLQkJY29udGludWU7Ci0JICAgICpuZXdzdHJpbmcrKyA9IDA7Ci0JICAgIHNscHJpbnRmKG5ld3N0cmluZywgbmxlbiwgIiVzPSVzIiwgdWVwLT51ZV9uYW1lLCB1ZXAtPnVlX3ZhbHVlKTsKLQkgICAgaWYgKHAgIT0gTlVMTCkKLQkJc2NyaXB0X2VudltpXSA9IG5ld3N0cmluZzsKLQkgICAgZWxzZQotCQlhZGRfc2NyaXB0X2VudihpLCBuZXdzdHJpbmcpOwotCX0gZWxzZSB7Ci0JICAgIHJlbW92ZV9zY3JpcHRfZW52KGkpOwotCX0KLSAgICB9Ci19Ci0KLS8qCi0gKiBydW5fcHJvZ3JhbSAtIGV4ZWN1dGUgYSBwcm9ncmFtIHdpdGggZ2l2ZW4gYXJndW1lbnRzLAotICogYnV0IGRvbid0IHdhaXQgZm9yIGl0IHVubGVzcyB3YWl0IGlzIG5vbi16ZXJvLgotICogSWYgdGhlIHByb2dyYW0gY2FuJ3QgYmUgZXhlY3V0ZWQsIGxvZ3MgYW4gZXJyb3IgdW5sZXNzCi0gKiBtdXN0X2V4aXN0IGlzIDAgYW5kIHRoZSBwcm9ncmFtIGZpbGUgZG9lc24ndCBleGlzdC4KLSAqIFJldHVybnMgLTEgaWYgaXQgY291bGRuJ3QgZm9yaywgMCBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0Ci0gKiBvciBpc24ndCBhbiBleGVjdXRhYmxlIHBsYWluIGZpbGUsIG9yIHRoZSBwcm9jZXNzIElEIG9mIHRoZSBjaGlsZC4KLSAqIElmIGRvbmUgIT0gTlVMTCwgKCpkb25lKShhcmcpIHdpbGwgYmUgY2FsbGVkIGxhdGVyICh3aXRoaW4KLSAqIHJlYXBfa2lkcykgaWZmIHRoZSByZXR1cm4gdmFsdWUgaXMgPiAwLgotICovCi1waWRfdAotcnVuX3Byb2dyYW0ocHJvZywgYXJncywgbXVzdF9leGlzdCwgZG9uZSwgYXJnLCB3YWl0KQotICAgIGNoYXIgKnByb2c7Ci0gICAgY2hhciAqKmFyZ3M7Ci0gICAgaW50IG11c3RfZXhpc3Q7Ci0gICAgdm9pZCAoKmRvbmUpIF9fUCgodm9pZCAqKSk7Ci0gICAgdm9pZCAqYXJnOwotICAgIGludCB3YWl0OwotewotICAgIGludCBwaWQsIHN0YXR1czsKLSAgICBzdHJ1Y3Qgc3RhdCBzYnVmOwotCi0jaWYgZGVmaW5lZChfX0FORFJPSURfXykKLSAgICAvKiBPcmlnaW5hbGx5IGxpbmtuYW1lIGlzIHVzZWQgdG8gY3JlYXRlIG5hbWVkIHBpZCBmaWxlcywgd2hpY2ggaXMKLSAgICAqIG1lYW5pbmdsZXNzIHRvIGFuZHJvaWQuIEhlcmUgd2UgdXNlIGl0IGFzIGEgc3VmZml4IG9mIHByb2dyYW0gbmFtZXMsCi0gICAgKiBzbyBkaWZmZXJlbnQgdXNlcnMgY2FuIHJ1biB0aGVpciBvd24gcHJvZ3JhbSBieSBzcGVjaWZ5aW5nIGl0LiBGb3IKLSAgICAqIGV4YW1wbGUsICIvZXRjL3BwcC9pcC11cC12cG4iIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiBJUENQIGlzIHVwIGFuZAotICAgICogbGlua25hbWUgaXMgInZwbiIuIE5vdGUgdGhhdCAiLyIgaXMgbm90IGFsbG93ZWQgZm9yIHNlY3VyaXR5IHJlYXNvbnMuICovCi0gICAgY2hhciBmaWxlW01BWFBBVEhMRU5dOwotCi0gICAgaWYgKGxpbmtuYW1lWzBdICYmICFzdHJjaHIobGlua25hbWUsICcvJykpIHsKLSAgICAgICAgc25wcmludGYoZmlsZSwgTUFYUEFUSExFTiwgIiVzLSVzIiwgcHJvZywgbGlua25hbWUpOwotICAgICAgICBmaWxlW01BWFBBVEhMRU4gLSAxXSA9ICdcMCc7Ci0gICAgICAgIHByb2cgPSBmaWxlOwotICAgIH0KLSNlbmRpZgotCi0gICAgLyoKLSAgICAgKiBGaXJzdCBjaGVjayBpZiB0aGUgZmlsZSBleGlzdHMgYW5kIGlzIGV4ZWN1dGFibGUuCi0gICAgICogV2UgZG9uJ3QgdXNlIGFjY2VzcygpIGJlY2F1c2UgdGhhdCB3b3VsZCB1c2UgdGhlCi0gICAgICogcmVhbCB1c2VyLWlkLCB3aGljaCBtaWdodCBub3QgYmUgcm9vdCwgYW5kIHRoZSBzY3JpcHQKLSAgICAgKiBtaWdodCBiZSBhY2Nlc3NpYmxlIG9ubHkgdG8gcm9vdC4KLSAgICAgKi8KLSAgICBlcnJubyA9IEVJTlZBTDsKLSAgICBpZiAoc3RhdChwcm9nLCAmc2J1ZikgPCAwIHx8ICFTX0lTUkVHKHNidWYuc3RfbW9kZSkKLQl8fCAoc2J1Zi5zdF9tb2RlICYgKFNfSVhVU1J8U19JWEdSUHxTX0lYT1RIKSkgPT0gMCkgewotCWlmIChtdXN0X2V4aXN0IHx8IGVycm5vICE9IEVOT0VOVCkKLQkgICAgd2FybigiQ2FuJ3QgZXhlY3V0ZSAlczogJW0iLCBwcm9nKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwaWQgPSBzYWZlX2ZvcmsoZmRfZGV2bnVsbCwgZmRfZGV2bnVsbCwgZmRfZGV2bnVsbCk7Ci0gICAgaWYgKHBpZCA9PSAtMSkgewotCWVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGNoaWxkIHByb2Nlc3MgZm9yICVzOiAlbSIsIHByb2cpOwotCXJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKHBpZCAhPSAwKSB7Ci0JaWYgKGRlYnVnKQotCSAgICBkYmdsb2coIlNjcmlwdCAlcyBzdGFydGVkIChwaWQgJWQpIiwgcHJvZywgcGlkKTsKLQlyZWNvcmRfY2hpbGQocGlkLCBwcm9nLCBkb25lLCBhcmcsIDApOwotCWlmICh3YWl0KSB7Ci0JICAgIHdoaWxlICh3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCkgPCAwKSB7Ci0JCWlmIChlcnJubyA9PSBFSU5UUikKLQkJICAgIGNvbnRpbnVlOwotCQlmYXRhbCgiZXJyb3Igd2FpdGluZyBmb3Igc2NyaXB0ICVzOiAlbSIsIHByb2cpOwotCSAgICB9Ci0JICAgIGZvcmdldF9jaGlsZChwaWQsIHN0YXR1cyk7Ci0JfQotCXJldHVybiBwaWQ7Ci0gICAgfQotCi0gICAgLyogTGVhdmUgdGhlIGN1cnJlbnQgbG9jYXRpb24gKi8KLSAgICAodm9pZCkgc2V0c2lkKCk7CS8qIE5vIGNvbnRyb2xsaW5nIHR0eS4gKi8KLSAgICAodm9pZCkgdW1hc2sgKFNfSVJXWEd8U19JUldYTyk7Ci0gICAgKHZvaWQpIGNoZGlyICgiLyIpOwkvKiBubyBjdXJyZW50IGRpcmVjdG9yeS4gKi8KLSAgICBzZXR1aWQoMCk7CQkvKiBzZXQgcmVhbCBVSUQgPSByb290ICovCi0gICAgc2V0Z2lkKGdldGVnaWQoKSk7Ci0KLSNpZmRlZiBCU0QKLSAgICAvKiBGb3JjZSB0aGUgcHJpb3JpdHkgYmFjayB0byB6ZXJvIGlmIHBwcGQgaXMgcnVubmluZyBoaWdoZXIuICovCi0gICAgaWYgKHNldHByaW9yaXR5IChQUklPX1BST0NFU1MsIDAsIDApIDwgMCkKLQl3YXJuKCJjYW4ndCByZXNldCBwcmlvcml0eSB0byAwOiAlbSIpOwotI2VuZGlmCi0KLSAgICAvKiBydW4gdGhlIHByb2dyYW0gKi8KLSAgICB1cGRhdGVfc2NyaXB0X2Vudmlyb25tZW50KCk7Ci0gICAgZXhlY3ZlKHByb2csIGFyZ3MsIHNjcmlwdF9lbnYpOwotICAgIGlmIChtdXN0X2V4aXN0IHx8IGVycm5vICE9IEVOT0VOVCkgewotCS8qIGhhdmUgdG8gcmVvcGVuIHRoZSBsb2csIHRoZXJlJ3Mgbm93aGVyZSBlbHNlCi0JICAgZm9yIHRoZSBtZXNzYWdlIHRvIGdvLiAqLwotCXJlb3Blbl9sb2coKTsKLQlzeXNsb2coTE9HX0VSUiwgIkNhbid0IGV4ZWN1dGUgJXM6ICVtIiwgcHJvZyk7Ci0JY2xvc2Vsb2coKTsKLSAgICB9Ci0gICAgX2V4aXQoOTkpOwotfQotCi0KLS8qCi0gKiByZWNvcmRfY2hpbGQgLSBhZGQgYSBjaGlsZCBwcm9jZXNzIHRvIHRoZSBsaXN0IGZvciByZWFwX2tpZHMKLSAqIHRvIHVzZS4KLSAqLwotdm9pZAotcmVjb3JkX2NoaWxkKHBpZCwgcHJvZywgZG9uZSwgYXJnLCBraWxsYWJsZSkKLSAgICBpbnQgcGlkOwotICAgIGNoYXIgKnByb2c7Ci0gICAgdm9pZCAoKmRvbmUpIF9fUCgodm9pZCAqKSk7Ci0gICAgdm9pZCAqYXJnOwotICAgIGludCBraWxsYWJsZTsKLXsKLSAgICBzdHJ1Y3Qgc3VicHJvY2VzcyAqY2hwOwotCi0gICAgKytuX2NoaWxkcmVuOwotCi0gICAgY2hwID0gKHN0cnVjdCBzdWJwcm9jZXNzICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IHN1YnByb2Nlc3MpKTsKLSAgICBpZiAoY2hwID09IE5VTEwpIHsKLQl3YXJuKCJsb3NpbmcgdHJhY2sgb2YgJXMgcHJvY2VzcyIsIHByb2cpOwotICAgIH0gZWxzZSB7Ci0JY2hwLT5waWQgPSBwaWQ7Ci0JY2hwLT5wcm9nID0gcHJvZzsKLQljaHAtPmRvbmUgPSBkb25lOwotCWNocC0+YXJnID0gYXJnOwotCWNocC0+bmV4dCA9IGNoaWxkcmVuOwotCWNocC0+a2lsbGFibGUgPSBraWxsYWJsZTsKLQljaGlsZHJlbiA9IGNocDsKLSAgICB9Ci19Ci0KLS8qCi0gKiBjaGlsZHdhaXRfZW5kIC0gd2UgZ290IGZlZCB1cCB3YWl0aW5nIGZvciB0aGUgY2hpbGQgcHJvY2Vzc2VzIHRvCi0gKiBleGl0LCBzZW5kIHRoZW0gYWxsIGEgU0lHVEVSTS4KLSAqLwotc3RhdGljIHZvaWQKLWNoaWxkd2FpdF9lbmQoYXJnKQotICAgIHZvaWQgKmFyZzsKLXsKLSAgICBzdHJ1Y3Qgc3VicHJvY2VzcyAqY2hwOwotCi0gICAgZm9yIChjaHAgPSBjaGlsZHJlbjsgY2hwICE9IE5VTEw7IGNocCA9IGNocC0+bmV4dCkgewotCWlmIChkZWJ1ZykKLQkgICAgZGJnbG9nKCJzZW5kaW5nIFNJR1RFUk0gdG8gcHJvY2VzcyAlZCIsIGNocC0+cGlkKTsKLQlraWxsKGNocC0+cGlkLCBTSUdURVJNKTsKLSAgICB9Ci0gICAgY2hpbGR3YWl0X2RvbmUgPSAxOwotfQotCi0vKgotICogZm9yZ2V0X2NoaWxkIC0gY2xlYW4gdXAgYWZ0ZXIgYSBkZWFkIGNoaWxkCi0gKi8KLXN0YXRpYyB2b2lkCi1mb3JnZXRfY2hpbGQocGlkLCBzdGF0dXMpCi0gICAgaW50IHBpZCwgc3RhdHVzOwotewotICAgIHN0cnVjdCBzdWJwcm9jZXNzICpjaHAsICoqcHJldnA7Ci0KLSAgICBmb3IgKHByZXZwID0gJmNoaWxkcmVuOyAoY2hwID0gKnByZXZwKSAhPSBOVUxMOyBwcmV2cCA9ICZjaHAtPm5leHQpIHsKLSAgICAgICAgaWYgKGNocC0+cGlkID09IHBpZCkgewotCSAgICAtLW5fY2hpbGRyZW47Ci0JICAgICpwcmV2cCA9IGNocC0+bmV4dDsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSAgICBpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkgewotICAgICAgICB3YXJuKCJDaGlsZCBwcm9jZXNzICVzIChwaWQgJWQpIHRlcm1pbmF0ZWQgd2l0aCBzaWduYWwgJWQiLAotCSAgICAgKGNocD8gY2hwLT5wcm9nOiAiPz8iKSwgcGlkLCBXVEVSTVNJRyhzdGF0dXMpKTsKLSAgICB9IGVsc2UgaWYgKGRlYnVnKQotICAgICAgICBkYmdsb2coIlNjcmlwdCAlcyBmaW5pc2hlZCAocGlkICVkKSwgc3RhdHVzID0gMHgleCIsCi0JICAgICAgIChjaHA/IGNocC0+cHJvZzogIj8/IiksIHBpZCwKLQkgICAgICAgV0lGRVhJVEVEKHN0YXR1cykgPyBXRVhJVFNUQVRVUyhzdGF0dXMpIDogc3RhdHVzKTsKLSAgICBpZiAoY2hwICYmIGNocC0+ZG9uZSkKLSAgICAgICAgKCpjaHAtPmRvbmUpKGNocC0+YXJnKTsKLSAgICBpZiAoY2hwKQotICAgICAgICBmcmVlKGNocCk7Ci19Ci0KLS8qCi0gKiByZWFwX2tpZHMgLSBnZXQgc3RhdHVzIGZyb20gYW55IGRlYWQgY2hpbGQgcHJvY2Vzc2VzLAotICogYW5kIGxvZyBhIG1lc3NhZ2UgZm9yIGFibm9ybWFsIHRlcm1pbmF0aW9ucy4KLSAqLwotc3RhdGljIGludAotcmVhcF9raWRzKCkKLXsKLSAgICBpbnQgcGlkLCBzdGF0dXM7Ci0KLSAgICBpZiAobl9jaGlsZHJlbiA9PSAwKQotCXJldHVybiAwOwotICAgIHdoaWxlICgocGlkID0gd2FpdHBpZCgtMSwgJnN0YXR1cywgV05PSEFORykpICE9IC0xICYmIHBpZCAhPSAwKSB7Ci0gICAgICAgIGZvcmdldF9jaGlsZChwaWQsIHN0YXR1cyk7Ci0gICAgfQotICAgIGlmIChwaWQgPT0gLTEpIHsKLQlpZiAoZXJybm8gPT0gRUNISUxEKQotCSAgICByZXR1cm4gLTE7Ci0JaWYgKGVycm5vICE9IEVJTlRSKQotCSAgICBlcnJvcigiRXJyb3Igd2FpdGluZyBmb3IgY2hpbGQgcHJvY2VzczogJW0iKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBhZGRfbm90aWZpZXIgLSBhZGQgYSBuZXcgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gc29tZXRoaW5nIGhhcHBlbnMuCi0gKi8KLXZvaWQKLWFkZF9ub3RpZmllcihub3RpZiwgZnVuYywgYXJnKQotICAgIHN0cnVjdCBub3RpZmllciAqKm5vdGlmOwotICAgIG5vdGlmeV9mdW5jIGZ1bmM7Ci0gICAgdm9pZCAqYXJnOwotewotICAgIHN0cnVjdCBub3RpZmllciAqbnA7Ci0KLSAgICBucCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IG5vdGlmaWVyKSk7Ci0gICAgaWYgKG5wID09IDApCi0Jbm92bSgibm90aWZpZXIgc3RydWN0Iik7Ci0gICAgbnAtPm5leHQgPSAqbm90aWY7Ci0gICAgbnAtPmZ1bmMgPSBmdW5jOwotICAgIG5wLT5hcmcgPSBhcmc7Ci0gICAgKm5vdGlmID0gbnA7Ci19Ci0KLS8qCi0gKiByZW1vdmVfbm90aWZpZXIgLSByZW1vdmUgYSBmdW5jdGlvbiBmcm9tIHRoZSBsaXN0IG9mIHRoaW5ncyB0bwotICogYmUgY2FsbGVkIHdoZW4gc29tZXRoaW5nIGhhcHBlbnMuCi0gKi8KLXZvaWQKLXJlbW92ZV9ub3RpZmllcihub3RpZiwgZnVuYywgYXJnKQotICAgIHN0cnVjdCBub3RpZmllciAqKm5vdGlmOwotICAgIG5vdGlmeV9mdW5jIGZ1bmM7Ci0gICAgdm9pZCAqYXJnOwotewotICAgIHN0cnVjdCBub3RpZmllciAqbnA7Ci0KLSAgICBmb3IgKDsgKG5wID0gKm5vdGlmKSAhPSAwOyBub3RpZiA9ICZucC0+bmV4dCkgewotCWlmIChucC0+ZnVuYyA9PSBmdW5jICYmIG5wLT5hcmcgPT0gYXJnKSB7Ci0JICAgICpub3RpZiA9IG5wLT5uZXh0OwotCSAgICBmcmVlKG5wKTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotLyoKLSAqIG5vdGlmeSAtIGNhbGwgYSBzZXQgb2YgZnVuY3Rpb25zIHJlZ2lzdGVyZWQgd2l0aCBhZGRfbm90aWZpZXIuCi0gKi8KLXZvaWQKLW5vdGlmeShub3RpZiwgdmFsKQotICAgIHN0cnVjdCBub3RpZmllciAqbm90aWY7Ci0gICAgaW50IHZhbDsKLXsKLSAgICBzdHJ1Y3Qgbm90aWZpZXIgKm5wOwotCi0gICAgd2hpbGUgKChucCA9IG5vdGlmKSAhPSAwKSB7Ci0Jbm90aWYgPSBucC0+bmV4dDsKLQkoKm5wLT5mdW5jKShucC0+YXJnLCB2YWwpOwotICAgIH0KLX0KLQotLyoKLSAqIG5vdm0gLSBsb2cgYW4gZXJyb3IgbWVzc2FnZSBzYXlpbmcgd2UgcmFuIG91dCBvZiBtZW1vcnksIGFuZCBkaWUuCi0gKi8KLXZvaWQKLW5vdm0obXNnKQotICAgIGNoYXIgKm1zZzsKLXsKLSAgICBmYXRhbCgiVmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIGFsbG9jYXRpbmcgJXNcbiIsIG1zZyk7Ci19Ci0KLS8qCi0gKiBzY3JpcHRfc2V0ZW52IC0gc2V0IGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHZhbHVlIHRvIGJlIHVzZWQKLSAqIGZvciBzY3JpcHRzIHRoYXQgd2UgcnVuIChlLmcuIGlwLXVwLCBhdXRoLXVwLCBldGMuKQotICovCi12b2lkCi1zY3JpcHRfc2V0ZW52KHZhciwgdmFsdWUsIGlza2V5KQotICAgIGNoYXIgKnZhciwgKnZhbHVlOwotICAgIGludCBpc2tleTsKLXsKLSAgICBzaXplX3QgdmFybCA9IHN0cmxlbih2YXIpOwotICAgIHNpemVfdCB2bCA9IHZhcmwgKyBzdHJsZW4odmFsdWUpICsgMjsKLSAgICBpbnQgaTsKLSAgICBjaGFyICpwLCAqbmV3c3RyaW5nOwotCi0gICAgbmV3c3RyaW5nID0gKGNoYXIgKikgbWFsbG9jKHZsKzEpOwotICAgIGlmIChuZXdzdHJpbmcgPT0gMCkKLQlyZXR1cm47Ci0gICAgKm5ld3N0cmluZysrID0gaXNrZXk7Ci0gICAgc2xwcmludGYobmV3c3RyaW5nLCB2bCwgIiVzPSVzIiwgdmFyLCB2YWx1ZSk7Ci0KLSAgICAvKiBjaGVjayBpZiB0aGlzIHZhcmlhYmxlIGlzIGFscmVhZHkgc2V0ICovCi0gICAgaWYgKHNjcmlwdF9lbnYgIT0gMCkgewotCWZvciAoaSA9IDA7IChwID0gc2NyaXB0X2VudltpXSkgIT0gMDsgKytpKSB7Ci0JICAgIGlmIChzdHJuY21wKHAsIHZhciwgdmFybCkgPT0gMCAmJiBwW3ZhcmxdID09ICc9JykgewotI2lmZGVmIFVTRV9UREIKLQkJaWYgKHBbLTFdICYmIHBwcGRiICE9IE5VTEwpCi0JCSAgICBkZWxldGVfZGJfa2V5KHApOwotI2VuZGlmCi0JCWZyZWUocC0xKTsKLQkJc2NyaXB0X2VudltpXSA9IG5ld3N0cmluZzsKLSNpZmRlZiBVU0VfVERCCi0JCWlmIChwcHBkYiAhPSBOVUxMKSB7Ci0JCSAgICBpZiAoaXNrZXkpCi0JCQlhZGRfZGJfa2V5KG5ld3N0cmluZyk7Ci0JCSAgICB1cGRhdGVfZGJfZW50cnkoKTsKLQkJfQotI2VuZGlmCi0JCXJldHVybjsKLQkgICAgfQotCX0KLSAgICB9IGVsc2UgewotCS8qIG5vIHNwYWNlIGFsbG9jYXRlZCBmb3Igc2NyaXB0IGVudi4gcHRycy4geWV0ICovCi0JaSA9IDA7Ci0Jc2NyaXB0X2VudiA9IG1hbGxvYygxNiAqIHNpemVvZihjaGFyICopKTsKLQlpZiAoc2NyaXB0X2VudiA9PSAwKSB7Ci0JICAgIGZyZWUobmV3c3RyaW5nIC0gMSk7Ci0JICAgIHJldHVybjsKLQl9Ci0Jc19lbnZfbmFsbG9jID0gMTY7Ci0gICAgfQotCi0gICAgaWYgKCFhZGRfc2NyaXB0X2VudihpLCBuZXdzdHJpbmcpKQotCXJldHVybjsKLQotI2lmZGVmIFVTRV9UREIKLSAgICBpZiAocHBwZGIgIT0gTlVMTCkgewotCWlmIChpc2tleSkKLQkgICAgYWRkX2RiX2tleShuZXdzdHJpbmcpOwotCXVwZGF0ZV9kYl9lbnRyeSgpOwotICAgIH0KLSNlbmRpZgotfQotCi0vKgotICogc2NyaXB0X3Vuc2V0ZW52IC0gcmVtb3ZlIGEgdmFyaWFibGUgZnJvbSB0aGUgZW52aXJvbm1lbnQKLSAqIGZvciBzY3JpcHRzLgotICovCi12b2lkCi1zY3JpcHRfdW5zZXRlbnYodmFyKQotICAgIGNoYXIgKnZhcjsKLXsKLSAgICBpbnQgdmwgPSBzdHJsZW4odmFyKTsKLSAgICBpbnQgaTsKLSAgICBjaGFyICpwOwotCi0gICAgaWYgKHNjcmlwdF9lbnYgPT0gMCkKLQlyZXR1cm47Ci0gICAgZm9yIChpID0gMDsgKHAgPSBzY3JpcHRfZW52W2ldKSAhPSAwOyArK2kpIHsKLQlpZiAoc3RybmNtcChwLCB2YXIsIHZsKSA9PSAwICYmIHBbdmxdID09ICc9JykgewotI2lmZGVmIFVTRV9UREIKLQkgICAgaWYgKHBbLTFdICYmIHBwcGRiICE9IE5VTEwpCi0JCWRlbGV0ZV9kYl9rZXkocCk7Ci0jZW5kaWYKLQkgICAgcmVtb3ZlX3NjcmlwdF9lbnYoaSk7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0jaWZkZWYgVVNFX1REQgotICAgIGlmIChwcHBkYiAhPSBOVUxMKQotCXVwZGF0ZV9kYl9lbnRyeSgpOwotI2VuZGlmCi19Ci0KLS8qCi0gKiBBbnkgYXJiaXRyYXJ5IHN0cmluZyB1c2VkIGFzIGEga2V5IGZvciBsb2NraW5nIHRoZSBkYXRhYmFzZS4KLSAqIEl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgaXQgaXMgYXMgbG9uZyBhcyBhbGwgcHBwZHMgdXNlIHRoZSBzYW1lIHN0cmluZy4KLSAqLwotI2RlZmluZSBQUFBEX0xPQ0tfS0VZCSJwcHBkIGxvY2siCi0KLS8qCi0gKiBsb2NrX2RiIC0gZ2V0IGFuIGV4Y2x1c2l2ZSBsb2NrIG9uIHRoZSBUREIgZGF0YWJhc2UuCi0gKiBVc2VkIHRvIGVuc3VyZSBhdG9taWNpdHkgb2YgdmFyaW91cyBsb29rdXAvbW9kaWZ5IG9wZXJhdGlvbnMuCi0gKi8KLXZvaWQgbG9ja19kYigpCi17Ci0jaWZkZWYgVVNFX1REQgotCVREQl9EQVRBIGtleTsKLQotCWtleS5kcHRyID0gUFBQRF9MT0NLX0tFWTsKLQlrZXkuZHNpemUgPSBzdHJsZW4oa2V5LmRwdHIpOwotCXRkYl9jaGFpbmxvY2socHBwZGIsIGtleSk7Ci0jZW5kaWYKLX0KLQotLyoKLSAqIHVubG9ja19kYiAtIHJlbW92ZSB0aGUgZXhjbHVzaXZlIGxvY2sgb2J0YWluZWQgYnkgbG9ja19kYi4KLSAqLwotdm9pZCB1bmxvY2tfZGIoKQotewotI2lmZGVmIFVTRV9UREIKLQlUREJfREFUQSBrZXk7Ci0KLQlrZXkuZHB0ciA9IFBQUERfTE9DS19LRVk7Ci0Ja2V5LmRzaXplID0gc3RybGVuKGtleS5kcHRyKTsKLQl0ZGJfY2hhaW51bmxvY2socHBwZGIsIGtleSk7Ci0jZW5kaWYKLX0KLQotI2lmZGVmIFVTRV9UREIKLS8qCi0gKiB1cGRhdGVfZGJfZW50cnkgLSB1cGRhdGUgb3VyIGVudHJ5IGluIHRoZSBkYXRhYmFzZS4KLSAqLwotc3RhdGljIHZvaWQKLXVwZGF0ZV9kYl9lbnRyeSgpCi17Ci0gICAgVERCX0RBVEEga2V5LCBkYnVmOwotICAgIGludCB2bGVuLCBpOwotICAgIGNoYXIgKnAsICpxLCAqdmJ1ZjsKLQotICAgIGlmIChzY3JpcHRfZW52ID09IE5VTEwpCi0JcmV0dXJuOwotICAgIHZsZW4gPSAwOwotICAgIGZvciAoaSA9IDA7IChwID0gc2NyaXB0X2VudltpXSkgIT0gMDsgKytpKQotCXZsZW4gKz0gc3RybGVuKHApICsgMTsKLSAgICB2YnVmID0gbWFsbG9jKHZsZW4gKyAxKTsKLSAgICBpZiAodmJ1ZiA9PSAwKQotCW5vdm0oImRhdGFiYXNlIGVudHJ5Iik7Ci0gICAgcSA9IHZidWY7Ci0gICAgZm9yIChpID0gMDsgKHAgPSBzY3JpcHRfZW52W2ldKSAhPSAwOyArK2kpCi0JcSArPSBzbHByaW50ZihxLCB2YnVmICsgdmxlbiAtIHEsICIlczsiLCBwKTsKLQotICAgIGtleS5kcHRyID0gZGJfa2V5OwotICAgIGtleS5kc2l6ZSA9IHN0cmxlbihkYl9rZXkpOwotICAgIGRidWYuZHB0ciA9IHZidWY7Ci0gICAgZGJ1Zi5kc2l6ZSA9IHZsZW47Ci0gICAgaWYgKHRkYl9zdG9yZShwcHBkYiwga2V5LCBkYnVmLCBUREJfUkVQTEFDRSkpCi0JZXJyb3IoInRkYl9zdG9yZSBmYWlsZWQ6ICVzIiwgdGRiX2Vycm9yc3RyKHBwcGRiKSk7Ci0KLSAgICBpZiAodmJ1ZikKLSAgICAgICAgZnJlZSh2YnVmKTsKLQotfQotCi0vKgotICogYWRkX2RiX2tleSAtIGFkZCBhIGtleSB0aGF0IHdlIGNhbiB1c2UgdG8gbG9vayB1cCBvdXIgZGF0YWJhc2UgZW50cnkuCi0gKi8KLXN0YXRpYyB2b2lkCi1hZGRfZGJfa2V5KHN0cikKLSAgICBjb25zdCBjaGFyICpzdHI7Ci17Ci0gICAgVERCX0RBVEEga2V5LCBkYnVmOwotCi0gICAga2V5LmRwdHIgPSAoY2hhciAqKSBzdHI7Ci0gICAga2V5LmRzaXplID0gc3RybGVuKHN0cik7Ci0gICAgZGJ1Zi5kcHRyID0gZGJfa2V5OwotICAgIGRidWYuZHNpemUgPSBzdHJsZW4oZGJfa2V5KTsKLSAgICBpZiAodGRiX3N0b3JlKHBwcGRiLCBrZXksIGRidWYsIFREQl9SRVBMQUNFKSkKLQllcnJvcigidGRiX3N0b3JlIGtleSBmYWlsZWQ6ICVzIiwgdGRiX2Vycm9yc3RyKHBwcGRiKSk7Ci19Ci0KLS8qCi0gKiBkZWxldGVfZGJfa2V5IC0gZGVsZXRlIGEga2V5IGZvciBsb29raW5nIHVwIG91ciBkYXRhYmFzZSBlbnRyeS4KLSAqLwotc3RhdGljIHZvaWQKLWRlbGV0ZV9kYl9rZXkoc3RyKQotICAgIGNvbnN0IGNoYXIgKnN0cjsKLXsKLSAgICBUREJfREFUQSBrZXk7Ci0KLSAgICBrZXkuZHB0ciA9IChjaGFyICopIHN0cjsKLSAgICBrZXkuZHNpemUgPSBzdHJsZW4oc3RyKTsKLSAgICB0ZGJfZGVsZXRlKHBwcGRiLCBrZXkpOwotfQotCi0vKgotICogY2xlYW51cF9kYiAtIGRlbGV0ZSBhbGwgdGhlIGVudHJpZXMgd2UgcHV0IGluIHRoZSBkYXRhYmFzZS4KLSAqLwotc3RhdGljIHZvaWQKLWNsZWFudXBfZGIoKQotewotICAgIFREQl9EQVRBIGtleTsKLSAgICBpbnQgaTsKLSAgICBjaGFyICpwOwotCi0gICAga2V5LmRwdHIgPSBkYl9rZXk7Ci0gICAga2V5LmRzaXplID0gc3RybGVuKGRiX2tleSk7Ci0gICAgdGRiX2RlbGV0ZShwcHBkYiwga2V5KTsKLSAgICBmb3IgKGkgPSAwOyAocCA9IHNjcmlwdF9lbnZbaV0pICE9IDA7ICsraSkKLQlpZiAocFstMV0pCi0JICAgIGRlbGV0ZV9kYl9rZXkocCk7Ci19Ci0jZW5kaWYgLyogVVNFX1REQiAqLwpkaWZmIC0tZ2l0IGEvcHBwZC9tZDQuYyBiL3BwcGQvbWQ0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NDNlODguLjAwMDAwMDAKLS0tIGEvcHBwZC9tZDQuYworKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKgotKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqIG1kNC5jIC0tIEltcGxlbWVudGF0aW9uIG9mIE1ENCBNZXNzYWdlIERpZ2VzdCBBbGdvcml0aG0gICAgICAgICAgICoqCi0qKiBVcGRhdGVkOiAyLzE2LzkwIGJ5IFJvbmFsZCBMLiBSaXZlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgotKiogKEMpIDE5OTAgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKLSoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKgotKiogVG8gdXNlIE1ENDoKLSoqICAgLS0gSW5jbHVkZSBtZDQuaCBpbiB5b3VyIHByb2dyYW0KLSoqICAgLS0gRGVjbGFyZSBhbiBNRHN0cnVjdCBNRCB0byBob2xkIHRoZSBzdGF0ZSBvZiB0aGUgZGlnZXN0Ci0qKiAgICAgICAgICBjb21wdXRhdGlvbi4KLSoqICAgLS0gSW5pdGlhbGl6ZSBNRCB1c2luZyBNRGJlZ2luKCZNRCkKLSoqICAgLS0gRm9yIGVhY2ggZnVsbCBibG9jayAoNjQgYnl0ZXMpIFggeW91IHdpc2ggdG8gcHJvY2VzcywgY2FsbAotKiogICAgICAgICAgTUQ0VXBkYXRlKCZNRCxYLDUxMikKLSoqICAgICAgKDUxMiBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYSBmdWxsIGJsb2NrLikKLSoqICAgLS0gRm9yIHRoZSBsYXN0IGJsb2NrIChsZXNzIHRoYW4gNjQgYnl0ZXMpIHlvdSB3aXNoIHRvIHByb2Nlc3MsCi0qKiAgICAgICAgICBNRDRVcGRhdGUoJk1ELFgsbikKLSoqICAgICAgd2hlcmUgbiBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIHBhcnRpYWwgYmxvY2suIEEgcGFydGlhbAotKiogICAgICBibG9jayB0ZXJtaW5hdGVzIHRoZSBjb21wdXRhdGlvbiwgc28gZXZlcnkgTUQgY29tcHV0YXRpb24KLSoqICAgICAgc2hvdWxkIHRlcm1pbmF0ZSBieSBwcm9jZXNzaW5nIGEgcGFydGlhbCBibG9jaywgZXZlbiBpZiBpdAotKiogICAgICBoYXMgbiA9IDAuCi0qKiAgIC0tIFRoZSBtZXNzYWdlIGRpZ2VzdCBpcyBhdmFpbGFibGUgaW4gTUQuYnVmZmVyWzBdIC4uLgotKiogICAgICBNRC5idWZmZXJbM10uICAoTGVhc3Qtc2lnbmlmaWNhbnQgYnl0ZSBvZiBlYWNoIHdvcmQKLSoqICAgICAgc2hvdWxkIGJlIG91dHB1dCBmaXJzdC4pCi0qKiAgIC0tIFlvdSBjYW4gcHJpbnQgb3V0IHRoZSBkaWdlc3QgdXNpbmcgTURwcmludCgmTUQpCi0qLwotCi0vKiBJbXBsZW1lbnRhdGlvbiBub3RlczoKLSoqIFRoaXMgaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGF0IGludHMgYXJlIDMyLWJpdCBxdWFudGl0aWVzLgotKi8KLQotI2RlZmluZSBUUlVFICAxCi0jZGVmaW5lIEZBTFNFIDAKLQotLyogQ29tcGlsZS10aW1lIGluY2x1ZGVzCi0qLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAibWQ0LmgiCi0jaW5jbHVkZSAicHBwZC5oIgotCi0vKiBDb21waWxlLXRpbWUgZGVjbGFyYXRpb25zIG9mIE1ENCAibWFnaWMgY29uc3RhbnRzIi4KLSovCi0jZGVmaW5lIEkwICAweDY3NDUyMzAxICAgICAgIC8qIEluaXRpYWwgdmFsdWVzIGZvciBNRCBidWZmZXIgKi8KLSNkZWZpbmUgSTEgIDB4ZWZjZGFiODkKLSNkZWZpbmUgSTIgIDB4OThiYWRjZmUKLSNkZWZpbmUgSTMgIDB4MTAzMjU0NzYKLSNkZWZpbmUgQzIgIDAxMzI0MDQ3NDYzMSAgICAgLyogcm91bmQgMiBjb25zdGFudCA9IHNxcnQoMikgaW4gb2N0YWwgKi8KLSNkZWZpbmUgQzMgIDAxNTY2NjM2NTY0MSAgICAgLyogcm91bmQgMyBjb25zdGFudCA9IHNxcnQoMykgaW4gb2N0YWwgKi8KLS8qIEMyIGFuZCBDMyBhcmUgZnJvbSBLbnV0aCwgVGhlIEFydCBvZiBQcm9ncmFtbWluZywgVm9sdW1lIDIKLSoqIChTZW1pbnVtZXJpY2FsIEFsZ29yaXRobXMpLCBTZWNvbmQgRWRpdGlvbiAoMTk4MSksIEFkZGlzb24tV2VzbGV5LgotKiogVGFibGUgMiwgcGFnZSA2NjAuCi0qLwotCi0jZGVmaW5lIGZzMSAgMyAgICAgICAgICAgICAgIC8qIHJvdW5kIDEgc2hpZnQgYW1vdW50cyAqLwotI2RlZmluZSBmczIgIDcKLSNkZWZpbmUgZnMzIDExCi0jZGVmaW5lIGZzNCAxOQotI2RlZmluZSBnczEgIDMgICAgICAgICAgICAgICAvKiByb3VuZCAyIHNoaWZ0IGFtb3VudHMgKi8KLSNkZWZpbmUgZ3MyICA1Ci0jZGVmaW5lIGdzMyAgOQotI2RlZmluZSBnczQgMTMKLSNkZWZpbmUgaHMxICAzICAgICAgICAgICAgICAgLyogcm91bmQgMyBzaGlmdCBhbW91bnRzICovCi0jZGVmaW5lIGhzMiAgOQotI2RlZmluZSBoczMgMTEKLSNkZWZpbmUgaHM0IDE1Ci0KLS8qIENvbXBpbGUtdGltZSBtYWNybyBkZWNsYXJhdGlvbnMgZm9yIE1ENC4KLSoqIE5vdGU6IFRoZSAicm90IiBvcGVyYXRvciB1c2VzIHRoZSB2YXJpYWJsZSAidG1wIi4KLSoqIEl0IGFzc3VtZXMgdG1wIGlzIGRlY2xhcmVkIGFzIHVuc2lnbmVkIGludCwgc28gdGhhdCB0aGUgPj4KLSoqIG9wZXJhdG9yIHdpbGwgc2hpZnQgaW4gemVyb3MgcmF0aGVyIHRoYW4gZXh0ZW5kaW5nIHRoZSBzaWduIGJpdC4KLSovCi0jZGVmaW5lIGYoWCxZLFopICAgICAgICAgICAgICgoWCZZKSB8ICgoflgpJlopKQotI2RlZmluZSBnKFgsWSxaKSAgICAgICAgICAgICAoKFgmWSkgfCAoWCZaKSB8IChZJlopKQotI2RlZmluZSBoKFgsWSxaKSAgICAgICAgICAgICAoWF5ZXlopCi0jZGVmaW5lIHJvdChYLFMpICAgICAgICAgICAgICh0bXA9WCwodG1wPDxTKSB8ICh0bXA+PigzMi1TKSkpCi0jZGVmaW5lIGZmKEEsQixDLEQsaSxzKSAgICAgIEEgPSByb3QoKEEgKyBmKEIsQyxEKSArIFhbaV0pLHMpCi0jZGVmaW5lIGdnKEEsQixDLEQsaSxzKSAgICAgIEEgPSByb3QoKEEgKyBnKEIsQyxEKSArIFhbaV0gKyBDMikscykKLSNkZWZpbmUgaGgoQSxCLEMsRCxpLHMpICAgICAgQSA9IHJvdCgoQSArIGgoQixDLEQpICsgWFtpXSArIEMzKSxzKQotCi0vKiBNRDRwcmludChNRHApCi0qKiBQcmludCBtZXNzYWdlIGRpZ2VzdCBidWZmZXIgTURwIGFzIDMyIGhleGFkZWNpbWFsIGRpZ2l0cy4KLSoqIE9yZGVyIGlzIGZyb20gbG93LW9yZGVyIGJ5dGUgb2YgYnVmZmVyWzBdIHRvIGhpZ2gtb3JkZXIgYnl0ZSBvZgotKiogYnVmZmVyWzNdLgotKiogRWFjaCBieXRlIGlzIHByaW50ZWQgd2l0aCBoaWdoLW9yZGVyIGhleGFkZWNpbWFsIGRpZ2l0IGZpcnN0LgotKiogVGhpcyBpcyBhIHVzZXItY2FsbGFibGUgcm91dGluZS4KLSovCi12b2lkCi1NRDRQcmludChNRHApCi1NRDRfQ1RYICpNRHA7Ci17Ci0gIGludCBpLGo7Ci0gIGZvciAoaT0wO2k8NDtpKyspCi0gICAgZm9yIChqPTA7ajwzMjtqPWorOCkKLSAgICAgIHByaW50ZigiJTAyeCIsKE1EcC0+YnVmZmVyW2ldPj5qKSAmIDB4RkYpOwotfQotCi0vKiBNRDRJbml0KE1EcCkKLSoqIEluaXRpYWxpemUgbWVzc2FnZSBkaWdlc3QgYnVmZmVyIE1EcC4KLSoqIFRoaXMgaXMgYSB1c2VyLWNhbGxhYmxlIHJvdXRpbmUuCi0qLwotdm9pZAotTUQ0SW5pdChNRHApCi1NRDRfQ1RYICpNRHA7Ci17Ci0gIGludCBpOwotICBNRHAtPmJ1ZmZlclswXSA9IEkwOwotICBNRHAtPmJ1ZmZlclsxXSA9IEkxOwotICBNRHAtPmJ1ZmZlclsyXSA9IEkyOwotICBNRHAtPmJ1ZmZlclszXSA9IEkzOwotICBmb3IgKGk9MDtpPDg7aSsrKSBNRHAtPmNvdW50W2ldID0gMDsKLSAgTURwLT5kb25lID0gMDsKLX0KLQotLyogTURibG9jayhNRHAsWCkKLSoqIFVwZGF0ZSBtZXNzYWdlIGRpZ2VzdCBidWZmZXIgTURwLT5idWZmZXIgdXNpbmcgMTYtd29yZCBkYXRhIGJsb2NrIFguCi0qKiBBc3N1bWVzIGFsbCAxNiB3b3JkcyBvZiBYIGFyZSBmdWxsIG9mIGRhdGEuCi0qKiBEb2VzIG5vdCB1cGRhdGUgTURwLT5jb3VudC4KLSoqIFRoaXMgcm91dGluZSBpcyBub3QgdXNlci1jYWxsYWJsZS4KLSovCi1zdGF0aWMgdm9pZAotTURibG9jayhNRHAsWGIpCi1NRDRfQ1RYICpNRHA7Ci11bnNpZ25lZCBjaGFyICpYYjsKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHRtcCwgQSwgQiwgQywgRDsKLSAgdW5zaWduZWQgaW50IFhbMTZdOwotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgewotICAgIFhbaV0gPSBYYlswXSArIChYYlsxXSA8PCA4KSArIChYYlsyXSA8PCAxNikgKyAoWGJbM10gPDwgMjQpOwotICAgIFhiICs9IDQ7Ci0gIH0KLQotICBBID0gTURwLT5idWZmZXJbMF07Ci0gIEIgPSBNRHAtPmJ1ZmZlclsxXTsKLSAgQyA9IE1EcC0+YnVmZmVyWzJdOwotICBEID0gTURwLT5idWZmZXJbM107Ci0gIC8qIFVwZGF0ZSB0aGUgbWVzc2FnZSBkaWdlc3QgYnVmZmVyICovCi0gIGZmKEEgLCBCICwgQyAsIEQgLCAgMCAsIGZzMSk7IC8qIFJvdW5kIDEgKi8KLSAgZmYoRCAsIEEgLCBCICwgQyAsICAxICwgZnMyKTsKLSAgZmYoQyAsIEQgLCBBICwgQiAsICAyICwgZnMzKTsKLSAgZmYoQiAsIEMgLCBEICwgQSAsICAzICwgZnM0KTsKLSAgZmYoQSAsIEIgLCBDICwgRCAsICA0ICwgZnMxKTsKLSAgZmYoRCAsIEEgLCBCICwgQyAsICA1ICwgZnMyKTsKLSAgZmYoQyAsIEQgLCBBICwgQiAsICA2ICwgZnMzKTsKLSAgZmYoQiAsIEMgLCBEICwgQSAsICA3ICwgZnM0KTsKLSAgZmYoQSAsIEIgLCBDICwgRCAsICA4ICwgZnMxKTsKLSAgZmYoRCAsIEEgLCBCICwgQyAsICA5ICwgZnMyKTsKLSAgZmYoQyAsIEQgLCBBICwgQiAsIDEwICwgZnMzKTsKLSAgZmYoQiAsIEMgLCBEICwgQSAsIDExICwgZnM0KTsKLSAgZmYoQSAsIEIgLCBDICwgRCAsIDEyICwgZnMxKTsKLSAgZmYoRCAsIEEgLCBCICwgQyAsIDEzICwgZnMyKTsKLSAgZmYoQyAsIEQgLCBBICwgQiAsIDE0ICwgZnMzKTsKLSAgZmYoQiAsIEMgLCBEICwgQSAsIDE1ICwgZnM0KTsKLSAgZ2coQSAsIEIgLCBDICwgRCAsICAwICwgZ3MxKTsgLyogUm91bmQgMiAqLwotICBnZyhEICwgQSAsIEIgLCBDICwgIDQgLCBnczIpOwotICBnZyhDICwgRCAsIEEgLCBCICwgIDggLCBnczMpOwotICBnZyhCICwgQyAsIEQgLCBBICwgMTIgLCBnczQpOwotICBnZyhBICwgQiAsIEMgLCBEICwgIDEgLCBnczEpOwotICBnZyhEICwgQSAsIEIgLCBDICwgIDUgLCBnczIpOwotICBnZyhDICwgRCAsIEEgLCBCICwgIDkgLCBnczMpOwotICBnZyhCICwgQyAsIEQgLCBBICwgMTMgLCBnczQpOwotICBnZyhBICwgQiAsIEMgLCBEICwgIDIgLCBnczEpOwotICBnZyhEICwgQSAsIEIgLCBDICwgIDYgLCBnczIpOwotICBnZyhDICwgRCAsIEEgLCBCICwgMTAgLCBnczMpOwotICBnZyhCICwgQyAsIEQgLCBBICwgMTQgLCBnczQpOwotICBnZyhBICwgQiAsIEMgLCBEICwgIDMgLCBnczEpOwotICBnZyhEICwgQSAsIEIgLCBDICwgIDcgLCBnczIpOwotICBnZyhDICwgRCAsIEEgLCBCICwgMTEgLCBnczMpOwotICBnZyhCICwgQyAsIEQgLCBBICwgMTUgLCBnczQpOwotICBoaChBICwgQiAsIEMgLCBEICwgIDAgLCBoczEpOyAvKiBSb3VuZCAzICovCi0gIGhoKEQgLCBBICwgQiAsIEMgLCAgOCAsIGhzMik7Ci0gIGhoKEMgLCBEICwgQSAsIEIgLCAgNCAsIGhzMyk7Ci0gIGhoKEIgLCBDICwgRCAsIEEgLCAxMiAsIGhzNCk7Ci0gIGhoKEEgLCBCICwgQyAsIEQgLCAgMiAsIGhzMSk7Ci0gIGhoKEQgLCBBICwgQiAsIEMgLCAxMCAsIGhzMik7Ci0gIGhoKEMgLCBEICwgQSAsIEIgLCAgNiAsIGhzMyk7Ci0gIGhoKEIgLCBDICwgRCAsIEEgLCAxNCAsIGhzNCk7Ci0gIGhoKEEgLCBCICwgQyAsIEQgLCAgMSAsIGhzMSk7Ci0gIGhoKEQgLCBBICwgQiAsIEMgLCAgOSAsIGhzMik7Ci0gIGhoKEMgLCBEICwgQSAsIEIgLCAgNSAsIGhzMyk7Ci0gIGhoKEIgLCBDICwgRCAsIEEgLCAxMyAsIGhzNCk7Ci0gIGhoKEEgLCBCICwgQyAsIEQgLCAgMyAsIGhzMSk7Ci0gIGhoKEQgLCBBICwgQiAsIEMgLCAxMSAsIGhzMik7Ci0gIGhoKEMgLCBEICwgQSAsIEIgLCAgNyAsIGhzMyk7Ci0gIGhoKEIgLCBDICwgRCAsIEEgLCAxNSAsIGhzNCk7Ci0gIE1EcC0+YnVmZmVyWzBdICs9IEE7Ci0gIE1EcC0+YnVmZmVyWzFdICs9IEI7Ci0gIE1EcC0+YnVmZmVyWzJdICs9IEM7Ci0gIE1EcC0+YnVmZmVyWzNdICs9IEQ7Ci19Ci0KLS8qIE1ENFVwZGF0ZShNRHAsWCxjb3VudCkKLSoqIElucHV0OiBYIC0tIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiB1bnNpZ25lZCBjaGFyYWN0ZXJzLgotKiogICAgICAgIGNvdW50IC0tIHRoZSBudW1iZXIgb2YgYml0cyBvZiBYIHRvIHVzZS4KLSoqICAgICAgICAgIChpZiBub3QgYSBtdWx0aXBsZSBvZiA4LCB1c2VzIGhpZ2ggYml0cyBvZiBsYXN0IGJ5dGUuKQotKiogVXBkYXRlIE1EcCB1c2luZyB0aGUgbnVtYmVyIG9mIGJpdHMgb2YgWCBnaXZlbiBieSBjb3VudC4KLSoqIFRoaXMgaXMgdGhlIGJhc2ljIGlucHV0IHJvdXRpbmUgZm9yIGFuIE1ENCB1c2VyLgotKiogVGhlIHJvdXRpbmUgY29tcGxldGVzIHRoZSBNRCBjb21wdXRhdGlvbiB3aGVuIGNvdW50IDwgNTEyLCBzbwotKiogZXZlcnkgTUQgY29tcHV0YXRpb24gc2hvdWxkIGVuZCB3aXRoIG9uZSBjYWxsIHRvIE1ENFVwZGF0ZSB3aXRoIGEKLSoqIGNvdW50IGxlc3MgdGhhbiA1MTIuICBBIGNhbGwgd2l0aCBjb3VudCAwIHdpbGwgYmUgaWdub3JlZCBpZiB0aGUKLSoqIE1EIGhhcyBhbHJlYWR5IGJlZW4gdGVybWluYXRlZCAoZG9uZSAhPSAwKSwgc28gYW4gZXh0cmEgY2FsbCB3aXRoCi0qKiBjb3VudCAwIGNhbiBiZSBnaXZlbiBhcyBhICJjb3VydGVzeSBjbG9zZSIgdG8gZm9yY2UgdGVybWluYXRpb24KLSoqIGlmIGRlc2lyZWQuCi0qLwotdm9pZAotTUQ0VXBkYXRlKE1EcCxYLGNvdW50KQotTUQ0X0NUWCAqTURwOwotdW5zaWduZWQgY2hhciAqWDsKLXVuc2lnbmVkIGludCBjb3VudDsKLXsKLSAgdW5zaWduZWQgaW50IGksIHRtcCwgYml0LCBieXRlLCBtYXNrOwotICB1bnNpZ25lZCBjaGFyIFhYWzY0XTsKLSAgdW5zaWduZWQgY2hhciAqcDsKLQotICAvKiByZXR1cm4gd2l0aCBubyBlcnJvciBpZiB0aGlzIGlzIGEgY291cnRlc3kgY2xvc2Ugd2l0aCBjb3VudAotICAqKiB6ZXJvIGFuZCBNRHAtPmRvbmUgaXMgdHJ1ZS4KLSAgKi8KLSAgaWYgKGNvdW50ID09IDAgJiYgTURwLT5kb25lKSByZXR1cm47Ci0gIC8qIGNoZWNrIHRvIHNlZSBpZiBNRCBpcyBhbHJlYWR5IGRvbmUgYW5kIHJlcG9ydCBlcnJvciAqLwotICBpZiAoTURwLT5kb25lKQotICB7IHByaW50ZigiXG5FcnJvcjogTUQ0VXBkYXRlIE1EIGFscmVhZHkgZG9uZS4iKTsgcmV0dXJuOyB9Ci0KLSAgLyogQWRkIGNvdW50IHRvIE1EcC0+Y291bnQgKi8KLSAgdG1wID0gY291bnQ7Ci0gIHAgPSBNRHAtPmNvdW50OwotICB3aGlsZSAodG1wKQotICB7IHRtcCArPSAqcDsKLSAgKnArKyA9IHRtcDsKLSAgdG1wID0gdG1wID4+IDg7Ci0gIH0KLQotICAvKiBQcm9jZXNzIGRhdGEgKi8KLSAgaWYgKGNvdW50ID09IDUxMikKLSAgeyAvKiBGdWxsIGJsb2NrIG9mIGRhdGEgdG8gaGFuZGxlICovCi0gICAgTURibG9jayhNRHAsWCk7Ci0gIH0KLSAgZWxzZSBpZiAoY291bnQgPiA1MTIpIC8qIENoZWNrIGZvciBjb3VudCB0b28gbGFyZ2UgKi8KLSAgewotICAgIHByaW50ZigiXG5FcnJvcjogTUQ0VXBkYXRlIGNhbGxlZCB3aXRoIGlsbGVnYWwgY291bnQgdmFsdWUgJWQuIiwKLQkgICBjb3VudCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGVsc2UgLyogcGFydGlhbCBibG9jayAtLSBtdXN0IGJlIGxhc3QgYmxvY2sgc28gZmluaXNoIHVwICovCi0gIHsKLSAgICAvKiBGaW5kIG91dCBob3cgbWFueSBieXRlcyBhbmQgcmVzaWR1YWwgYml0cyB0aGVyZSBhcmUgKi8KLSAgICBieXRlID0gY291bnQgPj4gMzsKLSAgICBiaXQgPSAgY291bnQgJiA3OwotICAgIC8qIENvcHkgWCBpbnRvIFhYIHNpbmNlIHdlIG5lZWQgdG8gbW9kaWZ5IGl0ICovCi0gICAgaWYgKGNvdW50KQotICAgICAgZm9yIChpPTA7aTw9Ynl0ZTtpKyspIFhYW2ldID0gWFtpXTsKLSAgICBmb3IgKGk9Ynl0ZSsxO2k8NjQ7aSsrKSBYWFtpXSA9IDA7Ci0gICAgLyogQWRkIHBhZGRpbmcgJzEnIGJpdCBhbmQgbG93LW9yZGVyIHplcm9zIGluIGxhc3QgYnl0ZSAqLwotICAgIG1hc2sgPSAxIDw8ICg3IC0gYml0KTsKLSAgICBYWFtieXRlXSA9IChYWFtieXRlXSB8IG1hc2spICYgfiggbWFzayAtIDEpOwotICAgIC8qIElmIHJvb20gZm9yIGJpdCBjb3VudCwgZmluaXNoIHVwIHdpdGggdGhpcyBibG9jayAqLwotICAgIGlmIChieXRlIDw9IDU1KQotICAgIHsKLSAgICAgIGZvciAoaT0wO2k8ODtpKyspIFhYWzU2K2ldID0gTURwLT5jb3VudFtpXTsKLSAgICAgIE1EYmxvY2soTURwLFhYKTsKLSAgICB9Ci0gICAgZWxzZSAvKiBuZWVkIHRvIGRvIHR3byBibG9ja3MgdG8gZmluaXNoIHVwICovCi0gICAgewotICAgICAgTURibG9jayhNRHAsWFgpOwotICAgICAgZm9yIChpPTA7aTw1NjtpKyspIFhYW2ldID0gMDsKLSAgICAgIGZvciAoaT0wO2k8ODtpKyspICBYWFs1NitpXSA9IE1EcC0+Y291bnRbaV07Ci0gICAgICBNRGJsb2NrKE1EcCxYWCk7Ci0gICAgfQotICAgIC8qIFNldCBmbGFnIHNheWluZyB3ZSdyZSBkb25lIHdpdGggTUQgY29tcHV0YXRpb24gKi8KLSAgICBNRHAtPmRvbmUgPSAxOwotICB9Ci19Ci0KLS8qCi0qKiBGaW5pc2ggdXAgTUQ0IGNvbXB1dGF0aW9uIGFuZCByZXR1cm4gbWVzc2FnZSBkaWdlc3QuCi0qLwotdm9pZAotTUQ0RmluYWwoYnVmLCBNRCkKLXVuc2lnbmVkIGNoYXIgKmJ1ZjsKLU1ENF9DVFggKk1EOwotewotICBpbnQgaSwgajsKLSAgdW5zaWduZWQgaW50IHc7Ci0KLSAgTUQ0VXBkYXRlKE1ELCBOVUxMLCAwKTsKLSAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgewotICAgIHcgPSBNRC0+YnVmZmVyW2ldOwotICAgIGZvciAoaiA9IDA7IGogPCA0OyArK2opIHsKLSAgICAgICpidWYrKyA9IHc7Ci0gICAgICB3ID4+PSA4OwotICAgIH0KLSAgfQotfQotCi0vKgotKiogRW5kIG9mIG1kNC5jCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKGN1dCkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL3BwcGQvbWQ0LmggYi9wcHBkL21kNC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGU4ZjlhLi4wMDAwMDAwCi0tLSBhL3BwcGQvbWQ0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0KLS8qCi0qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiogbWQ0LmggLS0gSGVhZGVyIGZpbGUgZm9yIGltcGxlbWVudGF0aW9uIG9mICAgICAgICAgICAgICAgICAgICAgICAgKioKLSoqIE1ENCBNZXNzYWdlIERpZ2VzdCBBbGdvcml0aG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCi0qKiBVcGRhdGVkOiAyLzEzLzkwIGJ5IFJvbmFsZCBMLiBSaXZlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgotKiogKEMpIDE5OTAgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKLSoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIF9fUAotIyBpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fR05VQ19fKQotIyAgZGVmaW5lIF9fUCh4KSB4Ci0jIGVsc2UKLSMgIGRlZmluZSBfX1AoeCkgKCkKLSMgZW5kaWYKLSNlbmRpZgotCi0KLS8qIE1Ec3RydWN0IGlzIHRoZSBkYXRhIHN0cnVjdHVyZSBmb3IgYSBtZXNzYWdlIGRpZ2VzdCBjb21wdXRhdGlvbi4KLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgaW50IGJ1ZmZlcls0XTsgLyogSG9sZHMgNC13b3JkIHJlc3VsdCBvZiBNRCBjb21wdXRhdGlvbiAqLwotCXVuc2lnbmVkIGNoYXIgY291bnRbOF07IC8qIE51bWJlciBvZiBiaXRzIHByb2Nlc3NlZCBzbyBmYXIgKi8KLQl1bnNpZ25lZCBpbnQgZG9uZTsgICAgICAvKiBOb256ZXJvIG1lYW5zIE1EIGNvbXB1dGF0aW9uIGZpbmlzaGVkICovCi19IE1ENF9DVFg7Ci0KLS8qIE1ENEluaXQoTUQ0X0NUWCAqKQotKiogSW5pdGlhbGl6ZSB0aGUgTUQ0X0NUWCBwcmVwYXRvcnkgdG8gZG9pbmcgYSBtZXNzYWdlIGRpZ2VzdAotKiogY29tcHV0YXRpb24uCi0qLwotZXh0ZXJuIHZvaWQgTUQ0SW5pdCBfX1AoKE1ENF9DVFggKk1EKSk7Ci0KLS8qIE1ENFVwZGF0ZShNRCxYLGNvdW50KQotKiogSW5wdXQ6IFggLS0gYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHVuc2lnbmVkIGNoYXJhY3RlcnMuCi0qKiAgICAgICAgY291bnQgLS0gdGhlIG51bWJlciBvZiBiaXRzIG9mIFggdG8gdXNlIChhbiB1bnNpZ25lZCBpbnQpLgotKiogVXBkYXRlcyBNRCB1c2luZyB0aGUgZmlyc3QgImNvdW50IiBiaXRzIG9mIFguCi0qKiBUaGUgYXJyYXkgcG9pbnRlZCB0byBieSBYIGlzIG5vdCBtb2RpZmllZC4KLSoqIElmIGNvdW50IGlzIG5vdCBhIG11bHRpcGxlIG9mIDgsIE1ENFVwZGF0ZSB1c2VzIGhpZ2ggYml0cyBvZgotKiogbGFzdCBieXRlLgotKiogVGhpcyBpcyB0aGUgYmFzaWMgaW5wdXQgcm91dGluZSBmb3IgYSB1c2VyLgotKiogVGhlIHJvdXRpbmUgdGVybWluYXRlcyB0aGUgTUQgY29tcHV0YXRpb24gd2hlbiBjb3VudCA8IDUxMiwgc28KLSoqIGV2ZXJ5IE1EIGNvbXB1dGF0aW9uIHNob3VsZCBlbmQgd2l0aCBvbmUgY2FsbCB0byBNRDRVcGRhdGUgd2l0aCBhCi0qKiBjb3VudCBsZXNzIHRoYW4gNTEyLiAgWmVybyBpcyBPSyBmb3IgYSBjb3VudC4KLSovCi1leHRlcm4gdm9pZCBNRDRVcGRhdGUgX19QKChNRDRfQ1RYICpNRCwgdW5zaWduZWQgY2hhciAqWCwgdW5zaWduZWQgaW50IGNvdW50KSk7Ci0KLS8qIE1ENFByaW50KE1EKQotKiogUHJpbnRzIG1lc3NhZ2UgZGlnZXN0IGJ1ZmZlciBNRCBhcyAzMiBoZXhhZGVjaW1hbCBkaWdpdHMuCi0qKiBPcmRlciBpcyBmcm9tIGxvdy1vcmRlciBieXRlIG9mIGJ1ZmZlclswXSB0byBoaWdoLW9yZGVyIGJ5dGUKLSoqIG9mIGJ1ZmZlclszXS4KLSoqIEVhY2ggYnl0ZSBpcyBwcmludGVkIHdpdGggaGlnaC1vcmRlciBoZXhhZGVjaW1hbCBkaWdpdCBmaXJzdC4KLSovCi1leHRlcm4gdm9pZCBNRDRQcmludCBfX1AoKE1ENF9DVFggKikpOwotCi0vKiBNRDRGaW5hbChidWYsIE1EKQotKiogUmV0dXJucyBtZXNzYWdlIGRpZ2VzdCBmcm9tIE1EIGFuZCB0ZXJtaW5hdGVzIHRoZSBtZXNzYWdlCi0qKiBkaWdlc3QgY29tcHV0YXRpb24uCi0qLwotZXh0ZXJuIHZvaWQgTUQ0RmluYWwgX19QKCh1bnNpZ25lZCBjaGFyICosIE1ENF9DVFggKikpOwotCi0vKgotKiogRW5kIG9mIG1kNC5oCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKGN1dCkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL3BwcGQvbWQ1LmMgYi9wcHBkL21kNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTI5MWNlLi4wMDAwMDAwCi0tLSBhL3BwcGQvbWQ1LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotCi0KLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKiBtZDUuYyAtLSB0aGUgc291cmNlIGNvZGUgZm9yIE1ENSByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAqKgotICoqIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0gICAgICAgICAgICAgICoqCi0gKiogQ3JlYXRlZDogMi8xNy85MCBSTFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKLSAqKiBSZXZpc2VkOiAxLzkxIFNSRCxBSixCU0ssSlQgUmVmZXJlbmNlIEMgdmVyLiwgNy8xMCBjb25zdGFudCBjb3JyLiAqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqIENvcHlyaWdodCAoQykgMTk5MCwgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICoqCi0gKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKLSAqKiBMaWNlbnNlIHRvIGNvcHkgYW5kIHVzZSB0aGlzIHNvZnR3YXJlIGlzIGdyYW50ZWQgcHJvdmlkZWQgdGhhdCAgICAqKgotICoqIGl0IGlzIGlkZW50aWZpZWQgYXMgdGhlICJSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZS0gICAgICoqCi0gKiogRGlnZXN0IEFsZ29yaXRobSIgaW4gYWxsIG1hdGVyaWFsIG1lbnRpb25pbmcgb3IgcmVmZXJlbmNpbmcgdGhpcyAgKioKLSAqKiBzb2Z0d2FyZSBvciB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgotICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCi0gKiogTGljZW5zZSBpcyBhbHNvIGdyYW50ZWQgdG8gbWFrZSBhbmQgdXNlIGRlcml2YXRpdmUgd29ya3MgICAgICAgICAgKioKLSAqKiBwcm92aWRlZCB0aGF0IHN1Y2ggd29ya3MgYXJlIGlkZW50aWZpZWQgYXMgImRlcml2ZWQgZnJvbSB0aGUgUlNBICAqKgotICoqIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobSIgaW4gYWxsICAgICAgICAgICoqCi0gKiogbWF0ZXJpYWwgbWVudGlvbmluZyBvciByZWZlcmVuY2luZyB0aGUgZGVyaXZlZCB3b3JrLiAgICAgICAgICAgICAgKioKLSAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgotICoqIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBjb25jZXJuaW5nICAgICAgICoqCi0gKiogZWl0aGVyIHRoZSBtZXJjaGFudGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBvciB0aGUgc3VpdGFiaWxpdHkgICAgKioKLSAqKiBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcGFydGljdWxhciBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzICAqKgotICoqIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eSBvZiBhbnkga2luZC4gICAgICAgICAgICAgICoqCi0gKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKLSAqKiBUaGVzZSBub3RpY2VzIG11c3QgYmUgcmV0YWluZWQgaW4gYW55IGNvcGllcyBvZiBhbnkgcGFydCBvZiB0aGlzICAqKgotICoqIGRvY3VtZW50YXRpb24gYW5kL29yIHNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAibWQ1LmgiCi0KLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKiAgTWVzc2FnZS1kaWdlc3Qgcm91dGluZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgotICoqICBUbyBmb3JtIHRoZSBtZXNzYWdlIGRpZ2VzdCBmb3IgYSBtZXNzYWdlIE0gICAgICAgICAgICAgICAgICAgICAgICoqCi0gKiogICAgKDEpIEluaXRpYWxpemUgYSBjb250ZXh0IGJ1ZmZlciBtZENvbnRleHQgdXNpbmcgTUQ1X0luaXQgICAgICAgKioKLSAqKiAgICAoMikgQ2FsbCBNRDVfVXBkYXRlIG9uIG1kQ29udGV4dCBhbmQgTSAgICAgICAgICAgICAgICAgICAgICAgICAqKgotICoqICAgICgzKSBDYWxsIE1ENV9GaW5hbCBvbiBtZENvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCi0gKiogIFRoZSBtZXNzYWdlIGRpZ2VzdCBpcyBub3cgaW4gbWRDb250ZXh0LT5kaWdlc3RbMC4uLjE1XSAgICAgICAgICAgKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KLXN0YXRpYyB2b2lkIFRyYW5zZm9ybSAoVUlOVDQgKmJ1ZiwgVUlOVDQgKmluKTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgUEFERElOR1s2NF0gPSB7Ci0gIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLS8qIEYsIEcsIEggYW5kIEkgYXJlIGJhc2ljIE1ENSBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgRih4LCB5LCB6KSAoKCh4KSAmICh5KSkgfCAoKH54KSAmICh6KSkpCi0jZGVmaW5lIEcoeCwgeSwgeikgKCgoeCkgJiAoeikpIHwgKCh5KSAmICh+eikpKQotI2RlZmluZSBIKHgsIHksIHopICgoeCkgXiAoeSkgXiAoeikpCi0jZGVmaW5lIEkoeCwgeSwgeikgKCh5KSBeICgoeCkgfCAofnopKSkKLQotLyogUk9UQVRFX0xFRlQgcm90YXRlcyB4IGxlZnQgbiBiaXRzICovCi0jZGVmaW5lIFJPVEFURV9MRUZUKHgsIG4pICgoKHgpIDw8IChuKSkgfCAoKHgpID4+ICgzMi0obikpKSkKLQotLyogRkYsIEdHLCBISCwgYW5kIElJIHRyYW5zZm9ybWF0aW9ucyBmb3Igcm91bmRzIDEsIDIsIDMsIGFuZCA0ICovCi0vKiBSb3RhdGlvbiBpcyBzZXBhcmF0ZSBmcm9tIGFkZGl0aW9uIHRvIHByZXZlbnQgcmVjb21wdXRhdGlvbiAqLwotI2RlZmluZSBGRihhLCBiLCBjLCBkLCB4LCBzLCBhYykgXAotICB7KGEpICs9IEYgKChiKSwgKGMpLCAoZCkpICsgKHgpICsgKFVJTlQ0KShhYyk7IFwKLSAgIChhKSA9IFJPVEFURV9MRUZUICgoYSksIChzKSk7IFwKLSAgIChhKSArPSAoYik7IFwKLSAgfQotI2RlZmluZSBHRyhhLCBiLCBjLCBkLCB4LCBzLCBhYykgXAotICB7KGEpICs9IEcgKChiKSwgKGMpLCAoZCkpICsgKHgpICsgKFVJTlQ0KShhYyk7IFwKLSAgIChhKSA9IFJPVEFURV9MRUZUICgoYSksIChzKSk7IFwKLSAgIChhKSArPSAoYik7IFwKLSAgfQotI2RlZmluZSBISChhLCBiLCBjLCBkLCB4LCBzLCBhYykgXAotICB7KGEpICs9IEggKChiKSwgKGMpLCAoZCkpICsgKHgpICsgKFVJTlQ0KShhYyk7IFwKLSAgIChhKSA9IFJPVEFURV9MRUZUICgoYSksIChzKSk7IFwKLSAgIChhKSArPSAoYik7IFwKLSAgfQotI2RlZmluZSBJSShhLCBiLCBjLCBkLCB4LCBzLCBhYykgXAotICB7KGEpICs9IEkgKChiKSwgKGMpLCAoZCkpICsgKHgpICsgKFVJTlQ0KShhYyk7IFwKLSAgIChhKSA9IFJPVEFURV9MRUZUICgoYSksIChzKSk7IFwKLSAgIChhKSArPSAoYik7IFwKLSAgfQotCi0jaWZkZWYgX19TVERDX18KLSNkZWZpbmUgVUwoeCkJeCMjVQotI2Vsc2UKLSNkZWZpbmUgVUwoeCkJeAotI2VuZGlmCi0KLS8qIFRoZSByb3V0aW5lIE1ENV9Jbml0IGluaXRpYWxpemVzIHRoZSBtZXNzYWdlLWRpZ2VzdCBjb250ZXh0Ci0gICBtZENvbnRleHQuIEFsbCBmaWVsZHMgYXJlIHNldCB0byB6ZXJvLgotICovCi12b2lkIE1ENV9Jbml0IChtZENvbnRleHQpCi1NRDVfQ1RYICptZENvbnRleHQ7Ci17Ci0gIG1kQ29udGV4dC0+aVswXSA9IG1kQ29udGV4dC0+aVsxXSA9IChVSU5UNCkwOwotCi0gIC8qIExvYWQgbWFnaWMgaW5pdGlhbGl6YXRpb24gY29uc3RhbnRzLgotICAgKi8KLSAgbWRDb250ZXh0LT5idWZbMF0gPSAoVUlOVDQpMHg2NzQ1MjMwMTsKLSAgbWRDb250ZXh0LT5idWZbMV0gPSAoVUlOVDQpMHhlZmNkYWI4OTsKLSAgbWRDb250ZXh0LT5idWZbMl0gPSAoVUlOVDQpMHg5OGJhZGNmZTsKLSAgbWRDb250ZXh0LT5idWZbM10gPSAoVUlOVDQpMHgxMDMyNTQ3NjsKLX0KLQotLyogVGhlIHJvdXRpbmUgTUQ1VXBkYXRlIHVwZGF0ZXMgdGhlIG1lc3NhZ2UtZGlnZXN0IGNvbnRleHQgdG8KLSAgIGFjY291bnQgZm9yIHRoZSBwcmVzZW5jZSBvZiBlYWNoIG9mIHRoZSBjaGFyYWN0ZXJzIGluQnVmWzAuLmluTGVuLTFdCi0gICBpbiB0aGUgbWVzc2FnZSB3aG9zZSBkaWdlc3QgaXMgYmVpbmcgY29tcHV0ZWQuCi0gKi8KLXZvaWQgTUQ1X1VwZGF0ZSAobWRDb250ZXh0LCBpbkJ1ZiwgaW5MZW4pCi1NRDVfQ1RYICptZENvbnRleHQ7Ci11bnNpZ25lZCBjaGFyICppbkJ1ZjsKLXVuc2lnbmVkIGludCBpbkxlbjsKLXsKLSAgVUlOVDQgaW5bMTZdOwotICBpbnQgbWRpOwotICB1bnNpZ25lZCBpbnQgaSwgaWk7Ci0KLSAgLyogY29tcHV0ZSBudW1iZXIgb2YgYnl0ZXMgbW9kIDY0ICovCi0gIG1kaSA9IChpbnQpKChtZENvbnRleHQtPmlbMF0gPj4gMykgJiAweDNGKTsKLQotICAvKiB1cGRhdGUgbnVtYmVyIG9mIGJpdHMgKi8KLSAgaWYgKChtZENvbnRleHQtPmlbMF0gKyAoKFVJTlQ0KWluTGVuIDw8IDMpKSA8IG1kQ29udGV4dC0+aVswXSkKLSAgICBtZENvbnRleHQtPmlbMV0rKzsKLSAgbWRDb250ZXh0LT5pWzBdICs9ICgoVUlOVDQpaW5MZW4gPDwgMyk7Ci0gIG1kQ29udGV4dC0+aVsxXSArPSAoKFVJTlQ0KWluTGVuID4+IDI5KTsKLQotICB3aGlsZSAoaW5MZW4tLSkgewotICAgIC8qIGFkZCBuZXcgY2hhcmFjdGVyIHRvIGJ1ZmZlciwgaW5jcmVtZW50IG1kaSAqLwotICAgIG1kQ29udGV4dC0+aW5bbWRpKytdID0gKmluQnVmKys7Ci0KLSAgICAvKiB0cmFuc2Zvcm0gaWYgbmVjZXNzYXJ5ICovCi0gICAgaWYgKG1kaSA9PSAweDQwKSB7Ci0gICAgICBmb3IgKGkgPSAwLCBpaSA9IDA7IGkgPCAxNjsgaSsrLCBpaSArPSA0KQotICAgICAgICBpbltpXSA9ICgoKFVJTlQ0KW1kQ29udGV4dC0+aW5baWkrM10pIDw8IDI0KSB8Ci0gICAgICAgICAgICAgICAgKCgoVUlOVDQpbWRDb250ZXh0LT5pbltpaSsyXSkgPDwgMTYpIHwKLSAgICAgICAgICAgICAgICAoKChVSU5UNCltZENvbnRleHQtPmluW2lpKzFdKSA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgKChVSU5UNCltZENvbnRleHQtPmluW2lpXSk7Ci0gICAgICBUcmFuc2Zvcm0gKG1kQ29udGV4dC0+YnVmLCBpbik7Ci0gICAgICBtZGkgPSAwOwotICAgIH0KLSAgfQotfQotCi0vKiBUaGUgcm91dGluZSBNRDVGaW5hbCB0ZXJtaW5hdGVzIHRoZSBtZXNzYWdlLWRpZ2VzdCBjb21wdXRhdGlvbiBhbmQKLSAgIGVuZHMgd2l0aCB0aGUgZGVzaXJlZCBtZXNzYWdlIGRpZ2VzdCBpbiBtZENvbnRleHQtPmRpZ2VzdFswLi4uMTVdLgotICovCi12b2lkIE1ENV9GaW5hbCAoaGFzaCwgbWRDb250ZXh0KQotdW5zaWduZWQgY2hhciBoYXNoW107Ci1NRDVfQ1RYICptZENvbnRleHQ7Ci17Ci0gIFVJTlQ0IGluWzE2XTsKLSAgaW50IG1kaTsKLSAgdW5zaWduZWQgaW50IGksIGlpOwotICB1bnNpZ25lZCBpbnQgcGFkTGVuOwotCi0gIC8qIHNhdmUgbnVtYmVyIG9mIGJpdHMgKi8KLSAgaW5bMTRdID0gbWRDb250ZXh0LT5pWzBdOwotICBpblsxNV0gPSBtZENvbnRleHQtPmlbMV07Ci0KLSAgLyogY29tcHV0ZSBudW1iZXIgb2YgYnl0ZXMgbW9kIDY0ICovCi0gIG1kaSA9IChpbnQpKChtZENvbnRleHQtPmlbMF0gPj4gMykgJiAweDNGKTsKLQotICAvKiBwYWQgb3V0IHRvIDU2IG1vZCA2NCAqLwotICBwYWRMZW4gPSAobWRpIDwgNTYpID8gKDU2IC0gbWRpKSA6ICgxMjAgLSBtZGkpOwotICBNRDVfVXBkYXRlIChtZENvbnRleHQsIFBBRERJTkcsIHBhZExlbik7Ci0KLSAgLyogYXBwZW5kIGxlbmd0aCBpbiBiaXRzIGFuZCB0cmFuc2Zvcm0gKi8KLSAgZm9yIChpID0gMCwgaWkgPSAwOyBpIDwgMTQ7IGkrKywgaWkgKz0gNCkKLSAgICBpbltpXSA9ICgoKFVJTlQ0KW1kQ29udGV4dC0+aW5baWkrM10pIDw8IDI0KSB8Ci0gICAgICAgICAgICAoKChVSU5UNCltZENvbnRleHQtPmluW2lpKzJdKSA8PCAxNikgfAotICAgICAgICAgICAgKCgoVUlOVDQpbWRDb250ZXh0LT5pbltpaSsxXSkgPDwgOCkgfAotICAgICAgICAgICAgKChVSU5UNCltZENvbnRleHQtPmluW2lpXSk7Ci0gIFRyYW5zZm9ybSAobWRDb250ZXh0LT5idWYsIGluKTsKLQotICAvKiBzdG9yZSBidWZmZXIgaW4gZGlnZXN0ICovCi0gIGZvciAoaSA9IDAsIGlpID0gMDsgaSA8IDQ7IGkrKywgaWkgKz0gNCkgewotICAgIG1kQ29udGV4dC0+ZGlnZXN0W2lpXSA9ICh1bnNpZ25lZCBjaGFyKShtZENvbnRleHQtPmJ1ZltpXSAmIDB4RkYpOwotICAgIG1kQ29udGV4dC0+ZGlnZXN0W2lpKzFdID0KLSAgICAgICh1bnNpZ25lZCBjaGFyKSgobWRDb250ZXh0LT5idWZbaV0gPj4gOCkgJiAweEZGKTsKLSAgICBtZENvbnRleHQtPmRpZ2VzdFtpaSsyXSA9Ci0gICAgICAodW5zaWduZWQgY2hhcikoKG1kQ29udGV4dC0+YnVmW2ldID4+IDE2KSAmIDB4RkYpOwotICAgIG1kQ29udGV4dC0+ZGlnZXN0W2lpKzNdID0KLSAgICAgICh1bnNpZ25lZCBjaGFyKSgobWRDb250ZXh0LT5idWZbaV0gPj4gMjQpICYgMHhGRik7Ci0gIH0KLSAgbWVtY3B5KGhhc2gsIG1kQ29udGV4dC0+ZGlnZXN0LCAxNik7Ci19Ci0KLS8qIEJhc2ljIE1ENSBzdGVwLiBUcmFuc2Zvcm1zIGJ1ZiBiYXNlZCBvbiBpbi4KLSAqLwotc3RhdGljIHZvaWQgVHJhbnNmb3JtIChidWYsIGluKQotVUlOVDQgKmJ1ZjsKLVVJTlQ0ICppbjsKLXsKLSAgVUlOVDQgYSA9IGJ1ZlswXSwgYiA9IGJ1ZlsxXSwgYyA9IGJ1ZlsyXSwgZCA9IGJ1ZlszXTsKLQotICAvKiBSb3VuZCAxICovCi0jZGVmaW5lIFMxMSA3Ci0jZGVmaW5lIFMxMiAxMgotI2RlZmluZSBTMTMgMTcKLSNkZWZpbmUgUzE0IDIyCi0gIEZGICggYSwgYiwgYywgZCwgaW5bIDBdLCBTMTEsIFVMKDM2MTQwOTAzNjApKTsgLyogMSAqLwotICBGRiAoIGQsIGEsIGIsIGMsIGluWyAxXSwgUzEyLCBVTCgzOTA1NDAyNzEwKSk7IC8qIDIgKi8KLSAgRkYgKCBjLCBkLCBhLCBiLCBpblsgMl0sIFMxMywgVUwoIDYwNjEwNTgxOSkpOyAvKiAzICovCi0gIEZGICggYiwgYywgZCwgYSwgaW5bIDNdLCBTMTQsIFVMKDMyNTA0NDE5NjYpKTsgLyogNCAqLwotICBGRiAoIGEsIGIsIGMsIGQsIGluWyA0XSwgUzExLCBVTCg0MTE4NTQ4Mzk5KSk7IC8qIDUgKi8KLSAgRkYgKCBkLCBhLCBiLCBjLCBpblsgNV0sIFMxMiwgVUwoMTIwMDA4MDQyNikpOyAvKiA2ICovCi0gIEZGICggYywgZCwgYSwgYiwgaW5bIDZdLCBTMTMsIFVMKDI4MjE3MzU5NTUpKTsgLyogNyAqLwotICBGRiAoIGIsIGMsIGQsIGEsIGluWyA3XSwgUzE0LCBVTCg0MjQ5MjYxMzEzKSk7IC8qIDggKi8KLSAgRkYgKCBhLCBiLCBjLCBkLCBpblsgOF0sIFMxMSwgVUwoMTc3MDAzNTQxNikpOyAvKiA5ICovCi0gIEZGICggZCwgYSwgYiwgYywgaW5bIDldLCBTMTIsIFVMKDIzMzY1NTI4NzkpKTsgLyogMTAgKi8KLSAgRkYgKCBjLCBkLCBhLCBiLCBpblsxMF0sIFMxMywgVUwoNDI5NDkyNTIzMykpOyAvKiAxMSAqLwotICBGRiAoIGIsIGMsIGQsIGEsIGluWzExXSwgUzE0LCBVTCgyMzA0NTYzMTM0KSk7IC8qIDEyICovCi0gIEZGICggYSwgYiwgYywgZCwgaW5bMTJdLCBTMTEsIFVMKDE4MDQ2MDM2ODIpKTsgLyogMTMgKi8KLSAgRkYgKCBkLCBhLCBiLCBjLCBpblsxM10sIFMxMiwgVUwoNDI1NDYyNjE5NSkpOyAvKiAxNCAqLwotICBGRiAoIGMsIGQsIGEsIGIsIGluWzE0XSwgUzEzLCBVTCgyNzkyOTY1MDA2KSk7IC8qIDE1ICovCi0gIEZGICggYiwgYywgZCwgYSwgaW5bMTVdLCBTMTQsIFVMKDEyMzY1MzUzMjkpKTsgLyogMTYgKi8KLQotICAvKiBSb3VuZCAyICovCi0jZGVmaW5lIFMyMSA1Ci0jZGVmaW5lIFMyMiA5Ci0jZGVmaW5lIFMyMyAxNAotI2RlZmluZSBTMjQgMjAKLSAgR0cgKCBhLCBiLCBjLCBkLCBpblsgMV0sIFMyMSwgVUwoNDEyOTE3MDc4NikpOyAvKiAxNyAqLwotICBHRyAoIGQsIGEsIGIsIGMsIGluWyA2XSwgUzIyLCBVTCgzMjI1NDY1NjY0KSk7IC8qIDE4ICovCi0gIEdHICggYywgZCwgYSwgYiwgaW5bMTFdLCBTMjMsIFVMKCA2NDM3MTc3MTMpKTsgLyogMTkgKi8KLSAgR0cgKCBiLCBjLCBkLCBhLCBpblsgMF0sIFMyNCwgVUwoMzkyMTA2OTk5NCkpOyAvKiAyMCAqLwotICBHRyAoIGEsIGIsIGMsIGQsIGluWyA1XSwgUzIxLCBVTCgzNTkzNDA4NjA1KSk7IC8qIDIxICovCi0gIEdHICggZCwgYSwgYiwgYywgaW5bMTBdLCBTMjIsIFVMKCAgMzgwMTYwODMpKTsgLyogMjIgKi8KLSAgR0cgKCBjLCBkLCBhLCBiLCBpblsxNV0sIFMyMywgVUwoMzYzNDQ4ODk2MSkpOyAvKiAyMyAqLwotICBHRyAoIGIsIGMsIGQsIGEsIGluWyA0XSwgUzI0LCBVTCgzODg5NDI5NDQ4KSk7IC8qIDI0ICovCi0gIEdHICggYSwgYiwgYywgZCwgaW5bIDldLCBTMjEsIFVMKCA1Njg0NDY0MzgpKTsgLyogMjUgKi8KLSAgR0cgKCBkLCBhLCBiLCBjLCBpblsxNF0sIFMyMiwgVUwoMzI3NTE2MzYwNikpOyAvKiAyNiAqLwotICBHRyAoIGMsIGQsIGEsIGIsIGluWyAzXSwgUzIzLCBVTCg0MTA3NjAzMzM1KSk7IC8qIDI3ICovCi0gIEdHICggYiwgYywgZCwgYSwgaW5bIDhdLCBTMjQsIFVMKDExNjM1MzE1MDEpKTsgLyogMjggKi8KLSAgR0cgKCBhLCBiLCBjLCBkLCBpblsxM10sIFMyMSwgVUwoMjg1MDI4NTgyOSkpOyAvKiAyOSAqLwotICBHRyAoIGQsIGEsIGIsIGMsIGluWyAyXSwgUzIyLCBVTCg0MjQzNTYzNTEyKSk7IC8qIDMwICovCi0gIEdHICggYywgZCwgYSwgYiwgaW5bIDddLCBTMjMsIFVMKDE3MzUzMjg0NzMpKTsgLyogMzEgKi8KLSAgR0cgKCBiLCBjLCBkLCBhLCBpblsxMl0sIFMyNCwgVUwoMjM2ODM1OTU2MikpOyAvKiAzMiAqLwotCi0gIC8qIFJvdW5kIDMgKi8KLSNkZWZpbmUgUzMxIDQKLSNkZWZpbmUgUzMyIDExCi0jZGVmaW5lIFMzMyAxNgotI2RlZmluZSBTMzQgMjMKLSAgSEggKCBhLCBiLCBjLCBkLCBpblsgNV0sIFMzMSwgVUwoNDI5NDU4ODczOCkpOyAvKiAzMyAqLwotICBISCAoIGQsIGEsIGIsIGMsIGluWyA4XSwgUzMyLCBVTCgyMjcyMzkyODMzKSk7IC8qIDM0ICovCi0gIEhIICggYywgZCwgYSwgYiwgaW5bMTFdLCBTMzMsIFVMKDE4MzkwMzA1NjIpKTsgLyogMzUgKi8KLSAgSEggKCBiLCBjLCBkLCBhLCBpblsxNF0sIFMzNCwgVUwoNDI1OTY1Nzc0MCkpOyAvKiAzNiAqLwotICBISCAoIGEsIGIsIGMsIGQsIGluWyAxXSwgUzMxLCBVTCgyNzYzOTc1MjM2KSk7IC8qIDM3ICovCi0gIEhIICggZCwgYSwgYiwgYywgaW5bIDRdLCBTMzIsIFVMKDEyNzI4OTMzNTMpKTsgLyogMzggKi8KLSAgSEggKCBjLCBkLCBhLCBiLCBpblsgN10sIFMzMywgVUwoNDEzOTQ2OTY2NCkpOyAvKiAzOSAqLwotICBISCAoIGIsIGMsIGQsIGEsIGluWzEwXSwgUzM0LCBVTCgzMjAwMjM2NjU2KSk7IC8qIDQwICovCi0gIEhIICggYSwgYiwgYywgZCwgaW5bMTNdLCBTMzEsIFVMKCA2ODEyNzkxNzQpKTsgLyogNDEgKi8KLSAgSEggKCBkLCBhLCBiLCBjLCBpblsgMF0sIFMzMiwgVUwoMzkzNjQzMDA3NCkpOyAvKiA0MiAqLwotICBISCAoIGMsIGQsIGEsIGIsIGluWyAzXSwgUzMzLCBVTCgzNTcyNDQ1MzE3KSk7IC8qIDQzICovCi0gIEhIICggYiwgYywgZCwgYSwgaW5bIDZdLCBTMzQsIFVMKCAgNzYwMjkxODkpKTsgLyogNDQgKi8KLSAgSEggKCBhLCBiLCBjLCBkLCBpblsgOV0sIFMzMSwgVUwoMzY1NDYwMjgwOSkpOyAvKiA0NSAqLwotICBISCAoIGQsIGEsIGIsIGMsIGluWzEyXSwgUzMyLCBVTCgzODczMTUxNDYxKSk7IC8qIDQ2ICovCi0gIEhIICggYywgZCwgYSwgYiwgaW5bMTVdLCBTMzMsIFVMKCA1MzA3NDI1MjApKTsgLyogNDcgKi8KLSAgSEggKCBiLCBjLCBkLCBhLCBpblsgMl0sIFMzNCwgVUwoMzI5OTYyODY0NSkpOyAvKiA0OCAqLwotCi0gIC8qIFJvdW5kIDQgKi8KLSNkZWZpbmUgUzQxIDYKLSNkZWZpbmUgUzQyIDEwCi0jZGVmaW5lIFM0MyAxNQotI2RlZmluZSBTNDQgMjEKLSAgSUkgKCBhLCBiLCBjLCBkLCBpblsgMF0sIFM0MSwgVUwoNDA5NjMzNjQ1MikpOyAvKiA0OSAqLwotICBJSSAoIGQsIGEsIGIsIGMsIGluWyA3XSwgUzQyLCBVTCgxMTI2ODkxNDE1KSk7IC8qIDUwICovCi0gIElJICggYywgZCwgYSwgYiwgaW5bMTRdLCBTNDMsIFVMKDI4Nzg2MTIzOTEpKTsgLyogNTEgKi8KLSAgSUkgKCBiLCBjLCBkLCBhLCBpblsgNV0sIFM0NCwgVUwoNDIzNzUzMzI0MSkpOyAvKiA1MiAqLwotICBJSSAoIGEsIGIsIGMsIGQsIGluWzEyXSwgUzQxLCBVTCgxNzAwNDg1NTcxKSk7IC8qIDUzICovCi0gIElJICggZCwgYSwgYiwgYywgaW5bIDNdLCBTNDIsIFVMKDIzOTk5ODA2OTApKTsgLyogNTQgKi8KLSAgSUkgKCBjLCBkLCBhLCBiLCBpblsxMF0sIFM0MywgVUwoNDI5MzkxNTc3MykpOyAvKiA1NSAqLwotICBJSSAoIGIsIGMsIGQsIGEsIGluWyAxXSwgUzQ0LCBVTCgyMjQwMDQ0NDk3KSk7IC8qIDU2ICovCi0gIElJICggYSwgYiwgYywgZCwgaW5bIDhdLCBTNDEsIFVMKDE4NzMzMTMzNTkpKTsgLyogNTcgKi8KLSAgSUkgKCBkLCBhLCBiLCBjLCBpblsxNV0sIFM0MiwgVUwoNDI2NDM1NTU1MikpOyAvKiA1OCAqLwotICBJSSAoIGMsIGQsIGEsIGIsIGluWyA2XSwgUzQzLCBVTCgyNzM0NzY4OTE2KSk7IC8qIDU5ICovCi0gIElJICggYiwgYywgZCwgYSwgaW5bMTNdLCBTNDQsIFVMKDEzMDkxNTE2NDkpKTsgLyogNjAgKi8KLSAgSUkgKCBhLCBiLCBjLCBkLCBpblsgNF0sIFM0MSwgVUwoNDE0OTQ0NDIyNikpOyAvKiA2MSAqLwotICBJSSAoIGQsIGEsIGIsIGMsIGluWzExXSwgUzQyLCBVTCgzMTc0NzU2OTE3KSk7IC8qIDYyICovCi0gIElJICggYywgZCwgYSwgYiwgaW5bIDJdLCBTNDMsIFVMKCA3MTg3ODcyNTkpKTsgLyogNjMgKi8KLSAgSUkgKCBiLCBjLCBkLCBhLCBpblsgOV0sIFM0NCwgVUwoMzk1MTQ4MTc0NSkpOyAvKiA2NCAqLwotCi0gIGJ1ZlswXSArPSBhOwotICBidWZbMV0gKz0gYjsKLSAgYnVmWzJdICs9IGM7Ci0gIGJ1ZlszXSArPSBkOwotfQotCi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiogRW5kIG9mIG1kNS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAoY3V0KSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCmRpZmYgLS1naXQgYS9wcHBkL21kNS5oIGIvcHBwZC9tZDUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFlOGIwMC4uMDAwMDAwMAotLS0gYS9wcHBkL21kNS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqIG1kNS5oIC0tIGhlYWRlciBmaWxlIGZvciBpbXBsZW1lbnRhdGlvbiBvZiBNRDUgICAgICAgICAgICAgICAgICAgICoqCi0gKiogUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobSAgICAgICAgICAgICAgKioKLSAqKiBDcmVhdGVkOiAyLzE3LzkwIFJMUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgotICoqIFJldmlzZWQ6IDEyLzI3LzkwIFNSRCxBSixCU0ssSlQgUmVmZXJlbmNlIEMgdmVyc2lvbiAgICAgICAgICAgICAgICoqCi0gKiogUmV2aXNlZCAoZm9yIE1ENSk6IFJMUiA0LzI3LzkxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKLSAqKiAgIC0tIEcgbW9kaWZpZWQgdG8gaGF2ZSB5Jn56IGluc3RlYWQgb2YgeSZ6ICAgICAgICAgICAgICAgICAgICAgICAqKgotICoqICAgLS0gRkYsIEdHLCBISCBtb2RpZmllZCB0byBhZGQgaW4gbGFzdCByZWdpc3RlciBkb25lICAgICAgICAgICAgICoqCi0gKiogICAtLSBBY2Nlc3MgcGF0dGVybjogcm91bmQgMiB3b3JrcyBtb2QgNSwgcm91bmQgMyB3b3JrcyBtb2QgMyAgICAgKioKLSAqKiAgIC0tIGRpc3RpbmN0IGFkZGl0aXZlIGNvbnN0YW50IGZvciBlYWNoIHN0ZXAgICAgICAgICAgICAgICAgICAgICAqKgotICoqICAgLS0gcm91bmQgNCBhZGRlZCwgd29ya2luZyBtb2QgNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiogQ29weXJpZ2h0IChDKSAxOTkwLCBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgKioKLSAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgotICoqIExpY2Vuc2UgdG8gY29weSBhbmQgdXNlIHRoaXMgc29mdHdhcmUgaXMgZ3JhbnRlZCBwcm92aWRlZCB0aGF0ICAgICoqCi0gKiogaXQgaXMgaWRlbnRpZmllZCBhcyB0aGUgIlJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlLSAgICAgKioKLSAqKiBEaWdlc3QgQWxnb3JpdGhtIiBpbiBhbGwgbWF0ZXJpYWwgbWVudGlvbmluZyBvciByZWZlcmVuY2luZyB0aGlzICAqKgotICoqIHNvZnR3YXJlIG9yIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCi0gKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKLSAqKiBMaWNlbnNlIGlzIGFsc28gZ3JhbnRlZCB0byBtYWtlIGFuZCB1c2UgZGVyaXZhdGl2ZSB3b3JrcyAgICAgICAgICAqKgotICoqIHByb3ZpZGVkIHRoYXQgc3VjaCB3b3JrcyBhcmUgaWRlbnRpZmllZCBhcyAiZGVyaXZlZCBmcm9tIHRoZSBSU0EgICoqCi0gKiogRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtIiBpbiBhbGwgICAgICAgICAgKioKLSAqKiBtYXRlcmlhbCBtZW50aW9uaW5nIG9yIHJlZmVyZW5jaW5nIHRoZSBkZXJpdmVkIHdvcmsuICAgICAgICAgICAgICAqKgotICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCi0gKiogUlNBIERhdGEgU2VjdXJpdHksIEluYy4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGNvbmNlcm5pbmcgICAgICAgKioKLSAqKiBlaXRoZXIgdGhlIG1lcmNoYW50YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIG9yIHRoZSBzdWl0YWJpbGl0eSAgICAqKgotICoqIG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgICoqCi0gKiogaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5IG9mIGFueSBraW5kLiAgICAgICAgICAgICAgKioKLSAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgotICoqIFRoZXNlIG5vdGljZXMgbXVzdCBiZSByZXRhaW5lZCBpbiBhbnkgY29waWVzIG9mIGFueSBwYXJ0IG9mIHRoaXMgICoqCi0gKiogZG9jdW1lbnRhdGlvbiBhbmQvb3Igc29mdHdhcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX19NRDVfSU5DTFVERV9fCi0KLS8qIHR5cGVkZWYgYSAzMi1iaXQgdHlwZSAqLwotI2lmZGVmIF9MUDY0Ci10eXBlZGVmIHVuc2lnbmVkIGludCBVSU5UNDsKLXR5cGVkZWYgaW50ICAgICAgICAgIElOVDQ7Ci0jZWxzZQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIFVJTlQ0OwotdHlwZWRlZiBsb25nICAgICAgICAgIElOVDQ7Ci0jZW5kaWYKLSNkZWZpbmUgX1VJTlQ0X1QKLQotLyogRGF0YSBzdHJ1Y3R1cmUgZm9yIE1ENSAoTWVzc2FnZS1EaWdlc3QpIGNvbXB1dGF0aW9uICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFVJTlQ0IGlbMl07ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBfYml0c18gaGFuZGxlZCBtb2QgMl42NCAqLwotICBVSU5UNCBidWZbNF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NyYXRjaCBidWZmZXIgKi8KLSAgdW5zaWduZWQgY2hhciBpbls2NF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgYnVmZmVyICovCi0gIHVuc2lnbmVkIGNoYXIgZGlnZXN0WzE2XTsgICAgIC8qIGFjdHVhbCBkaWdlc3QgYWZ0ZXIgTUQ1RmluYWwgY2FsbCAqLwotfSBNRDVfQ1RYOwotCi12b2lkIE1ENV9Jbml0IChNRDVfQ1RYICptZENvbnRleHQpOwotdm9pZCBNRDVfVXBkYXRlIChNRDVfQ1RYICptZENvbnRleHQsIHVuc2lnbmVkIGNoYXIgKmluQnVmLCB1bnNpZ25lZCBpbnQgaW5MZW4pOwotdm9pZCBNRDVfRmluYWwgKHVuc2lnbmVkIGNoYXIgaGFzaFtdLCBNRDVfQ1RYICptZENvbnRleHQpOwotCi0jZGVmaW5lIF9fTUQ1X0lOQ0xVREVfXwotI2VuZGlmIC8qIF9fTUQ1X0lOQ0xVREVfXyAqLwpkaWZmIC0tZ2l0IGEvcHBwZC9tcHBlLmggYi9wcHBkL21wcGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWViM2IzNy4uMDAwMDAwMAotLS0gYS9wcHBkL21wcGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKgotICogbXBwZS5oIC0gRGVmaW5pdGlvbnMgZm9yIE1QUEUKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggUGF1bCBNYWNrZXJyYXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIDQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgUGF1bCBNYWNrZXJyYXMKLSAqICAgICA8cGF1bHVzQHNhbWJhLm9yZz4iLgotICoKLSAqIFRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLSAqIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotICogQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2RlZmluZSBNUFBFX1BBRAkJNAkvKiBNUFBFIGdyb3d0aCBwZXIgZnJhbWUgKi8KLSNkZWZpbmUgTVBQRV9NQVhfS0VZX0xFTgkxNgkvKiBsYXJnZXN0IGtleSBsZW5ndGggKDEyOC1iaXQpICovCi0KLS8qIG9wdGlvbiBiaXRzIGZvciBjY3Bfb3B0aW9ucy5tcHBlICovCi0jZGVmaW5lIE1QUEVfT1BUXzQwCQkweDAxCS8qIDQwIGJpdCAqLwotI2RlZmluZSBNUFBFX09QVF8xMjgJCTB4MDIJLyogMTI4IGJpdCAqLwotI2RlZmluZSBNUFBFX09QVF9TVEFURUZVTAkweDA0CS8qIHN0YXRlZnVsIG1vZGUgKi8KLS8qIHVuc3VwcG9ydGVkIG9wdHMgKi8KLSNkZWZpbmUgTVBQRV9PUFRfNTYJCTB4MDgJLyogNTYgYml0ICovCi0jZGVmaW5lIE1QUEVfT1BUX01QUEMJCTB4MTAJLyogTVBQQyBjb21wcmVzc2lvbiAqLwotI2RlZmluZSBNUFBFX09QVF9ECQkweDIwCS8qIFVua25vd24gKi8KLSNkZWZpbmUgTVBQRV9PUFRfVU5TVVBQT1JURUQgKE1QUEVfT1BUXzU2fE1QUEVfT1BUX01QUEN8TVBQRV9PUFRfRCkKLSNkZWZpbmUgTVBQRV9PUFRfVU5LTk9XTgkweDQwCS8qIEJpdHMgIWRlZmluZWQgaW4gUkZDIDMwNzggd2VyZSBzZXQgKi8KLQotLyoKLSAqIFRoaXMgaXMgbm90IG5pY2UgLi4uIHRoZSBhbHRlcm5hdGl2ZSBpcyBhIGJpdGZpZWxkIHN0cnVjdCB0aG91Z2guCi0gKiBBbmQgdW5mb3J0dW5hdGVseSwgd2UgY2Fubm90IHNoYXJlIHRoZSBzYW1lIGJpdHMgZm9yIHRoZSBvcHRpb24KLSAqIG5hbWVzIGFib3ZlIHNpbmNlIEMgYW5kIEggYXJlIHRoZSBzYW1lIGJpdC4gIFdlIGNvdWxkIGRvIGEgdV9pbnQzMgotICogYnV0IHRoZW4gd2UgaGF2ZSB0byBkbyBhIGh0b25sKCkgYWxsIHRoZSB0aW1lIGFuZC9vciB3ZSBzdGlsbCBuZWVkCi0gKiB0byBrbm93IHdoaWNoIG9jdGV0IGlzIHdoaWNoLgotICovCi0jZGVmaW5lIE1QUEVfQ19CSVQJCTB4MDEJLyogTVBQQyAqLwotI2RlZmluZSBNUFBFX0RfQklUCQkweDEwCS8qIE9ic29sZXRlLCB1c2FnZSB1bmtub3duICovCi0jZGVmaW5lIE1QUEVfTF9CSVQJCTB4MjAJLyogNDAtYml0ICovCi0jZGVmaW5lIE1QUEVfU19CSVQJCTB4NDAJLyogMTI4LWJpdCAqLwotI2RlZmluZSBNUFBFX01fQklUCQkweDgwCS8qIDU2LWJpdCwgbm90IHN1cHBvcnRlZCAqLwotI2RlZmluZSBNUFBFX0hfQklUCQkweDAxCS8qIFN0YXRlbGVzcyAoaW4gYSBkaWZmZXJlbnQgYnl0ZSkgKi8KLQotLyogRG9lcyBub3QgaW5jbHVkZSBIIGJpdDsgdXNlZCBmb3IgbGVhc3Qgc2lnbmlmaWNhbnQgb2N0ZXQgb25seS4gKi8KLSNkZWZpbmUgTVBQRV9BTExfQklUUyAoTVBQRV9EX0JJVHxNUFBFX0xfQklUfE1QUEVfU19CSVR8TVBQRV9NX0JJVHxNUFBFX0hfQklUKQotCi0vKiBCdWlsZCBhIENJIGZyb20gbXBwZSBvcHRzIChzZWUgUkZDIDMwNzgpICovCi0jZGVmaW5lIE1QUEVfT1BUU19UT19DSShvcHRzLCBjaSkJCVwKLSAgICBkbyB7CQkJCQlcCi0JdV9jaGFyICpwdHIgPSBjaTsgLyogdV9jaGFyWzRdICovCVwKLQkJCQkJCVwKLQkvKiBIIGJpdCAqLwkJCQlcCi0JaWYgKG9wdHMgJiBNUFBFX09QVF9TVEFURUZVTCkJCVwKLQkgICAgKnB0cisrID0gMHgwOwkJCVwKLQllbHNlCQkJCQlcCi0JICAgICpwdHIrKyA9IE1QUEVfSF9CSVQ7CQlcCi0JKnB0cisrID0gMDsJCQkJXAotCSpwdHIrKyA9IDA7CQkJCVwKLQkJCQkJCVwKLQkvKiBTLEwgYml0cyAqLwkJCQlcCi0JKnB0ciA9IDA7CQkJCVwKLQlpZiAob3B0cyAmIE1QUEVfT1BUXzEyOCkJCVwKLQkgICAgKnB0ciB8PSBNUFBFX1NfQklUOwkJCVwKLQlpZiAob3B0cyAmIE1QUEVfT1BUXzQwKQkJCVwKLQkgICAgKnB0ciB8PSBNUFBFX0xfQklUOwkJCVwKLQkvKiBNLEQsQyBiaXRzIG5vdCBzdXBwb3J0ZWQgKi8JCVwKLSAgICB9IHdoaWxlICgvKiBDT05TVENPTkQgKi8gMCkKLQotLyogVGhlIHJldmVyc2Ugb2YgdGhlIGFib3ZlICovCi0jZGVmaW5lIE1QUEVfQ0lfVE9fT1BUUyhjaSwgb3B0cykJCVwKLSAgICBkbyB7CQkJCQlcCi0JdV9jaGFyICpwdHIgPSBjaTsgLyogdV9jaGFyWzRdICovCVwKLQkJCQkJCVwKLQlvcHRzID0gMDsJCQkJXAotCQkJCQkJXAotCS8qIEggYml0ICovCQkJCVwKLQlpZiAoIShwdHJbMF0gJiBNUFBFX0hfQklUKSkJCVwKLQkgICAgb3B0cyB8PSBNUFBFX09QVF9TVEFURUZVTDsJCVwKLQkJCQkJCVwKLQkvKiBTLEwgYml0cyAqLwkJCQlcCi0JaWYgKHB0clszXSAmIE1QUEVfU19CSVQpCQlcCi0JICAgIG9wdHMgfD0gTVBQRV9PUFRfMTI4OwkJXAotCWlmIChwdHJbM10gJiBNUFBFX0xfQklUKQkJXAotCSAgICBvcHRzIHw9IE1QUEVfT1BUXzQwOwkJXAotCQkJCQkJXAotCS8qIE0sRCxDIGJpdHMgKi8JCQlcCi0JaWYgKHB0clszXSAmIE1QUEVfTV9CSVQpCQlcCi0JICAgIG9wdHMgfD0gTVBQRV9PUFRfNTY7CQlcCi0JaWYgKHB0clszXSAmIE1QUEVfRF9CSVQpCQlcCi0JICAgIG9wdHMgfD0gTVBQRV9PUFRfRDsJCQlcCi0JaWYgKHB0clszXSAmIE1QUEVfQ19CSVQpCQlcCi0JICAgIG9wdHMgfD0gTVBQRV9PUFRfTVBQQzsJCVwKLQkJCQkJCVwKLQkvKiBPdGhlciBiaXRzICovCQkJXAotCWlmIChwdHJbMF0gJiB+TVBQRV9IX0JJVCkJCVwKLQkgICAgb3B0cyB8PSBNUFBFX09QVF9VTktOT1dOOwkJXAotCWlmIChwdHJbMV0gfHwgcHRyWzJdKQkJCVwKLQkgICAgb3B0cyB8PSBNUFBFX09QVF9VTktOT1dOOwkJXAotCWlmIChwdHJbM10gJiB+TVBQRV9BTExfQklUUykJCVwKLQkgICAgb3B0cyB8PSBNUFBFX09QVF9VTktOT1dOOwkJXAotICAgIH0gd2hpbGUgKC8qIENPTlNUQ09ORCAqLyAwKQpkaWZmIC0tZ2l0IGEvcHBwZC9vcGVuc3NsLWhhc2guaCBiL3BwcGQvb3BlbnNzbC1oYXNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOGNjN2MuLjAwMDAwMDAKLS0tIGEvcHBwZC9vcGVuc3NsLWhhc2guaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fT1BFTlNTTF9IQVNIX18KLSNkZWZpbmUgX19PUEVOU1NMX0hBU0hfXwotCi0jaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL21kNC5oPgotI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9zaGEuaD4KLQotI2RlZmluZSBTSEExX1NJR05BVFVSRV9TSVpFIDIwCi0jZGVmaW5lIFNIQTFfQ1RYIFNIQV9DVFgKLSNkZWZpbmUgTUQ0SW5pdCBNRDRfSW5pdAotI2RlZmluZSBNRDRVcGRhdGUgTUQ0X1VwZGF0ZQotI2RlZmluZSBNRDRGaW5hbCBNRDRfRmluYWwKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9wcHBkL29wdGlvbnMuYyBiL3BwcGQvb3B0aW9ucy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjZiNzY1Li4wMDAwMDAwCi0tLSBhL3BwcGQvb3B0aW9ucy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc5NyArMCwwIEBACi0vKgotICogb3B0aW9ucy5jIC0gaGFuZGxlcyBvcHRpb24gcHJvY2Vzc2luZyBmb3IgUFBQLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk4NC0yMDAwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBuYW1lICJDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHBlcm1pc3Npb24gb3IgYW55IGxlZ2FsCi0gKiAgICBkZXRhaWxzLCBwbGVhc2UgY29udGFjdAotICogICAgICBPZmZpY2Ugb2YgVGVjaG5vbG9neSBUcmFuc2ZlcgotICogICAgICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQotICogICAgICA1MDAwIEZvcmJlcyBBdmVudWUKLSAqICAgICAgUGl0dHNidXJnaCwgUEEgIDE1MjEzLTM4OTAKLSAqICAgICAgKDQxMikgMjY4LTQzODcsIGZheDogKDQxMikgMjY4LTczOTUKLSAqICAgICAgdGVjaC10cmFuc2ZlckBhbmRyZXcuY211LmVkdQotICoKLSAqIDQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQ29tcHV0aW5nIFNlcnZpY2VzCi0gKiAgICAgYXQgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkgKGh0dHA6Ly93d3cuY211LmVkdS9jb21wdXRpbmcvKS4iCi0gKgotICogQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi0gKiBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLSAqIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLSAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLSAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNkZWZpbmUgUkNTSUQJIiRJZDogb3B0aW9ucy5jLHYgMS4xMDIgMjAwOC8wNi8xNSAwNjo1MzowNiBwYXVsdXMgRXhwICQiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5c2xvZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHB3ZC5oPgotI2lmZGVmIFBMVUdJTgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jZW5kaWYKLQotI2lmZGVmIFBQUF9GSUxURVIKLSNpbmNsdWRlIDxwY2FwLmg+Ci0vKgotICogVGhlcmUgaGF2ZSBiZWVuIDMgb3IgNCBkaWZmZXJlbnQgbmFtZXMgZm9yIHRoaXMgaW4gbGlicGNhcCBDVlMsIGJ1dAotICogdGhpcyBzZWVtcyB0byBiZSB3aGF0IHRoZXkgaGF2ZSBzZXR0bGVkIG9uLi4uCi0gKiBGb3Igb2xkZXIgdmVyc2lvbnMgb2YgbGlicGNhcCwgdXNlIERMVF9QUFAgLSBidXQgdGhhdCBtZWFucwotICogd2UgbG9zZSB0aGUgaW5ib3VuZCBhbmQgb3V0Ym91bmQgcXVhbGlmaWVycy4KLSAqLwotI2lmbmRlZiBETFRfUFBQX1BQUEQKLSNpZmRlZiBETFRfUFBQX1dJVEhESVJFQ1RJT04KLSNkZWZpbmUgRExUX1BQUF9QUFBECURMVF9QUFBfV0lUSERJUkVDVElPTgotI2Vsc2UKLSNkZWZpbmUgRExUX1BQUF9QUFBECURMVF9QUFAKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYgLyogUFBQX0ZJTFRFUiAqLwotCi0jaW5jbHVkZSAicHBwZC5oIgotI2luY2x1ZGUgInBhdGhuYW1lcy5oIgotCi0jaWYgZGVmaW5lZCh1bHRyaXgpIHx8IGRlZmluZWQoTmVYVCkKLWNoYXIgKnN0cmR1cCBfX1AoKGNoYXIgKikpOwotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gPSBSQ1NJRDsKLQotc3RydWN0IG9wdGlvbl92YWx1ZSB7Ci0gICAgc3RydWN0IG9wdGlvbl92YWx1ZSAqbmV4dDsKLSAgICBjb25zdCBjaGFyICpzb3VyY2U7Ci0gICAgY2hhciB2YWx1ZVsxXTsKLX07Ci0KLS8qCi0gKiBPcHRpb24gdmFyaWFibGVzIGFuZCBkZWZhdWx0IHZhbHVlcy4KLSAqLwotaW50CWRlYnVnID0gMDsJCS8qIERlYnVnIGZsYWcgKi8KLWludAlrZGVidWdmbGFnID0gMDsJCS8qIFRlbGwga2VybmVsIHRvIHByaW50IGRlYnVnIG1lc3NhZ2VzICovCi1pbnQJZGVmYXVsdF9kZXZpY2UgPSAxOwkvKiBVc2luZyAvZGV2L3R0eSBvciBlcXVpdmFsZW50ICovCi1jaGFyCWRldm5hbVtNQVhQQVRITEVOXTsJLyogRGV2aWNlIG5hbWUgKi8KLWJvb2wJbm9kZXRhY2ggPSAwOwkJLyogRG9uJ3QgZGV0YWNoIGZyb20gY29udHJvbGxpbmcgdHR5ICovCi1ib29sCXVwZGV0YWNoID0gMDsJCS8qIERldGFjaCBvbmNlIGxpbmsgaXMgdXAgKi8KLWJvb2wJbWFzdGVyX2RldGFjaDsJCS8qIERldGFjaCB3aGVuIHdlJ3JlIChvbmx5KSBtdWx0aWxpbmsgbWFzdGVyICovCi1pbnQJbWF4Y29ubmVjdCA9IDA7CQkvKiBNYXhpbXVtIGNvbm5lY3QgdGltZSAqLwotY2hhcgl1c2VyW01BWE5BTUVMRU5dOwkvKiBVc2VybmFtZSBmb3IgUEFQICovCi1jaGFyCXBhc3N3ZFtNQVhTRUNSRVRMRU5dOwkvKiBQYXNzd29yZCBmb3IgUEFQICovCi1ib29sCXBlcnNpc3QgPSAwOwkJLyogUmVvcGVuIGxpbmsgYWZ0ZXIgaXQgZ29lcyBkb3duICovCi1jaGFyCW91cl9uYW1lW01BWE5BTUVMRU5dOwkvKiBPdXIgbmFtZSBmb3IgYXV0aGVudGljYXRpb24gcHVycG9zZXMgKi8KLWJvb2wJZGVtYW5kID0gMDsJCS8qIGRvIGRpYWwtb24tZGVtYW5kICovCi1jaGFyCSppcHBhcmFtID0gTlVMTDsJLyogRXh0cmEgcGFyYW1ldGVyIGZvciBpcCB1cC9kb3duIHNjcmlwdHMgKi8KLWludAlpZGxlX3RpbWVfbGltaXQgPSAwOwkvKiBEaXNjb25uZWN0IGlmIGlkbGUgZm9yIHRoaXMgbWFueSBzZWNvbmRzICovCi1pbnQJaG9sZG9mZiA9IDMwOwkJLyogIyBzZWNvbmRzIHRvIHBhdXNlIGJlZm9yZSByZWNvbm5lY3RpbmcgKi8KLWJvb2wJaG9sZG9mZl9zcGVjaWZpZWQ7CS8qIHRydWUgaWYgYSBob2xkb2ZmIHZhbHVlIGhhcyBiZWVuIGdpdmVuICovCi1pbnQJbG9nX3RvX2ZkID0gMTsJCS8qIHNlbmQgbG9nIG1lc3NhZ2VzIHRvIHRoaXMgZmQgdG9vICovCi1ib29sCWxvZ19kZWZhdWx0ID0gMTsJLyogbG9nX3RvX2ZkIGlzIGRlZmF1bHQgKHN0ZG91dCkgKi8KLWludAltYXhmYWlsID0gMTA7CQkvKiBtYXggIyBvZiB1bnN1Y2Nlc3NmdWwgY29ubmVjdGlvbiBhdHRlbXB0cyAqLwotY2hhcglsaW5rbmFtZVtNQVhQQVRITEVOXTsJLyogbG9naWNhbCBuYW1lIGZvciBsaW5rICovCi1ib29sCXR1bmVfa2VybmVsOwkJLyogbWF5IGFsdGVyIGtlcm5lbCBzZXR0aW5ncyAqLwotaW50CWNvbm5lY3RfZGVsYXkgPSAxMDAwOwkvKiB3YWl0IHRoaXMgbWFueSBtcyBhZnRlciBjb25uZWN0IHNjcmlwdCAqLwotaW50CXJlcV91bml0ID0gLTE7CQkvKiByZXF1ZXN0ZWQgaW50ZXJmYWNlIHVuaXQgKi8KLWJvb2wJbXVsdGlsaW5rID0gMDsJCS8qIEVuYWJsZSBtdWx0aWxpbmsgb3BlcmF0aW9uICovCi1jaGFyCSpidW5kbGVfbmFtZSA9IE5VTEw7CS8qIGJ1bmRsZSBuYW1lIGZvciBtdWx0aWxpbmsgKi8KLWJvb2wJZHVtcF9vcHRpb25zOwkJLyogcHJpbnQgb3V0IG9wdGlvbiB2YWx1ZXMgKi8KLWJvb2wJZHJ5cnVuOwkJCS8qIHByaW50IG91dCBvcHRpb24gdmFsdWVzIGFuZCBleGl0ICovCi1jaGFyCSpkb21haW47CQkvKiBkb21haW4gbmFtZSBzZXQgYnkgZG9tYWluIG9wdGlvbiAqLwotaW50CWNoaWxkX3dhaXQgPSA1OwkJLyogIyBzZWNvbmRzIHRvIHdhaXQgZm9yIGNoaWxkcmVuIGF0IGV4aXQgKi8KLXN0cnVjdCB1c2VyZW52ICp1c2VyZW52X2xpc3Q7CS8qIHVzZXIgZW52aXJvbm1lbnQgdmFyaWFibGVzICovCi0KLSNpZmRlZiBNQVhPQ1RFVFMKLXVuc2lnbmVkIGludCAgbWF4b2N0ZXRzID0gMDsgICAgLyogZGVmYXVsdCAtIG5vIGxpbWl0ICovCi1pbnQgbWF4b2N0ZXRzX2RpciA9IDA7ICAgICAgIC8qIGRlZmF1bHQgLSBzdW0gb2YgdHJhZmZpYyAqLwotaW50IG1heG9jdGV0c190aW1lb3V0ID0gMTsgICAvKiBkZWZhdWx0IDEgc2Vjb25kICovIAotI2VuZGlmCi0KLQotZXh0ZXJuIG9wdGlvbl90IGF1dGhfb3B0aW9uc1tdOwotZXh0ZXJuIHN0cnVjdCBzdGF0IGRldnN0YXQ7Ci0KLSNpZmRlZiBQUFBfRklMVEVSCi1zdHJ1Y3QJYnBmX3Byb2dyYW0gcGFzc19maWx0ZXI7LyogRmlsdGVyIHByb2dyYW0gZm9yIHBhY2tldHMgdG8gcGFzcyAqLwotc3RydWN0CWJwZl9wcm9ncmFtIGFjdGl2ZV9maWx0ZXI7IC8qIEZpbHRlciBwcm9ncmFtIGZvciBsaW5rLWFjdGl2ZSBwa3RzICovCi0jZW5kaWYKLQotc3RhdGljIG9wdGlvbl90ICpjdXJvcHQ7CS8qIHBvaW50ZXIgdG8gb3B0aW9uIGJlaW5nIHByb2Nlc3NlZCAqLwotY2hhciAqY3VycmVudF9vcHRpb247CQkvKiB0aGUgbmFtZSBvZiB0aGUgb3B0aW9uIGJlaW5nIHBhcnNlZCAqLwotaW50ICBwcml2aWxlZ2VkX29wdGlvbjsJCS8qIHNldCBpZmYgdGhlIGN1cnJlbnQgb3B0aW9uIGNhbWUgZnJvbSByb290ICovCi1jaGFyICpvcHRpb25fc291cmNlOwkJLyogc3RyaW5nIHNheWluZyB3aGVyZSB0aGUgb3B0aW9uIGNhbWUgZnJvbSAqLwotaW50ICBvcHRpb25fcHJpb3JpdHkgPSBPUFJJT19DRkdGSUxFOyAvKiBwcmlvcml0eSBvZiB0aGUgY3VycmVudCBvcHRpb25zICovCi1ib29sIGRldm5hbV9maXhlZDsJCS8qIGNhbiBubyBsb25nZXIgY2hhbmdlIGRldmljZSBuYW1lICovCi0KLXN0YXRpYyBpbnQgbG9nZmlsZV9mZCA9IC0xOwkvKiBmZCBvcGVuZWQgZm9yIGxvZyBmaWxlICovCi1zdGF0aWMgY2hhciBsb2dmaWxlX25hbWVbTUFYUEFUSExFTl07CS8qIG5hbWUgb2YgbG9nIGZpbGUgKi8KLQotLyoKLSAqIFByb3RvdHlwZXMKLSAqLwotc3RhdGljIGludCBzZXRkb21haW4gX19QKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IHJlYWRmaWxlIF9fUCgoY2hhciAqKikpOwotc3RhdGljIGludCBjYWxsZmlsZSBfX1AoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgc2hvd3ZlcnNpb24gX19QKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IHNob3doZWxwIF9fUCgoY2hhciAqKikpOwotc3RhdGljIHZvaWQgdXNhZ2UgX19QKCh2b2lkKSk7Ci1zdGF0aWMgaW50IHNldGxvZ2ZpbGUgX19QKChjaGFyICoqKSk7Ci0jaWZkZWYgUExVR0lOCi1zdGF0aWMgaW50IGxvYWRwbHVnaW4gX19QKChjaGFyICoqKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFBQUF9GSUxURVIKLXN0YXRpYyBpbnQgc2V0cGFzc2ZpbHRlciBfX1AoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgc2V0YWN0aXZlZmlsdGVyIF9fUCgoY2hhciAqKikpOwotI2VuZGlmCi0KLSNpZmRlZiBNQVhPQ1RFVFMKLXN0YXRpYyBpbnQgc2V0bW9kaXIgX19QKChjaGFyICoqKSk7Ci0jZW5kaWYKLQotc3RhdGljIGludCB1c2VyX3NldGVudiBfX1AoKGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIHVzZXJfc2V0cHJpbnQgX19QKChvcHRpb25fdCAqLCBwcmludGVyX2Z1bmMsIHZvaWQgKikpOwotc3RhdGljIGludCB1c2VyX3Vuc2V0ZW52IF9fUCgoY2hhciAqKikpOwotc3RhdGljIHZvaWQgdXNlcl91bnNldHByaW50IF9fUCgob3B0aW9uX3QgKiwgcHJpbnRlcl9mdW5jLCB2b2lkICopKTsKLQotc3RhdGljIG9wdGlvbl90ICpmaW5kX29wdGlvbiBfX1AoKGNvbnN0IGNoYXIgKm5hbWUpKTsKLXN0YXRpYyBpbnQgcHJvY2Vzc19vcHRpb24gX19QKChvcHRpb25fdCAqLCBjaGFyICosIGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgbl9hcmd1bWVudHMgX19QKChvcHRpb25fdCAqKSk7Ci1zdGF0aWMgaW50IG51bWJlcl9vcHRpb24gX19QKChjaGFyICosIHVfaW50MzJfdCAqLCBpbnQpKTsKLQotLyoKLSAqIFN0cnVjdHVyZSB0byBzdG9yZSBleHRyYSBsaXN0cyBvZiBvcHRpb25zLgotICovCi1zdHJ1Y3Qgb3B0aW9uX2xpc3QgewotICAgIG9wdGlvbl90ICpvcHRpb25zOwotICAgIHN0cnVjdCBvcHRpb25fbGlzdCAqbmV4dDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uX2xpc3QgKmV4dHJhX29wdGlvbnMgPSBOVUxMOwotCi0vKgotICogVmFsaWQgYXJndW1lbnRzLgotICovCi1vcHRpb25fdCBnZW5lcmFsX29wdGlvbnNbXSA9IHsKLSAgICB7ICJkZWJ1ZyIsIG9faW50LCAmZGVidWcsCi0gICAgICAiSW5jcmVhc2UgZGVidWdnaW5nIGxldmVsIiwgT1BUX0lOQyB8IE9QVF9OT0FSRyB8IDEgfSwKLSAgICB7ICItZCIsIG9faW50LCAmZGVidWcsCi0gICAgICAiSW5jcmVhc2UgZGVidWdnaW5nIGxldmVsIiwKLSAgICAgIE9QVF9BTElBUyB8IE9QVF9JTkMgfCBPUFRfTk9BUkcgfCAxIH0sCi0KLSAgICB7ICJrZGVidWciLCBvX2ludCwgJmtkZWJ1Z2ZsYWcsCi0gICAgICAiU2V0IGtlcm5lbCBkcml2ZXIgZGVidWcgbGV2ZWwiLCBPUFRfUFJJTyB9LAotCi0gICAgeyAibm9kZXRhY2giLCBvX2Jvb2wsICZub2RldGFjaCwKLSAgICAgICJEb24ndCBkZXRhY2ggZnJvbSBjb250cm9sbGluZyB0dHkiLCBPUFRfUFJJTyB8IDEgfSwKLSAgICB7ICItZGV0YWNoIiwgb19ib29sLCAmbm9kZXRhY2gsCi0gICAgICAiRG9uJ3QgZGV0YWNoIGZyb20gY29udHJvbGxpbmcgdHR5IiwgT1BUX0FMSUFTIHwgT1BUX1BSSU9TVUIgfCAxIH0sCi0gICAgeyAidXBkZXRhY2giLCBvX2Jvb2wsICZ1cGRldGFjaCwKLSAgICAgICJEZXRhY2ggZnJvbSBjb250cm9sbGluZyB0dHkgb25jZSBsaW5rIGlzIHVwIiwKLSAgICAgIE9QVF9QUklPU1VCIHwgT1BUX0EyQ0xSIHwgMSwgJm5vZGV0YWNoIH0sCi0KLSAgICB7ICJtYXN0ZXJfZGV0YWNoIiwgb19ib29sLCAmbWFzdGVyX2RldGFjaCwKLSAgICAgICJEZXRhY2ggd2hlbiB3ZSdyZSBtdWx0aWxpbmsgbWFzdGVyIGJ1dCBoYXZlIG5vIGxpbmsiLCAxIH0sCi0KLSAgICB7ICJob2xkb2ZmIiwgb19pbnQsICZob2xkb2ZmLAotICAgICAgIlNldCB0aW1lIGluIHNlY29uZHMgYmVmb3JlIHJldHJ5aW5nIGNvbm5lY3Rpb24iLAotICAgICAgT1BUX1BSSU8sICZob2xkb2ZmX3NwZWNpZmllZCB9LAotCi0gICAgeyAiaWRsZSIsIG9faW50LCAmaWRsZV90aW1lX2xpbWl0LAotICAgICAgIlNldCB0aW1lIGluIHNlY29uZHMgYmVmb3JlIGRpc2Nvbm5lY3RpbmcgaWRsZSBsaW5rIiwgT1BUX1BSSU8gfSwKLQotICAgIHsgIm1heGNvbm5lY3QiLCBvX2ludCwgJm1heGNvbm5lY3QsCi0gICAgICAiU2V0IGNvbm5lY3Rpb24gdGltZSBsaW1pdCIsCi0gICAgICBPUFRfUFJJTyB8IE9QVF9MTElNSVQgfCBPUFRfTk9JTkNSIHwgT1BUX1pFUk9JTkYgfSwKLQotICAgIHsgImRvbWFpbiIsIG9fc3BlY2lhbCwgKHZvaWQgKilzZXRkb21haW4sCi0gICAgICAiQWRkIGdpdmVuIGRvbWFpbiBuYW1lIHRvIGhvc3RuYW1lIiwKLSAgICAgIE9QVF9QUklPIHwgT1BUX1BSSVYgfCBPUFRfQTJTVFJWQUwsICZkb21haW4gfSwKLQotICAgIHsgImZpbGUiLCBvX3NwZWNpYWwsICh2b2lkICopcmVhZGZpbGUsCi0gICAgICAiVGFrZSBvcHRpb25zIGZyb20gYSBmaWxlIiwgT1BUX05PUFJJTlQgfSwKLSAgICB7ICJjYWxsIiwgb19zcGVjaWFsLCAodm9pZCAqKWNhbGxmaWxlLAotICAgICAgIlRha2Ugb3B0aW9ucyBmcm9tIGEgcHJpdmlsZWdlZCBmaWxlIiwgT1BUX05PUFJJTlQgfSwKLQotICAgIHsgInBlcnNpc3QiLCBvX2Jvb2wsICZwZXJzaXN0LAotICAgICAgIktlZXAgb24gcmVvcGVuaW5nIGNvbm5lY3Rpb24gYWZ0ZXIgY2xvc2UiLCBPUFRfUFJJTyB8IDEgfSwKLSAgICB7ICJub3BlcnNpc3QiLCBvX2Jvb2wsICZwZXJzaXN0LAotICAgICAgIlR1cm4gb2ZmIHBlcnNpc3Qgb3B0aW9uIiwgT1BUX1BSSU9TVUIgfSwKLQotICAgIHsgImRlbWFuZCIsIG9fYm9vbCwgJmRlbWFuZCwKLSAgICAgICJEaWFsIG9uIGRlbWFuZCIsIE9QVF9JTklUT05MWSB8IDEsICZwZXJzaXN0IH0sCi0KLSAgICB7ICItLXZlcnNpb24iLCBvX3NwZWNpYWxfbm9hcmcsICh2b2lkICopc2hvd3ZlcnNpb24sCi0gICAgICAiU2hvdyB2ZXJzaW9uIG51bWJlciIgfSwKLSAgICB7ICItLWhlbHAiLCBvX3NwZWNpYWxfbm9hcmcsICh2b2lkICopc2hvd2hlbHAsCi0gICAgICAiU2hvdyBicmllZiBsaXN0aW5nIG9mIG9wdGlvbnMiIH0sCi0gICAgeyAiLWgiLCBvX3NwZWNpYWxfbm9hcmcsICh2b2lkICopc2hvd2hlbHAsCi0gICAgICAiU2hvdyBicmllZiBsaXN0aW5nIG9mIG9wdGlvbnMiLCBPUFRfQUxJQVMgfSwKLQotICAgIHsgImxvZ2ZpbGUiLCBvX3NwZWNpYWwsICh2b2lkICopc2V0bG9nZmlsZSwKLSAgICAgICJBcHBlbmQgbG9nIG1lc3NhZ2VzIHRvIHRoaXMgZmlsZSIsCi0gICAgICBPUFRfUFJJTyB8IE9QVF9BMlNUUlZBTCB8IE9QVF9TVEFUSUMsICZsb2dmaWxlX25hbWUgfSwKLSAgICB7ICJsb2dmZCIsIG9faW50LCAmbG9nX3RvX2ZkLAotICAgICAgIlNlbmQgbG9nIG1lc3NhZ2VzIHRvIHRoaXMgZmlsZSBkZXNjcmlwdG9yIiwKLSAgICAgIE9QVF9QUklPU1VCIHwgT1BUX0EyQ0xSLCAmbG9nX2RlZmF1bHQgfSwKLSAgICB7ICJub2xvZyIsIG9faW50LCAmbG9nX3RvX2ZkLAotICAgICAgIkRvbid0IHNlbmQgbG9nIG1lc3NhZ2VzIHRvIGFueSBmaWxlIiwKLSAgICAgIE9QVF9QUklPU1VCIHwgT1BUX05PQVJHIHwgT1BUX1ZBTCgtMSkgfSwKLSAgICB7ICJub2xvZ2ZkIiwgb19pbnQsICZsb2dfdG9fZmQsCi0gICAgICAiRG9uJ3Qgc2VuZCBsb2cgbWVzc2FnZXMgdG8gYW55IGZpbGUgZGVzY3JpcHRvciIsCi0gICAgICBPUFRfUFJJT1NVQiB8IE9QVF9BTElBUyB8IE9QVF9OT0FSRyB8IE9QVF9WQUwoLTEpIH0sCi0KLSAgICB7ICJsaW5rbmFtZSIsIG9fc3RyaW5nLCBsaW5rbmFtZSwKLSAgICAgICJTZXQgbG9naWNhbCBuYW1lIGZvciBsaW5rIiwKLSAgICAgIE9QVF9QUklPIHwgT1BUX1BSSVYgfCBPUFRfU1RBVElDLCBOVUxMLCBNQVhQQVRITEVOIH0sCi0KLSAgICB7ICJtYXhmYWlsIiwgb19pbnQsICZtYXhmYWlsLAotICAgICAgIk1heGltdW0gbnVtYmVyIG9mIHVuc3VjY2Vzc2Z1bCBjb25uZWN0aW9uIGF0dGVtcHRzIHRvIGFsbG93IiwKLSAgICAgIE9QVF9QUklPIH0sCi0KLSAgICB7ICJrdHVuZSIsIG9fYm9vbCwgJnR1bmVfa2VybmVsLAotICAgICAgIkFsdGVyIGtlcm5lbCBzZXR0aW5ncyBhcyBuZWNlc3NhcnkiLCBPUFRfUFJJTyB8IDEgfSwKLSAgICB7ICJub2t0dW5lIiwgb19ib29sLCAmdHVuZV9rZXJuZWwsCi0gICAgICAiRG9uJ3QgYWx0ZXIga2VybmVsIHNldHRpbmdzIiwgT1BUX1BSSU9TVUIgfSwKLQotICAgIHsgImNvbm5lY3QtZGVsYXkiLCBvX2ludCwgJmNvbm5lY3RfZGVsYXksCi0gICAgICAiTWF4aW11bSB0aW1lIChpbiBtcykgdG8gd2FpdCBhZnRlciBjb25uZWN0IHNjcmlwdCBmaW5pc2hlcyIsCi0gICAgICBPUFRfUFJJTyB9LAotCi0gICAgeyAidW5pdCIsIG9faW50LCAmcmVxX3VuaXQsCi0gICAgICAiUFBQIGludGVyZmFjZSB1bml0IG51bWJlciB0byB1c2UgaWYgcG9zc2libGUiLAotICAgICAgT1BUX1BSSU8gfCBPUFRfTExJTUlULCAwLCAwIH0sCi0KLSAgICB7ICJkdW1wIiwgb19ib29sLCAmZHVtcF9vcHRpb25zLAotICAgICAgIlByaW50IG91dCBvcHRpb24gdmFsdWVzIGFmdGVyIHBhcnNpbmcgYWxsIG9wdGlvbnMiLCAxIH0sCi0gICAgeyAiZHJ5cnVuIiwgb19ib29sLCAmZHJ5cnVuLAotICAgICAgIlN0b3AgYWZ0ZXIgcGFyc2luZywgcHJpbnRpbmcsIGFuZCBjaGVja2luZyBvcHRpb25zIiwgMSB9LAotCi0gICAgeyAiY2hpbGQtdGltZW91dCIsIG9faW50LCAmY2hpbGRfd2FpdCwKLSAgICAgICJOdW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGZvciBjaGlsZCBwcm9jZXNzZXMgYXQgZXhpdCIsCi0gICAgICBPUFRfUFJJTyB9LAotCi0gICAgeyAic2V0Iiwgb19zcGVjaWFsLCAodm9pZCAqKXVzZXJfc2V0ZW52LAotICAgICAgIlNldCB1c2VyIGVudmlyb25tZW50IHZhcmlhYmxlIiwKLSAgICAgIE9QVF9BMlBSSU5URVIgfCBPUFRfTk9QUklOVCwgKHZvaWQgKil1c2VyX3NldHByaW50IH0sCi0gICAgeyAidW5zZXQiLCBvX3NwZWNpYWwsICh2b2lkICopdXNlcl91bnNldGVudiwKLSAgICAgICJVbnNldCB1c2VyIGVudmlyb25tZW50IHZhcmlhYmxlIiwKLSAgICAgIE9QVF9BMlBSSU5URVIgfCBPUFRfTk9QUklOVCwgKHZvaWQgKil1c2VyX3Vuc2V0cHJpbnQgfSwKLQotI2lmZGVmIEhBVkVfTVVMVElMSU5LCi0gICAgeyAibXVsdGlsaW5rIiwgb19ib29sLCAmbXVsdGlsaW5rLAotICAgICAgIkVuYWJsZSBtdWx0aWxpbmsgb3BlcmF0aW9uIiwgT1BUX1BSSU8gfCAxIH0sCi0gICAgeyAibXAiLCBvX2Jvb2wsICZtdWx0aWxpbmssCi0gICAgICAiRW5hYmxlIG11bHRpbGluayBvcGVyYXRpb24iLCBPUFRfUFJJT1NVQiB8IE9QVF9BTElBUyB8IDEgfSwKLSAgICB7ICJub211bHRpbGluayIsIG9fYm9vbCwgJm11bHRpbGluaywKLSAgICAgICJEaXNhYmxlIG11bHRpbGluayBvcGVyYXRpb24iLCBPUFRfUFJJT1NVQiB8IDAgfSwKLSAgICB7ICJub21wIiwgb19ib29sLCAmbXVsdGlsaW5rLAotICAgICAgIkRpc2FibGUgbXVsdGlsaW5rIG9wZXJhdGlvbiIsIE9QVF9QUklPU1VCIHwgT1BUX0FMSUFTIHwgMCB9LAotCi0gICAgeyAiYnVuZGxlIiwgb19zdHJpbmcsICZidW5kbGVfbmFtZSwKLSAgICAgICJCdW5kbGUgbmFtZSBmb3IgbXVsdGlsaW5rIiwgT1BUX1BSSU8gfSwKLSNlbmRpZiAvKiBIQVZFX01VTFRJTElOSyAqLwotCi0jaWZkZWYgUExVR0lOCi0gICAgeyAicGx1Z2luIiwgb19zcGVjaWFsLCAodm9pZCAqKWxvYWRwbHVnaW4sCi0gICAgICAiTG9hZCBhIHBsdWctaW4gbW9kdWxlIGludG8gcHBwZCIsIE9QVF9QUklWIHwgT1BUX0EyTElTVCB9LAotI2VuZGlmCi0KLSNpZmRlZiBQUFBfRklMVEVSCi0gICAgeyAicGFzcy1maWx0ZXIiLCBvX3NwZWNpYWwsIHNldHBhc3NmaWx0ZXIsCi0gICAgICAic2V0IGZpbHRlciBmb3IgcGFja2V0cyB0byBwYXNzIiwgT1BUX1BSSU8gfSwKLQotICAgIHsgImFjdGl2ZS1maWx0ZXIiLCBvX3NwZWNpYWwsIHNldGFjdGl2ZWZpbHRlciwKLSAgICAgICJzZXQgZmlsdGVyIGZvciBhY3RpdmUgcGt0cyIsIE9QVF9QUklPIH0sCi0jZW5kaWYKLQotI2lmZGVmIE1BWE9DVEVUUwotICAgIHsgIm1heG9jdGV0cyIsIG9faW50LCAmbWF4b2N0ZXRzLAotICAgICAgIlNldCBjb25uZWN0aW9uIHRyYWZmaWMgbGltaXQiLAotICAgICAgT1BUX1BSSU8gfCBPUFRfTExJTUlUIHwgT1BUX05PSU5DUiB8IE9QVF9aRVJPSU5GIH0sCi0gICAgeyAibW8iLCBvX2ludCwgJm1heG9jdGV0cywKLSAgICAgICJTZXQgY29ubmVjdGlvbiB0cmFmZmljIGxpbWl0IiwKLSAgICAgIE9QVF9BTElBUyB8IE9QVF9QUklPIHwgT1BUX0xMSU1JVCB8IE9QVF9OT0lOQ1IgfCBPUFRfWkVST0lORiB9LAotICAgIHsgIm1vLWRpcmVjdGlvbiIsIG9fc3BlY2lhbCwgc2V0bW9kaXIsCi0gICAgICAiU2V0IGRpcmVjdGlvbiBmb3IgbGltaXQgdHJhZmZpYyAoc3VtLGluLG91dCxtYXgpIiB9LAotICAgIHsgIm1vLXRpbWVvdXQiLCBvX2ludCwgJm1heG9jdGV0c190aW1lb3V0LAotICAgICAgIkNoZWNrIGZvciB0cmFmZmljIGxpbWl0IGV2ZXJ5IE4gc2Vjb25kcyIsIE9QVF9QUklPIHwgT1BUX0xMSU1JVCB8IDEgfSwKLSNlbmRpZgotCi0gICAgeyBOVUxMIH0KLX07Ci0KLSNpZm5kZWYgSU1QTEVNRU5UQVRJT04KLSNkZWZpbmUgSU1QTEVNRU5UQVRJT04gIiIKLSNlbmRpZgotCi1zdGF0aWMgY2hhciAqdXNhZ2Vfc3RyaW5nID0gIlwKLXBwcGQgdmVyc2lvbiAlc1xuXAotVXNhZ2U6ICVzIFsgb3B0aW9ucyBdLCB3aGVyZSBvcHRpb25zIGFyZTpcblwKLQk8ZGV2aWNlPglDb21tdW5pY2F0ZSBvdmVyIHRoZSBuYW1lZCBkZXZpY2VcblwKLQk8c3BlZWQ+CQlTZXQgdGhlIGJhdWQgcmF0ZSB0byA8c3BlZWQ+XG5cCi0JPGxvYz46PHJlbT4JU2V0IHRoZSBsb2NhbCBhbmQvb3IgcmVtb3RlIGludGVyZmFjZSBJUFxuXAotCQkJYWRkcmVzc2VzLiAgRWl0aGVyIG9uZSBtYXkgYmUgb21pdHRlZC5cblwKLQlhc3luY21hcCA8bj4JU2V0IHRoZSBkZXNpcmVkIGFzeW5jIG1hcCB0byBoZXggPG4+XG5cCi0JYXV0aAkJUmVxdWlyZSBhdXRoZW50aWNhdGlvbiBmcm9tIHBlZXJcblwKLSAgICAgICAgY29ubmVjdCA8cD4gICAgIEludm9rZSBzaGVsbCBjb21tYW5kIDxwPiB0byBzZXQgdXAgdGhlIHNlcmlhbCBsaW5lXG5cCi0JY3J0c2N0cwkJVXNlIGhhcmR3YXJlIFJUUy9DVFMgZmxvdyBjb250cm9sXG5cCi0JZGVmYXVsdHJvdXRlCUFkZCBkZWZhdWx0IHJvdXRlIHRocm91Z2ggaW50ZXJmYWNlXG5cCi0JZmlsZSA8Zj4JVGFrZSBvcHRpb25zIGZyb20gZmlsZSA8Zj5cblwKLQltb2RlbQkJVXNlIG1vZGVtIGNvbnRyb2wgbGluZXNcblwKLQltcnUgPG4+CQlTZXQgTVJVIHZhbHVlIHRvIDxuPiBmb3IgbmVnb3RpYXRpb25cblwKLVNlZSBwcHBkKDgpIGZvciBtb3JlIG9wdGlvbnMuXG5cCi0iOwotCi0vKgotICogcGFyc2VfYXJncyAtIHBhcnNlIGEgc3RyaW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCi0gKi8KLWludAotcGFyc2VfYXJncyhhcmdjLCBhcmd2KQotICAgIGludCBhcmdjOwotICAgIGNoYXIgKiphcmd2OwotewotICAgIGNoYXIgKmFyZzsKLSAgICBvcHRpb25fdCAqb3B0OwotICAgIGludCBuOwotCi0gICAgcHJpdmlsZWdlZF9vcHRpb24gPSBwcml2aWxlZ2VkOwotICAgIG9wdGlvbl9zb3VyY2UgPSAiY29tbWFuZCBsaW5lIjsKLSAgICBvcHRpb25fcHJpb3JpdHkgPSBPUFJJT19DTURMSU5FOwotICAgIHdoaWxlIChhcmdjID4gMCkgewotCWFyZyA9ICphcmd2Kys7Ci0JLS1hcmdjOwotCW9wdCA9IGZpbmRfb3B0aW9uKGFyZyk7Ci0JaWYgKG9wdCA9PSBOVUxMKSB7Ci0JICAgIG9wdGlvbl9lcnJvcigidW5yZWNvZ25pemVkIG9wdGlvbiAnJXMnIiwgYXJnKTsKLQkgICAgdXNhZ2UoKTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCW4gPSBuX2FyZ3VtZW50cyhvcHQpOwotCWlmIChhcmdjIDwgbikgewotCSAgICBvcHRpb25fZXJyb3IoInRvbyBmZXcgcGFyYW1ldGVycyBmb3Igb3B0aW9uICVzIiwgYXJnKTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCWlmICghcHJvY2Vzc19vcHRpb24ob3B0LCBhcmcsIGFyZ3YpKQotCSAgICByZXR1cm4gMDsKLQlhcmdjIC09IG47Ci0JYXJndiArPSBuOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotLyoKLSAqIG9wdGlvbnNfZnJvbV9maWxlIC0gUmVhZCBhIHN0cmluZyBvZiBvcHRpb25zIGZyb20gYSBmaWxlLAotICogYW5kIGludGVycHJldCB0aGVtLgotICovCi1pbnQKLW9wdGlvbnNfZnJvbV9maWxlKGZpbGVuYW1lLCBtdXN0X2V4aXN0LCBjaGVja19wcm90LCBwcml2KQotICAgIGNoYXIgKmZpbGVuYW1lOwotICAgIGludCBtdXN0X2V4aXN0OwotICAgIGludCBjaGVja19wcm90OwotICAgIGludCBwcml2OwotewotICAgIEZJTEUgKmY7Ci0gICAgaW50IGksIG5ld2xpbmUsIHJldCwgZXJyOwotICAgIG9wdGlvbl90ICpvcHQ7Ci0gICAgaW50IG9sZHByaXYsIG47Ci0gICAgY2hhciAqb2xkc291cmNlOwotICAgIHVpZF90IGV1aWQ7Ci0gICAgY2hhciAqYXJndltNQVhBUkdTXTsKLSAgICBjaGFyIGFyZ3NbTUFYQVJHU11bTUFYV09SRExFTl07Ci0gICAgY2hhciBjbWRbTUFYV09SRExFTl07Ci0KLSAgICBldWlkID0gZ2V0ZXVpZCgpOwotICAgIGlmIChjaGVja19wcm90ICYmIHNldGV1aWQoZ2V0dWlkKCkpID09IC0xKSB7Ci0Jb3B0aW9uX2Vycm9yKCJ1bmFibGUgdG8gZHJvcCBwcml2aWxlZ2VzIHRvIG9wZW4gJXM6ICVtIiwgZmlsZW5hbWUpOwotCXJldHVybiAwOwotICAgIH0KLSAgICBmID0gZm9wZW4oZmlsZW5hbWUsICJyIik7Ci0gICAgZXJyID0gZXJybm87Ci0gICAgaWYgKGNoZWNrX3Byb3QgJiYgc2V0ZXVpZChldWlkKSA9PSAtMSkKLQlmYXRhbCgidW5hYmxlIHRvIHJlZ2FpbiBwcml2aWxlZ2VzIik7Ci0gICAgaWYgKGYgPT0gTlVMTCkgewotCWVycm5vID0gZXJyOwotCWlmICghbXVzdF9leGlzdCkgewotCSAgICBpZiAoZXJyICE9IEVOT0VOVCAmJiBlcnIgIT0gRU5PVERJUikKLQkJd2FybigiV2FybmluZzogY2FuJ3Qgb3BlbiBvcHRpb25zIGZpbGUgJXM6ICVtIiwgZmlsZW5hbWUpOwotCSAgICByZXR1cm4gMTsKLQl9Ci0Jb3B0aW9uX2Vycm9yKCJDYW4ndCBvcGVuIG9wdGlvbnMgZmlsZSAlczogJW0iLCBmaWxlbmFtZSk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgb2xkcHJpdiA9IHByaXZpbGVnZWRfb3B0aW9uOwotICAgIHByaXZpbGVnZWRfb3B0aW9uID0gcHJpdjsKLSAgICBvbGRzb3VyY2UgPSBvcHRpb25fc291cmNlOwotICAgIG9wdGlvbl9zb3VyY2UgPSBzdHJkdXAoZmlsZW5hbWUpOwotICAgIGlmIChvcHRpb25fc291cmNlID09IE5VTEwpCi0Jb3B0aW9uX3NvdXJjZSA9ICJmaWxlIjsKLSAgICByZXQgPSAwOwotICAgIHdoaWxlIChnZXR3b3JkKGYsIGNtZCwgJm5ld2xpbmUsIGZpbGVuYW1lKSkgewotCW9wdCA9IGZpbmRfb3B0aW9uKGNtZCk7Ci0JaWYgKG9wdCA9PSBOVUxMKSB7Ci0JICAgIG9wdGlvbl9lcnJvcigiSW4gZmlsZSAlczogdW5yZWNvZ25pemVkIG9wdGlvbiAnJXMnIiwKLQkJCSBmaWxlbmFtZSwgY21kKTsKLQkgICAgZ290byBlcnI7Ci0JfQotCW4gPSBuX2FyZ3VtZW50cyhvcHQpOwotCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKLQkgICAgaWYgKCFnZXR3b3JkKGYsIGFyZ3NbaV0sICZuZXdsaW5lLCBmaWxlbmFtZSkpIHsKLQkJb3B0aW9uX2Vycm9yKAotCQkJIkluIGZpbGUgJXM6IHRvbyBmZXcgcGFyYW1ldGVycyBmb3Igb3B0aW9uICclcyciLAotCQkJZmlsZW5hbWUsIGNtZCk7Ci0JCWdvdG8gZXJyOwotCSAgICB9Ci0JICAgIGFyZ3ZbaV0gPSBhcmdzW2ldOwotCX0KLQlpZiAoIXByb2Nlc3Nfb3B0aW9uKG9wdCwgY21kLCBhcmd2KSkKLQkgICAgZ290byBlcnI7Ci0gICAgfQotICAgIHJldCA9IDE7Ci0KLWVycjoKLSAgICBmY2xvc2UoZik7Ci0gICAgcHJpdmlsZWdlZF9vcHRpb24gPSBvbGRwcml2OwotICAgIG9wdGlvbl9zb3VyY2UgPSBvbGRzb3VyY2U7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIG9wdGlvbnNfZnJvbV91c2VyIC0gU2VlIGlmIHRoZSB1c2UgaGFzIGEgfi8ucHBwcmMgZmlsZSwKLSAqIGFuZCBpZiBzbywgaW50ZXJwcmV0IG9wdGlvbnMgZnJvbSBpdC4KLSAqLwotaW50Ci1vcHRpb25zX2Zyb21fdXNlcigpCi17Ci0gICAgY2hhciAqdXNlciwgKnBhdGgsICpmaWxlOwotICAgIGludCByZXQ7Ci0gICAgc3RydWN0IHBhc3N3ZCAqcHc7Ci0gICAgc2l6ZV90IHBsOwotCi0gICAgcHcgPSBnZXRwd3VpZChnZXR1aWQoKSk7Ci0gICAgaWYgKHB3ID09IE5VTEwgfHwgKHVzZXIgPSBwdy0+cHdfZGlyKSA9PSBOVUxMIHx8IHVzZXJbMF0gPT0gMCkKLQlyZXR1cm4gMTsKLSAgICBmaWxlID0gX1BBVEhfVVNFUk9QVDsKLSAgICBwbCA9IHN0cmxlbih1c2VyKSArIHN0cmxlbihmaWxlKSArIDI7Ci0gICAgcGF0aCA9IG1hbGxvYyhwbCk7Ci0gICAgaWYgKHBhdGggPT0gTlVMTCkKLQlub3ZtKCJpbml0IGZpbGUgbmFtZSIpOwotICAgIHNscHJpbnRmKHBhdGgsIHBsLCAiJXMvJXMiLCB1c2VyLCBmaWxlKTsKLSAgICBvcHRpb25fcHJpb3JpdHkgPSBPUFJJT19DRkdGSUxFOwotICAgIHJldCA9IG9wdGlvbnNfZnJvbV9maWxlKHBhdGgsIDAsIDEsIHByaXZpbGVnZWQpOwotICAgIGZyZWUocGF0aCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIG9wdGlvbnNfZm9yX3R0eSAtIFNlZSBpZiBhbiBvcHRpb25zIGZpbGUgZXhpc3RzIGZvciB0aGUgc2VyaWFsCi0gKiBkZXZpY2UsIGFuZCBpZiBzbywgaW50ZXJwcmV0IG9wdGlvbnMgZnJvbSBpdC4KLSAqIFdlIG9ubHkgYWxsb3cgdGhlIHBlci10dHkgb3B0aW9ucyBmaWxlIHRvIG92ZXJyaWRlIGFueXRoaW5nIGZyb20KLSAqIHRoZSBjb21tYW5kIGxpbmUgaWYgaXQgaXMgc29tZXRoaW5nIHRoYXQgdGhlIHVzZXIgY2FuJ3Qgb3ZlcnJpZGUKLSAqIG9uY2UgaXQgaGFzIGJlZW4gc2V0IGJ5IHJvb3Q7IHRoaXMgaXMgZG9uZSBieSBnaXZpbmcgY29uZmlndXJhdGlvbgotICogZmlsZXMgYSBsb3dlciBwcmlvcml0eSB0aGFuIHRoZSBjb21tYW5kIGxpbmUuCi0gKi8KLWludAotb3B0aW9uc19mb3JfdHR5KCkKLXsKLSAgICBjaGFyICpkZXYsICpwYXRoLCAqcDsKLSAgICBpbnQgcmV0OwotICAgIHNpemVfdCBwbDsKLQotICAgIGRldiA9IGRldm5hbTsKLSAgICBpZiAoKHAgPSBzdHJzdHIoZGV2LCAiL2Rldi8iKSkgIT0gTlVMTCkKLQlkZXYgPSBwICsgNTsKLSAgICBpZiAoZGV2WzBdID09IDAgfHwgc3RyY21wKGRldiwgInR0eSIpID09IDApCi0JcmV0dXJuIDE7CQkvKiBkb24ndCBsb29rIGZvciAvZXRjL3BwcC9vcHRpb25zLnR0eSAqLwotICAgIHBsID0gc3RybGVuKF9QQVRIX1RUWU9QVCkgKyBzdHJsZW4oZGV2KSArIDE7Ci0gICAgcGF0aCA9IG1hbGxvYyhwbCk7Ci0gICAgaWYgKHBhdGggPT0gTlVMTCkKLQlub3ZtKCJ0dHkgaW5pdCBmaWxlIG5hbWUiKTsKLSAgICBzbHByaW50ZihwYXRoLCBwbCwgIiVzJXMiLCBfUEFUSF9UVFlPUFQsIGRldik7Ci0gICAgLyogVHVybiBzbGFzaGVzIGludG8gZG90cywgZm9yIFNvbGFyaXMgY2FzZSAoZS5nLiAvZGV2L3Rlcm0vYSkgKi8KLSAgICBmb3IgKHAgPSBwYXRoICsgc3RybGVuKF9QQVRIX1RUWU9QVCk7ICpwICE9IDA7ICsrcCkKLQlpZiAoKnAgPT0gJy8nKQotCSAgICAqcCA9ICcuJzsKLSAgICBvcHRpb25fcHJpb3JpdHkgPSBPUFJJT19DRkdGSUxFOwotICAgIHJldCA9IG9wdGlvbnNfZnJvbV9maWxlKHBhdGgsIDAsIDAsIDEpOwotICAgIGZyZWUocGF0aCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIG9wdGlvbnNfZnJvbV9saXN0IC0gcHJvY2VzcyBhIHN0cmluZyBvZiBvcHRpb25zIGluIGEgd29yZGxpc3QuCi0gKi8KLWludAotb3B0aW9uc19mcm9tX2xpc3QodywgcHJpdikKLSAgICBzdHJ1Y3Qgd29yZGxpc3QgKnc7Ci0gICAgaW50IHByaXY7Ci17Ci0gICAgY2hhciAqYXJndltNQVhBUkdTXTsKLSAgICBvcHRpb25fdCAqb3B0OwotICAgIGludCBpLCBuLCByZXQgPSAwOwotICAgIHN0cnVjdCB3b3JkbGlzdCAqdzA7Ci0KLSAgICBwcml2aWxlZ2VkX29wdGlvbiA9IHByaXY7Ci0gICAgb3B0aW9uX3NvdXJjZSA9ICJzZWNyZXRzIGZpbGUiOwotICAgIG9wdGlvbl9wcmlvcml0eSA9IE9QUklPX1NFQ0ZJTEU7Ci0KLSAgICB3aGlsZSAodyAhPSBOVUxMKSB7Ci0Jb3B0ID0gZmluZF9vcHRpb24ody0+d29yZCk7Ci0JaWYgKG9wdCA9PSBOVUxMKSB7Ci0JICAgIG9wdGlvbl9lcnJvcigiSW4gc2VjcmV0cyBmaWxlOiB1bnJlY29nbml6ZWQgb3B0aW9uICclcyciLAotCQkJIHctPndvcmQpOwotCSAgICBnb3RvIGVycjsKLQl9Ci0JbiA9IG5fYXJndW1lbnRzKG9wdCk7Ci0JdzAgPSB3OwotCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKLQkgICAgdyA9IHctPm5leHQ7Ci0JICAgIGlmICh3ID09IE5VTEwpIHsKLQkJb3B0aW9uX2Vycm9yKAotCQkJIkluIHNlY3JldHMgZmlsZTogdG9vIGZldyBwYXJhbWV0ZXJzIGZvciBvcHRpb24gJyVzJyIsCi0JCQl3MC0+d29yZCk7Ci0JCWdvdG8gZXJyOwotCSAgICB9Ci0JICAgIGFyZ3ZbaV0gPSB3LT53b3JkOwotCX0KLQlpZiAoIXByb2Nlc3Nfb3B0aW9uKG9wdCwgdzAtPndvcmQsIGFyZ3YpKQotCSAgICBnb3RvIGVycjsKLQl3ID0gdy0+bmV4dDsKLSAgICB9Ci0gICAgcmV0ID0gMTsKLQotZXJyOgotICAgIHJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBtYXRjaF9vcHRpb24gLSBzZWUgaWYgdGhpcyBvcHRpb24gbWF0Y2hlcyBhbiBvcHRpb25fdCBzdHJ1Y3R1cmUuCi0gKi8KLXN0YXRpYyBpbnQKLW1hdGNoX29wdGlvbihuYW1lLCBvcHQsIGRvd2lsZCkKLSAgICBjaGFyICpuYW1lOwotICAgIG9wdGlvbl90ICpvcHQ7Ci0gICAgaW50IGRvd2lsZDsKLXsKLQlpbnQgKCptYXRjaCkgX19QKChjaGFyICosIGNoYXIgKiosIGludCkpOwotCi0JaWYgKGRvd2lsZCAhPSAob3B0LT50eXBlID09IG9fd2lsZCkpCi0JCXJldHVybiAwOwotCWlmICghZG93aWxkKQotCQlyZXR1cm4gc3RyY21wKG5hbWUsIG9wdC0+bmFtZSkgPT0gMDsKLQltYXRjaCA9IChpbnQgKCopIF9fUCgoY2hhciAqLCBjaGFyICoqLCBpbnQpKSkgb3B0LT5hZGRyOwotCXJldHVybiAoKm1hdGNoKShuYW1lLCBOVUxMLCAwKTsKLX0KLQotLyoKLSAqIGZpbmRfb3B0aW9uIC0gc2NhbiB0aGUgb3B0aW9uIGxpc3RzIGZvciB0aGUgdmFyaW91cyBwcm90b2NvbHMKLSAqIGxvb2tpbmcgZm9yIGFuIGVudHJ5IHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gKiBUaGlzIGNvdWxkIGJlIG9wdGltaXplZCBieSB1c2luZyBhIGhhc2ggdGFibGUuCi0gKi8KLXN0YXRpYyBvcHRpb25fdCAqCi1maW5kX29wdGlvbihuYW1lKQotICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0Jb3B0aW9uX3QgKm9wdDsKLQlzdHJ1Y3Qgb3B0aW9uX2xpc3QgKmxpc3Q7Ci0JaW50IGksIGRvd2lsZDsKLQotCWZvciAoZG93aWxkID0gMDsgZG93aWxkIDw9IDE7ICsrZG93aWxkKSB7Ci0JCWZvciAob3B0ID0gZ2VuZXJhbF9vcHRpb25zOyBvcHQtPm5hbWUgIT0gTlVMTDsgKytvcHQpCi0JCQlpZiAobWF0Y2hfb3B0aW9uKG5hbWUsIG9wdCwgZG93aWxkKSkKLQkJCQlyZXR1cm4gb3B0OwotCQlmb3IgKG9wdCA9IGF1dGhfb3B0aW9uczsgb3B0LT5uYW1lICE9IE5VTEw7ICsrb3B0KQotCQkJaWYgKG1hdGNoX29wdGlvbihuYW1lLCBvcHQsIGRvd2lsZCkpCi0JCQkJcmV0dXJuIG9wdDsKLQkJZm9yIChsaXN0ID0gZXh0cmFfb3B0aW9uczsgbGlzdCAhPSBOVUxMOyBsaXN0ID0gbGlzdC0+bmV4dCkKLQkJCWZvciAob3B0ID0gbGlzdC0+b3B0aW9uczsgb3B0LT5uYW1lICE9IE5VTEw7ICsrb3B0KQotCQkJCWlmIChtYXRjaF9vcHRpb24obmFtZSwgb3B0LCBkb3dpbGQpKQotCQkJCQlyZXR1cm4gb3B0OwotCQlmb3IgKG9wdCA9IHRoZV9jaGFubmVsLT5vcHRpb25zOyBvcHQtPm5hbWUgIT0gTlVMTDsgKytvcHQpCi0JCQlpZiAobWF0Y2hfb3B0aW9uKG5hbWUsIG9wdCwgZG93aWxkKSkKLQkJCQlyZXR1cm4gb3B0OwotCQlmb3IgKGkgPSAwOyBwcm90b2NvbHNbaV0gIT0gTlVMTDsgKytpKQotCQkJaWYgKChvcHQgPSBwcm90b2NvbHNbaV0tPm9wdGlvbnMpICE9IE5VTEwpCi0JCQkJZm9yICg7IG9wdC0+bmFtZSAhPSBOVUxMOyArK29wdCkKLQkJCQkJaWYgKG1hdGNoX29wdGlvbihuYW1lLCBvcHQsIGRvd2lsZCkpCi0JCQkJCQlyZXR1cm4gb3B0OwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIHByb2Nlc3Nfb3B0aW9uIC0gcHJvY2VzcyBvbmUgbmV3LXN0eWxlIG9wdGlvbi4KLSAqLwotc3RhdGljIGludAotcHJvY2Vzc19vcHRpb24ob3B0LCBjbWQsIGFyZ3YpCi0gICAgb3B0aW9uX3QgKm9wdDsKLSAgICBjaGFyICpjbWQ7Ci0gICAgY2hhciAqKmFyZ3Y7Ci17Ci0gICAgdV9pbnQzMl90IHY7Ci0gICAgaW50IGl2LCBhOwotICAgIGNoYXIgKnN2OwotICAgIGludCAoKnBhcnNlcikgX19QKChjaGFyICoqKSk7Ci0gICAgaW50ICgqd2lsZHApIF9fUCgoY2hhciAqLCBjaGFyICoqLCBpbnQpKTsKLSAgICBjaGFyICpvcHRvcHQgPSAob3B0LT50eXBlID09IG9fd2lsZCk/ICIiOiAiIG9wdGlvbiI7Ci0gICAgaW50IHByaW8gPSBvcHRpb25fcHJpb3JpdHk7Ci0gICAgb3B0aW9uX3QgKm1haW5vcHQgPSBvcHQ7Ci0KLSAgICBjdXJyZW50X29wdGlvbiA9IG9wdC0+bmFtZTsKLSAgICBpZiAoKG9wdC0+ZmxhZ3MgJiBPUFRfUFJJVkZJWCkgJiYgcHJpdmlsZWdlZF9vcHRpb24pCi0JcHJpbyArPSBPUFJJT19ST09UOwotICAgIHdoaWxlIChtYWlub3B0LT5mbGFncyAmIE9QVF9QUklPU1VCKQotCS0tbWFpbm9wdDsKLSAgICBpZiAobWFpbm9wdC0+ZmxhZ3MgJiBPUFRfUFJJTykgewotCWlmIChwcmlvIDwgbWFpbm9wdC0+cHJpb3JpdHkpIHsKLQkgICAgLyogbmV3IHZhbHVlIGRvZXNuJ3Qgb3ZlcnJpZGUgb2xkICovCi0JICAgIGlmIChwcmlvID09IE9QUklPX0NNRExJTkUgJiYgbWFpbm9wdC0+cHJpb3JpdHkgPiBPUFJJT19ST09UKSB7Ci0JCW9wdGlvbl9lcnJvcigiJXMlcyBzZXQgaW4gJXMgY2Fubm90IGJlIG92ZXJyaWRkZW5cbiIsCi0JCQkgICAgIG9wdC0+bmFtZSwgb3B0b3B0LCBtYWlub3B0LT5zb3VyY2UpOwotCQlyZXR1cm4gMDsKLQkgICAgfQotCSAgICByZXR1cm4gMTsKLQl9Ci0JaWYgKHByaW8gPiBPUFJJT19ST09UICYmIG1haW5vcHQtPnByaW9yaXR5ID09IE9QUklPX0NNRExJTkUpCi0JICAgIHdhcm4oIiVzJXMgZnJvbSAlcyBvdmVycmlkZXMgY29tbWFuZCBsaW5lIiwKLQkJIG9wdC0+bmFtZSwgb3B0b3B0LCBvcHRpb25fc291cmNlKTsKLSAgICB9Ci0KLSAgICBpZiAoKG9wdC0+ZmxhZ3MgJiBPUFRfSU5JVE9OTFkpICYmIHBoYXNlICE9IFBIQVNFX0lOSVRJQUxJWkUpIHsKLQlvcHRpb25fZXJyb3IoIiVzJXMgY2Fubm90IGJlIGNoYW5nZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24iLAotCQkgICAgIG9wdC0+bmFtZSwgb3B0b3B0KTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKChvcHQtPmZsYWdzICYgT1BUX1BSSVYpICYmICFwcml2aWxlZ2VkX29wdGlvbikgewotCW9wdGlvbl9lcnJvcigidXNpbmcgdGhlICVzJXMgcmVxdWlyZXMgcm9vdCBwcml2aWxlZ2UiLAotCQkgICAgIG9wdC0+bmFtZSwgb3B0b3B0KTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKChvcHQtPmZsYWdzICYgT1BUX0VOQUJMRSkgJiYgKihib29sICopKG9wdC0+YWRkcjIpID09IDApIHsKLQlvcHRpb25fZXJyb3IoIiVzJXMgaXMgZGlzYWJsZWQiLCBvcHQtPm5hbWUsIG9wdG9wdCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmICgob3B0LT5mbGFncyAmIE9QVF9ERVZFUVVJVikgJiYgZGV2bmFtX2ZpeGVkKSB7Ci0Jb3B0aW9uX2Vycm9yKCJ0aGUgJXMlcyBtYXkgbm90IGJlIGNoYW5nZWQgaW4gJXMiLAotCQkgICAgIG9wdC0+bmFtZSwgb3B0b3B0LCBvcHRpb25fc291cmNlKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKG9wdC0+dHlwZSkgewotICAgIGNhc2Ugb19ib29sOgotCXYgPSBvcHQtPmZsYWdzICYgT1BUX1ZBTFVFOwotCSooYm9vbCAqKShvcHQtPmFkZHIpID0gdjsKLQlpZiAob3B0LT5hZGRyMiAmJiAob3B0LT5mbGFncyAmIE9QVF9BMkNPUFkpKQotCSAgICAqKGJvb2wgKikob3B0LT5hZGRyMikgPSB2OwotCWVsc2UgaWYgKG9wdC0+YWRkcjIgJiYgKG9wdC0+ZmxhZ3MgJiBPUFRfQTJDTFIpKQotCSAgICAqKGJvb2wgKikob3B0LT5hZGRyMikgPSAwOwotCWVsc2UgaWYgKG9wdC0+YWRkcjIgJiYgKG9wdC0+ZmxhZ3MgJiBPUFRfQTJDTFJCKSkKLQkgICAgKih1X2NoYXIgKikob3B0LT5hZGRyMikgJj0gfnY7Ci0JZWxzZSBpZiAob3B0LT5hZGRyMiAmJiAob3B0LT5mbGFncyAmIE9QVF9BMk9SKSkKLQkgICAgKih1X2NoYXIgKikob3B0LT5hZGRyMikgfD0gdjsKLQlicmVhazsKLQotICAgIGNhc2Ugb19pbnQ6Ci0JaXYgPSAwOwotCWlmICgob3B0LT5mbGFncyAmIE9QVF9OT0FSRykgPT0gMCkgewotCSAgICBpZiAoIWludF9vcHRpb24oKmFyZ3YsICZpdikpCi0JCXJldHVybiAwOwotCSAgICBpZiAoKCgob3B0LT5mbGFncyAmIE9QVF9MTElNSVQpICYmIGl2IDwgb3B0LT5sb3dlcl9saW1pdCkKLQkJIHx8ICgob3B0LT5mbGFncyAmIE9QVF9VTElNSVQpICYmIGl2ID4gb3B0LT51cHBlcl9saW1pdCkpCi0JCSYmICEoKG9wdC0+ZmxhZ3MgJiBPUFRfWkVST09LICYmIGl2ID09IDApKSkgewotCQljaGFyICp6b2sgPSAob3B0LT5mbGFncyAmIE9QVF9aRVJPT0spPyAiIHplcm8gb3IiOiAiIjsKLQkJc3dpdGNoIChvcHQtPmZsYWdzICYgT1BUX0xJTUlUUykgewotCQljYXNlIE9QVF9MTElNSVQ6Ci0JCSAgICBvcHRpb25fZXJyb3IoIiVzIHZhbHVlIG11c3QgYmUlcyA+PSAlZCIsCi0JCQkJIG9wdC0+bmFtZSwgem9rLCBvcHQtPmxvd2VyX2xpbWl0KTsKLQkJICAgIGJyZWFrOwotCQljYXNlIE9QVF9VTElNSVQ6Ci0JCSAgICBvcHRpb25fZXJyb3IoIiVzIHZhbHVlIG11c3QgYmUlcyA8PSAlZCIsCi0JCQkJIG9wdC0+bmFtZSwgem9rLCBvcHQtPnVwcGVyX2xpbWl0KTsKLQkJICAgIGJyZWFrOwotCQljYXNlIE9QVF9MSU1JVFM6Ci0JCSAgICBvcHRpb25fZXJyb3IoIiVzIHZhbHVlIG11c3QgYmUlcyBiZXR3ZWVuICVkIGFuZCAlZCIsCi0JCQkJb3B0LT5uYW1lLCB6b2ssIG9wdC0+bG93ZXJfbGltaXQsIG9wdC0+dXBwZXJfbGltaXQpOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JICAgIH0KLQl9Ci0JYSA9IG9wdC0+ZmxhZ3MgJiBPUFRfVkFMVUU7Ci0JaWYgKGEgPj0gMTI4KQotCSAgICBhIC09IDI1NjsJCS8qIHNpZ24gZXh0ZW5kICovCi0JaXYgKz0gYTsKLQlpZiAob3B0LT5mbGFncyAmIE9QVF9JTkMpCi0JICAgIGl2ICs9ICooaW50ICopKG9wdC0+YWRkcik7Ci0JaWYgKChvcHQtPmZsYWdzICYgT1BUX05PSU5DUikgJiYgIXByaXZpbGVnZWRfb3B0aW9uKSB7Ci0JICAgIGludCBvbGR2ID0gKihpbnQgKikob3B0LT5hZGRyKTsKLQkgICAgaWYgKChvcHQtPmZsYWdzICYgT1BUX1pFUk9JTkYpID8KLQkJKG9sZHYgIT0gMCAmJiAoaXYgPT0gMCB8fCBpdiA+IG9sZHYpKSA6IChpdiA+IG9sZHYpKSB7Ci0JCW9wdGlvbl9lcnJvcigiJXMgdmFsdWUgY2Fubm90IGJlIGluY3JlYXNlZCIsIG9wdC0+bmFtZSk7Ci0JCXJldHVybiAwOwotCSAgICB9Ci0JfQotCSooaW50ICopKG9wdC0+YWRkcikgPSBpdjsKLQlpZiAob3B0LT5hZGRyMiAmJiAob3B0LT5mbGFncyAmIE9QVF9BMkNPUFkpKQotCSAgICAqKGludCAqKShvcHQtPmFkZHIyKSA9IGl2OwotCWJyZWFrOwotCi0gICAgY2FzZSBvX3VpbnQzMjoKLQlpZiAob3B0LT5mbGFncyAmIE9QVF9OT0FSRykgewotCSAgICB2ID0gb3B0LT5mbGFncyAmIE9QVF9WQUxVRTsKLQkgICAgaWYgKHYgJiAweDgwKQotCQkgICAgdiB8PSAweGZmZmZmZjAwVTsKLQl9IGVsc2UgaWYgKCFudW1iZXJfb3B0aW9uKCphcmd2LCAmdiwgMTYpKQotCSAgICByZXR1cm4gMDsKLQlpZiAob3B0LT5mbGFncyAmIE9QVF9PUikKLQkgICAgdiB8PSAqKHVfaW50MzJfdCAqKShvcHQtPmFkZHIpOwotCSoodV9pbnQzMl90ICopKG9wdC0+YWRkcikgPSB2OwotCWlmIChvcHQtPmFkZHIyICYmIChvcHQtPmZsYWdzICYgT1BUX0EyQ09QWSkpCi0JICAgICoodV9pbnQzMl90ICopKG9wdC0+YWRkcjIpID0gdjsKLQlicmVhazsKLQotICAgIGNhc2Ugb19zdHJpbmc6Ci0JaWYgKG9wdC0+ZmxhZ3MgJiBPUFRfU1RBVElDKSB7Ci0JICAgIHN0cmxjcHkoKGNoYXIgKikob3B0LT5hZGRyKSwgKmFyZ3YsIG9wdC0+dXBwZXJfbGltaXQpOwotCX0gZWxzZSB7Ci0JICAgIGNoYXIgKipvcHRwdHIgPSAoY2hhciAqKikob3B0LT5hZGRyKTsKLQkgICAgc3YgPSBzdHJkdXAoKmFyZ3YpOwotCSAgICBpZiAoc3YgPT0gTlVMTCkKLQkJbm92bSgib3B0aW9uIGFyZ3VtZW50Iik7Ci0JICAgIGlmICgqb3B0cHRyKQotCQlmcmVlKCpvcHRwdHIpOwotCSAgICAqb3B0cHRyID0gc3Y7Ci0JfQotCWJyZWFrOwotCi0gICAgY2FzZSBvX3NwZWNpYWxfbm9hcmc6Ci0gICAgY2FzZSBvX3NwZWNpYWw6Ci0JcGFyc2VyID0gKGludCAoKikgX19QKChjaGFyICoqKSkpIG9wdC0+YWRkcjsKLQljdXJvcHQgPSBvcHQ7Ci0JaWYgKCEoKnBhcnNlcikoYXJndikpCi0JICAgIHJldHVybiAwOwotCWlmIChvcHQtPmZsYWdzICYgT1BUX0EyTElTVCkgewotCSAgICBzdHJ1Y3Qgb3B0aW9uX3ZhbHVlICpvdnAsICpwcDsKLQotCSAgICBvdnAgPSBtYWxsb2Moc2l6ZW9mKCpvdnApICsgc3RybGVuKCphcmd2KSk7Ci0JICAgIGlmIChvdnAgIT0gMCkgewotCQlzdHJjcHkob3ZwLT52YWx1ZSwgKmFyZ3YpOwotCQlvdnAtPnNvdXJjZSA9IG9wdGlvbl9zb3VyY2U7Ci0JCW92cC0+bmV4dCA9IE5VTEw7Ci0JCWlmIChvcHQtPmFkZHIyID09IE5VTEwpIHsKLQkJICAgIG9wdC0+YWRkcjIgPSBvdnA7Ci0JCX0gZWxzZSB7Ci0JCSAgICBmb3IgKHBwID0gb3B0LT5hZGRyMjsgcHAtPm5leHQgIT0gTlVMTDsgcHAgPSBwcC0+bmV4dCkKLQkJCTsKLQkJICAgIHBwLT5uZXh0ID0gb3ZwOwotCQl9Ci0JICAgIH0KLQl9Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIG9fd2lsZDoKLQl3aWxkcCA9IChpbnQgKCopIF9fUCgoY2hhciAqLCBjaGFyICoqLCBpbnQpKSkgb3B0LT5hZGRyOwotCWlmICghKCp3aWxkcCkoY21kLCBhcmd2LCAxKSkKLQkgICAgcmV0dXJuIDA7Ci0JYnJlYWs7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBJZiBhZGRyMiB3YXNuJ3QgdXNlZCBieSBhbnkgZmxhZyAoT1BUX0EyQ09QWSwgZXRjLikgYnV0IGlzIHNldCwKLSAgICAgKiB0cmVhdCBpdCBhcyBhIGJvb2wgYW5kIHNldC9jbGVhciBpdCBiYXNlZCBvbiB0aGUgT1BUX0EyQ0xSIGJpdC4KLSAgICAgKi8KLSAgICBpZiAob3B0LT5hZGRyMiAmJiAob3B0LT5mbGFncyAmIChPUFRfQTJDT1BZfE9QVF9FTkFCTEUKLQkJfE9QVF9BMlBSSU5URVJ8T1BUX0EyU1RSVkFMfE9QVF9BMkxJU1R8T1BUX0EyT1IpKSA9PSAwKQotCSooYm9vbCAqKShvcHQtPmFkZHIyKSA9ICEob3B0LT5mbGFncyAmIE9QVF9BMkNMUik7Ci0KLSAgICBtYWlub3B0LT5zb3VyY2UgPSBvcHRpb25fc291cmNlOwotICAgIG1haW5vcHQtPnByaW9yaXR5ID0gcHJpbzsKLSAgICBtYWlub3B0LT53aW5uZXIgPSBvcHQgLSBtYWlub3B0OwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBvdmVycmlkZV92YWx1ZSAtIGlmIHRoZSBvcHRpb24gcHJpb3JpdGllcyB3b3VsZCBwZXJtaXQgdXMgdG8KLSAqIG92ZXJyaWRlIHRoZSB2YWx1ZSBvZiBvcHRpb24sIHJldHVybiAxIGFuZCB1cGRhdGUgdGhlIHByaW9yaXR5Ci0gKiBhbmQgc291cmNlIG9mIHRoZSBvcHRpb24gdmFsdWUuICBPdGhlcndpc2UgcmV0dXJucyAwLgotICovCi1pbnQKLW92ZXJyaWRlX3ZhbHVlKG9wdGlvbiwgcHJpb3JpdHksIHNvdXJjZSkKLSAgICBjb25zdCBjaGFyICpvcHRpb247Ci0gICAgaW50IHByaW9yaXR5OwotICAgIGNvbnN0IGNoYXIgKnNvdXJjZTsKLXsKLQlvcHRpb25fdCAqb3B0OwotCi0Jb3B0ID0gZmluZF9vcHRpb24ob3B0aW9uKTsKLQlpZiAob3B0ID09IE5VTEwpCi0JCXJldHVybiAwOwotCXdoaWxlIChvcHQtPmZsYWdzICYgT1BUX1BSSU9TVUIpCi0JCS0tb3B0OwotCWlmICgob3B0LT5mbGFncyAmIE9QVF9QUklPKSAmJiBwcmlvcml0eSA8IG9wdC0+cHJpb3JpdHkpCi0JCXJldHVybiAwOwotCW9wdC0+cHJpb3JpdHkgPSBwcmlvcml0eTsKLQlvcHQtPnNvdXJjZSA9IHNvdXJjZTsKLQlvcHQtPndpbm5lciA9IC0xOwotCXJldHVybiAxOwotfQotCi0vKgotICogbl9hcmd1bWVudHMgLSB0ZWxsIGhvdyBtYW55IGFyZ3VtZW50cyBhbiBvcHRpb24gdGFrZXMKLSAqLwotc3RhdGljIGludAotbl9hcmd1bWVudHMob3B0KQotICAgIG9wdGlvbl90ICpvcHQ7Ci17Ci0JcmV0dXJuIChvcHQtPnR5cGUgPT0gb19ib29sIHx8IG9wdC0+dHlwZSA9PSBvX3NwZWNpYWxfbm9hcmcKLQkJfHwgKG9wdC0+ZmxhZ3MgJiBPUFRfTk9BUkcpKT8gMDogMTsKLX0KLQotLyoKLSAqIGFkZF9vcHRpb25zIC0gYWRkIGEgbGlzdCBvZiBvcHRpb25zIHRvIHRoZSBzZXQgd2UgZ3Jvay4KLSAqLwotdm9pZAotYWRkX29wdGlvbnMob3B0KQotICAgIG9wdGlvbl90ICpvcHQ7Ci17Ci0gICAgc3RydWN0IG9wdGlvbl9saXN0ICpsaXN0OwotCi0gICAgbGlzdCA9IG1hbGxvYyhzaXplb2YoKmxpc3QpKTsKLSAgICBpZiAobGlzdCA9PSAwKQotCW5vdm0oIm9wdGlvbiBsaXN0IGVudHJ5Iik7Ci0gICAgbGlzdC0+b3B0aW9ucyA9IG9wdDsKLSAgICBsaXN0LT5uZXh0ID0gZXh0cmFfb3B0aW9uczsKLSAgICBleHRyYV9vcHRpb25zID0gbGlzdDsKLX0KLQotLyoKLSAqIGNoZWNrX29wdGlvbnMgLSBjaGVjayB0aGF0IG9wdGlvbnMgYXJlIHZhbGlkIGFuZCBjb25zaXN0ZW50LgotICovCi12b2lkCi1jaGVja19vcHRpb25zKCkKLXsKLQlpZiAobG9nZmlsZV9mZCA+PSAwICYmIGxvZ2ZpbGVfZmQgIT0gbG9nX3RvX2ZkKQotCQljbG9zZShsb2dmaWxlX2ZkKTsKLX0KLQotLyoKLSAqIHByaW50X29wdGlvbiAtIHByaW50IG91dCBhbiBvcHRpb24gYW5kIGl0cyB2YWx1ZQotICovCi1zdGF0aWMgdm9pZAotcHJpbnRfb3B0aW9uKG9wdCwgbWFpbm9wdCwgcHJpbnRlciwgYXJnKQotICAgIG9wdGlvbl90ICpvcHQsICptYWlub3B0OwotICAgIHByaW50ZXJfZnVuYyBwcmludGVyOwotICAgIHZvaWQgKmFyZzsKLXsKLQlpbnQgaSwgdjsKLQljaGFyICpwOwotCi0JaWYgKG9wdC0+ZmxhZ3MgJiBPUFRfTk9QUklOVCkKLQkJcmV0dXJuOwotCXN3aXRjaCAob3B0LT50eXBlKSB7Ci0JY2FzZSBvX2Jvb2w6Ci0JCXYgPSBvcHQtPmZsYWdzICYgT1BUX1ZBTFVFOwotCQlpZiAoKihib29sICopb3B0LT5hZGRyICE9IHYpCi0JCQkvKiB0aGlzIGNhbiBoYXBwZW4gbGVnaXRpbWF0ZWx5LCBlLmcuIGxvY2sKLQkJCSAgIG9wdGlvbiB0dXJuZWQgb2ZmIGZvciBkZWZhdWx0IGRldmljZSAqLwotCQkJYnJlYWs7Ci0JCXByaW50ZXIoYXJnLCAiJXMiLCBvcHQtPm5hbWUpOwotCQlicmVhazsKLQljYXNlIG9faW50OgotCQl2ID0gb3B0LT5mbGFncyAmIE9QVF9WQUxVRTsKLQkJaWYgKHYgPj0gMTI4KQotCQkJdiAtPSAyNTY7Ci0JCWkgPSAqKGludCAqKW9wdC0+YWRkcjsKLQkJaWYgKG9wdC0+ZmxhZ3MgJiBPUFRfTk9BUkcpIHsKLQkJCXByaW50ZXIoYXJnLCAiJXMiLCBvcHQtPm5hbWUpOwotCQkJaWYgKGkgIT0gdikgewotCQkJCWlmIChvcHQtPmZsYWdzICYgT1BUX0lOQykgewotCQkJCQlmb3IgKDsgaSA+IHY7IGkgLT0gdikKLQkJCQkJCXByaW50ZXIoYXJnLCAiICVzIiwgb3B0LT5uYW1lKTsKLQkJCQl9IGVsc2UKLQkJCQkJcHJpbnRlcihhcmcsICIgIyBvb3BzOiAlZCBub3QgJWRcbiIsCi0JCQkJCQlpLCB2KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXByaW50ZXIoYXJnLCAiJXMgJWQiLCBvcHQtPm5hbWUsIGkpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2Ugb191aW50MzI6Ci0JCXByaW50ZXIoYXJnLCAiJXMiLCBvcHQtPm5hbWUpOwotCQlpZiAoKG9wdC0+ZmxhZ3MgJiBPUFRfTk9BUkcpID09IDApCi0JCQlwcmludGVyKGFyZywgIiAleCIsICoodV9pbnQzMl90ICopb3B0LT5hZGRyKTsKLQkJYnJlYWs7Ci0KLQljYXNlIG9fc3RyaW5nOgotCQlpZiAob3B0LT5mbGFncyAmIE9QVF9ISURFKSB7Ci0JCQlwID0gIj8/Pz8/PyI7Ci0JCX0gZWxzZSB7Ci0JCQlwID0gKGNoYXIgKikgb3B0LT5hZGRyOwotCQkJaWYgKChvcHQtPmZsYWdzICYgT1BUX1NUQVRJQykgPT0gMCkKLQkJCQlwID0gKihjaGFyICoqKXA7Ci0JCX0KLQkJcHJpbnRlcihhcmcsICIlcyAlcSIsIG9wdC0+bmFtZSwgcCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBvX3NwZWNpYWw6Ci0JY2FzZSBvX3NwZWNpYWxfbm9hcmc6Ci0JY2FzZSBvX3dpbGQ6Ci0JCWlmIChvcHQtPnR5cGUgIT0gb193aWxkKSB7Ci0JCQlwcmludGVyKGFyZywgIiVzIiwgb3B0LT5uYW1lKTsKLQkJCWlmIChuX2FyZ3VtZW50cyhvcHQpID09IDApCi0JCQkJYnJlYWs7Ci0JCQlwcmludGVyKGFyZywgIiAiKTsKLQkJfQotCQlpZiAob3B0LT5mbGFncyAmIE9QVF9BMlBSSU5URVIpIHsKLQkJCXZvaWQgKCpvcHJ0KSBfX1AoKG9wdGlvbl90ICosIHByaW50ZXJfZnVuYywgdm9pZCAqKSk7Ci0JCQlvcHJ0ID0gKHZvaWQgKCopIF9fUCgob3B0aW9uX3QgKiwgcHJpbnRlcl9mdW5jLAotCQkJCQkgdm9pZCAqKSkpb3B0LT5hZGRyMjsKLQkJCSgqb3BydCkob3B0LCBwcmludGVyLCBhcmcpOwotCQl9IGVsc2UgaWYgKG9wdC0+ZmxhZ3MgJiBPUFRfQTJTVFJWQUwpIHsKLQkJCXAgPSAoY2hhciAqKSBvcHQtPmFkZHIyOwotCQkJaWYgKChvcHQtPmZsYWdzICYgT1BUX1NUQVRJQykgPT0gMCkKLQkJCQlwID0gKihjaGFyICoqKXA7Ci0JCQlwcmludGVyKCIlcSIsIHApOwotCQl9IGVsc2UgaWYgKG9wdC0+ZmxhZ3MgJiBPUFRfQTJMSVNUKSB7Ci0JCQlzdHJ1Y3Qgb3B0aW9uX3ZhbHVlICpvdnA7Ci0KLQkJCW92cCA9IChzdHJ1Y3Qgb3B0aW9uX3ZhbHVlICopIG9wdC0+YWRkcjI7Ci0JCQlmb3IgKDs7KSB7Ci0JCQkJcHJpbnRlcihhcmcsICIlcSIsIG92cC0+dmFsdWUpOwotCQkJCWlmICgob3ZwID0gb3ZwLT5uZXh0KSA9PSBOVUxMKQotCQkJCQlicmVhazsKLQkJCQlwcmludGVyKGFyZywgIlx0XHQjIChmcm9tICVzKVxuJXMgIiwKLQkJCQkJb3ZwLT5zb3VyY2UsIG9wdC0+bmFtZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlwcmludGVyKGFyZywgInh4eCAjIFtkb24ndCBrbm93IGhvdyB0byBwcmludCB2YWx1ZV0iKTsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByaW50ZXIoYXJnLCAiIyAlcyB2YWx1ZSAodHlwZSAlZFw/XD8pIiwgb3B0LT5uYW1lLCBvcHQtPnR5cGUpOwotCQlicmVhazsKLQl9Ci0JcHJpbnRlcihhcmcsICJcdFx0IyAoZnJvbSAlcylcbiIsIG1haW5vcHQtPnNvdXJjZSk7Ci19Ci0KLS8qCi0gKiBwcmludF9vcHRpb25fbGlzdCAtIHByaW50IG91dCBvcHRpb25zIGluIGVmZmVjdCBmcm9tIGFuCi0gKiBhcnJheSBvZiBvcHRpb25zLgotICovCi1zdGF0aWMgdm9pZAotcHJpbnRfb3B0aW9uX2xpc3Qob3B0LCBwcmludGVyLCBhcmcpCi0gICAgb3B0aW9uX3QgKm9wdDsKLSAgICBwcmludGVyX2Z1bmMgcHJpbnRlcjsKLSAgICB2b2lkICphcmc7Ci17Ci0Jd2hpbGUgKG9wdC0+bmFtZSAhPSBOVUxMKSB7Ci0JCWlmIChvcHQtPnByaW9yaXR5ICE9IE9QUklPX0RFRkFVTFQKLQkJICAgICYmIG9wdC0+d2lubmVyICE9IChzaG9ydCBpbnQpIC0xKQotCQkJcHJpbnRfb3B0aW9uKG9wdCArIG9wdC0+d2lubmVyLCBvcHQsIHByaW50ZXIsIGFyZyk7Ci0JCWRvIHsKLQkJCSsrb3B0OwotCQl9IHdoaWxlIChvcHQtPmZsYWdzICYgT1BUX1BSSU9TVUIpOwotCX0KLX0KLQotLyoKLSAqIHByaW50X29wdGlvbnMgLSBwcmludCBvdXQgd2hhdCBvcHRpb25zIGFyZSBpbiBlZmZlY3QuCi0gKi8KLXZvaWQKLXByaW50X29wdGlvbnMocHJpbnRlciwgYXJnKQotICAgIHByaW50ZXJfZnVuYyBwcmludGVyOwotICAgIHZvaWQgKmFyZzsKLXsKLQlzdHJ1Y3Qgb3B0aW9uX2xpc3QgKmxpc3Q7Ci0JaW50IGk7Ci0KLQlwcmludGVyKGFyZywgInBwcGQgb3B0aW9ucyBpbiBlZmZlY3Q6XG4iKTsKLQlwcmludF9vcHRpb25fbGlzdChnZW5lcmFsX29wdGlvbnMsIHByaW50ZXIsIGFyZyk7Ci0JcHJpbnRfb3B0aW9uX2xpc3QoYXV0aF9vcHRpb25zLCBwcmludGVyLCBhcmcpOwotCWZvciAobGlzdCA9IGV4dHJhX29wdGlvbnM7IGxpc3QgIT0gTlVMTDsgbGlzdCA9IGxpc3QtPm5leHQpCi0JCXByaW50X29wdGlvbl9saXN0KGxpc3QtPm9wdGlvbnMsIHByaW50ZXIsIGFyZyk7Ci0JcHJpbnRfb3B0aW9uX2xpc3QodGhlX2NoYW5uZWwtPm9wdGlvbnMsIHByaW50ZXIsIGFyZyk7Ci0JZm9yIChpID0gMDsgcHJvdG9jb2xzW2ldICE9IE5VTEw7ICsraSkKLQkJcHJpbnRfb3B0aW9uX2xpc3QocHJvdG9jb2xzW2ldLT5vcHRpb25zLCBwcmludGVyLCBhcmcpOwotfQotCi0vKgotICogdXNhZ2UgLSBwcmludCBvdXQgYSBtZXNzYWdlIHRlbGxpbmcgaG93IHRvIHVzZSB0aGUgcHJvZ3JhbS4KLSAqLwotc3RhdGljIHZvaWQKLXVzYWdlKCkKLXsKLSAgICBpZiAocGhhc2UgPT0gUEhBU0VfSU5JVElBTElaRSkKLQlmcHJpbnRmKHN0ZGVyciwgdXNhZ2Vfc3RyaW5nLCBWRVJTSU9OLCBwcm9nbmFtZSk7Ci19Ci0KLS8qCi0gKiBzaG93aGVscCAtIHByaW50IG91dCB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LgotICovCi1zdGF0aWMgaW50Ci1zaG93aGVscChhcmd2KQotICAgIGNoYXIgKiphcmd2OwotewotICAgIGlmIChwaGFzZSA9PSBQSEFTRV9JTklUSUFMSVpFKSB7Ci0JdXNhZ2UoKTsKLQlleGl0KDApOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIHNob3d2ZXJzaW9uIC0gcHJpbnQgb3V0IHRoZSB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdC4KLSAqLwotc3RhdGljIGludAotc2hvd3ZlcnNpb24oYXJndikKLSAgICBjaGFyICoqYXJndjsKLXsKLSAgICBpZiAocGhhc2UgPT0gUEhBU0VfSU5JVElBTElaRSkgewotCWZwcmludGYoc3RkZXJyLCAicHBwZCB2ZXJzaW9uICVzXG4iLCBWRVJTSU9OKTsKLQlleGl0KDApOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIG9wdGlvbl9lcnJvciAtIHByaW50IGEgbWVzc2FnZSBhYm91dCBhbiBlcnJvciBpbiBhbiBvcHRpb24uCi0gKiBUaGUgbWVzc2FnZSBpcyBsb2dnZWQsIGFuZCBhbHNvIHNlbnQgdG8KLSAqIHN0ZGVyciBpZiBwaGFzZSA9PSBQSEFTRV9JTklUSUFMSVpFLgotICovCi12b2lkCi1vcHRpb25fZXJyb3IgX19WKChjaGFyICpmbXQsIC4uLikpCi17Ci0gICAgdmFfbGlzdCBhcmdzOwotICAgIGNoYXIgYnVmWzEwMjRdOwotCi0jaWYgZGVmaW5lZChfX1NURENfXykKLSAgICB2YV9zdGFydChhcmdzLCBmbXQpOwotI2Vsc2UKLSAgICBjaGFyICpmbXQ7Ci0gICAgdmFfc3RhcnQoYXJncyk7Ci0gICAgZm10ID0gdmFfYXJnKGFyZ3MsIGNoYXIgKik7Ci0jZW5kaWYKLSAgICB2c2xwcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcmdzKTsKLSAgICB2YV9lbmQoYXJncyk7Ci0gICAgaWYgKHBoYXNlID09IFBIQVNFX0lOSVRJQUxJWkUpCi0JZnByaW50ZihzdGRlcnIsICIlczogJXNcbiIsIHByb2duYW1lLCBidWYpOwotICAgIHN5c2xvZyhMT0dfRVJSLCAiJXMiLCBidWYpOwotfQotCi0jaWYgMAotLyoKLSAqIHJlYWRhYmxlIC0gY2hlY2sgaWYgYSBmaWxlIGlzIHJlYWRhYmxlIGJ5IHRoZSByZWFsIHVzZXIuCi0gKi8KLWludAotcmVhZGFibGUoZmQpCi0gICAgaW50IGZkOwotewotICAgIHVpZF90IHVpZDsKLSAgICBpbnQgaTsKLSAgICBzdHJ1Y3Qgc3RhdCBzYnVmOwotCi0gICAgdWlkID0gZ2V0dWlkKCk7Ci0gICAgaWYgKHVpZCA9PSAwKQotCXJldHVybiAxOwotICAgIGlmIChmc3RhdChmZCwgJnNidWYpICE9IDApCi0JcmV0dXJuIDA7Ci0gICAgaWYgKHNidWYuc3RfdWlkID09IHVpZCkKLQlyZXR1cm4gc2J1Zi5zdF9tb2RlICYgU19JUlVTUjsKLSAgICBpZiAoc2J1Zi5zdF9naWQgPT0gZ2V0Z2lkKCkpCi0JcmV0dXJuIHNidWYuc3RfbW9kZSAmIFNfSVJHUlA7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5ncm91cHM7ICsraSkKLQlpZiAoc2J1Zi5zdF9naWQgPT0gZ3JvdXBzW2ldKQotCSAgICByZXR1cm4gc2J1Zi5zdF9tb2RlICYgU19JUkdSUDsKLSAgICByZXR1cm4gc2J1Zi5zdF9tb2RlICYgU19JUk9USDsKLX0KLSNlbmRpZgotCi0vKgotICogUmVhZCBhIHdvcmQgZnJvbSBhIGZpbGUuCi0gKiBXb3JkcyBhcmUgZGVsaW1pdGVkIGJ5IHdoaXRlLXNwYWNlIG9yIGJ5IHF1b3RlcyAoIiBvciAnKS4KLSAqIFF1b3Rlcywgd2hpdGUtc3BhY2UgYW5kIFwgbWF5IGJlIGVzY2FwZWQgd2l0aCBcLgotICogXDxuZXdsaW5lPiBpcyBpZ25vcmVkLgotICovCi1pbnQKLWdldHdvcmQoZiwgd29yZCwgbmV3bGluZXAsIGZpbGVuYW1lKQotICAgIEZJTEUgKmY7Ci0gICAgY2hhciAqd29yZDsKLSAgICBpbnQgKm5ld2xpbmVwOwotICAgIGNoYXIgKmZpbGVuYW1lOwotewotICAgIGludCBjLCBsZW4sIGVzY2FwZTsKLSAgICBpbnQgcXVvdGVkLCBjb21tZW50OwotICAgIGludCB2YWx1ZSwgZGlnaXQsIGdvdCwgbjsKLQotI2RlZmluZSBpc29jdGFsKGMpICgoYykgPj0gJzAnICYmIChjKSA8ICc4JykKLQotICAgICpuZXdsaW5lcCA9IDA7Ci0gICAgbGVuID0gMDsKLSAgICBlc2NhcGUgPSAwOwotICAgIGNvbW1lbnQgPSAwOwotICAgIHF1b3RlZCA9IDA7Ci0KLSAgICAvKgotICAgICAqIEZpcnN0IHNraXAgd2hpdGUtc3BhY2UgYW5kIGNvbW1lbnRzLgotICAgICAqLwotICAgIGZvciAoOzspIHsKLQljID0gZ2V0YyhmKTsKLQlpZiAoYyA9PSBFT0YpCi0JICAgIGJyZWFrOwotCi0JLyoKLQkgKiBBIG5ld2xpbmUgbWVhbnMgdGhlIGVuZCBvZiBhIGNvbW1lbnQ7IGJhY2tzbGFzaC1uZXdsaW5lCi0JICogaXMgaWdub3JlZC4gIE5vdGUgdGhhdCB3ZSBjYW5ub3QgaGF2ZSBlc2NhcGUgJiYgY29tbWVudC4KLQkgKi8KLQlpZiAoYyA9PSAnXG4nKSB7Ci0JICAgIGlmICghZXNjYXBlKSB7Ci0JCSpuZXdsaW5lcCA9IDE7Ci0JCWNvbW1lbnQgPSAwOwotCSAgICB9IGVsc2UKLQkJZXNjYXBlID0gMDsKLQkgICAgY29udGludWU7Ci0JfQotCi0JLyoKLQkgKiBJZ25vcmUgY2hhcmFjdGVycyBvdGhlciB0aGFuIG5ld2xpbmUgaW4gYSBjb21tZW50LgotCSAqLwotCWlmIChjb21tZW50KQotCSAgICBjb250aW51ZTsKLQotCS8qCi0JICogSWYgdGhpcyBjaGFyYWN0ZXIgaXMgZXNjYXBlZCwgd2UgaGF2ZSBhIHdvcmQgc3RhcnQuCi0JICovCi0JaWYgKGVzY2FwZSkKLQkgICAgYnJlYWs7Ci0KLQkvKgotCSAqIElmIHRoaXMgaXMgdGhlIGVzY2FwZSBjaGFyYWN0ZXIsIGxvb2sgYXQgdGhlIG5leHQgY2hhcmFjdGVyLgotCSAqLwotCWlmIChjID09ICdcXCcpIHsKLQkgICAgZXNjYXBlID0gMTsKLQkgICAgY29udGludWU7Ci0JfQotCi0JLyoKLQkgKiBJZiB0aGlzIGlzIHRoZSBzdGFydCBvZiBhIGNvbW1lbnQsIGlnbm9yZSB0aGUgcmVzdCBvZiB0aGUgbGluZS4KLQkgKi8KLQlpZiAoYyA9PSAnIycpIHsKLQkgICAgY29tbWVudCA9IDE7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotCS8qCi0JICogQSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgdGhlIHN0YXJ0IG9mIGEgd29yZC4KLQkgKi8KLQlpZiAoIWlzc3BhY2UoYykpCi0JICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUHJvY2VzcyBjaGFyYWN0ZXJzIHVudGlsIHRoZSBlbmQgb2YgdGhlIHdvcmQuCi0gICAgICovCi0gICAgd2hpbGUgKGMgIT0gRU9GKSB7Ci0JaWYgKGVzY2FwZSkgewotCSAgICAvKgotCSAgICAgKiBUaGlzIGNoYXJhY3RlciBpcyBlc2NhcGVkOiBiYWNrc2xhc2gtbmV3bGluZSBpcyBpZ25vcmVkLAotCSAgICAgKiB2YXJpb3VzIG90aGVyIGNoYXJhY3RlcnMgaW5kaWNhdGUgcGFydGljdWxhciB2YWx1ZXMKLQkgICAgICogYXMgZm9yIEMgYmFja3NsYXNoLWVzY2FwZXMuCi0JICAgICAqLwotCSAgICBlc2NhcGUgPSAwOwotCSAgICBpZiAoYyA9PSAnXG4nKSB7Ci0JICAgICAgICBjID0gZ2V0YyhmKTsKLQkJY29udGludWU7Ci0JICAgIH0KLQotCSAgICBnb3QgPSAwOwotCSAgICBzd2l0Y2ggKGMpIHsKLQkgICAgY2FzZSAnYSc6Ci0JCXZhbHVlID0gJ1xhJzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgJ2InOgotCQl2YWx1ZSA9ICdcYic7Ci0JCWJyZWFrOwotCSAgICBjYXNlICdmJzoKLQkJdmFsdWUgPSAnXGYnOwotCQlicmVhazsKLQkgICAgY2FzZSAnbic6Ci0JCXZhbHVlID0gJ1xuJzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgJ3InOgotCQl2YWx1ZSA9ICdccic7Ci0JCWJyZWFrOwotCSAgICBjYXNlICdzJzoKLQkJdmFsdWUgPSAnICc7Ci0JCWJyZWFrOwotCSAgICBjYXNlICd0JzoKLQkJdmFsdWUgPSAnXHQnOwotCQlicmVhazsKLQotCSAgICBkZWZhdWx0OgotCQlpZiAoaXNvY3RhbChjKSkgewotCQkgICAgLyoKLQkJICAgICAqIFxkZGQgb2N0YWwgc2VxdWVuY2UKLQkJICAgICAqLwotCQkgICAgdmFsdWUgPSAwOwotCQkgICAgZm9yIChuID0gMDsgbiA8IDMgJiYgaXNvY3RhbChjKTsgKytuKSB7Ci0JCQl2YWx1ZSA9ICh2YWx1ZSA8PCAzKSArIChjICYgMDcpOwotCQkJYyA9IGdldGMoZik7Ci0JCSAgICB9Ci0JCSAgICBnb3QgPSAxOwotCQkgICAgYnJlYWs7Ci0JCX0KLQotCQlpZiAoYyA9PSAneCcpIHsKLQkJICAgIC8qCi0JCSAgICAgKiBceDxoZXhfc3RyaW5nPiBzZXF1ZW5jZQotCQkgICAgICovCi0JCSAgICB2YWx1ZSA9IDA7Ci0JCSAgICBjID0gZ2V0YyhmKTsKLQkJICAgIGZvciAobiA9IDA7IG4gPCAyICYmIGlzeGRpZ2l0KGMpOyArK24pIHsKLQkJCWRpZ2l0ID0gdG91cHBlcihjKSAtICcwJzsKLQkJCWlmIChkaWdpdCA+IDEwKQotCQkJICAgIGRpZ2l0ICs9ICcwJyArIDEwIC0gJ0EnOwotCQkJdmFsdWUgPSAodmFsdWUgPDwgNCkgKyBkaWdpdDsKLQkJCWMgPSBnZXRjIChmKTsKLQkJICAgIH0KLQkJICAgIGdvdCA9IDE7Ci0JCSAgICBicmVhazsKLQkJfQotCi0JCS8qCi0JCSAqIE90aGVyd2lzZSB0aGUgY2hhcmFjdGVyIHN0YW5kcyBmb3IgaXRzZWxmLgotCQkgKi8KLQkJdmFsdWUgPSBjOwotCQlicmVhazsKLQkgICAgfQotCi0JICAgIC8qCi0JICAgICAqIFN0b3JlIHRoZSByZXN1bHRpbmcgY2hhcmFjdGVyIGZvciB0aGUgZXNjYXBlIHNlcXVlbmNlLgotCSAgICAgKi8KLQkgICAgaWYgKGxlbiA8IE1BWFdPUkRMRU4pIHsKLQkJd29yZFtsZW5dID0gdmFsdWU7Ci0JCSsrbGVuOwotCSAgICB9Ci0KLQkgICAgaWYgKCFnb3QpCi0JCWMgPSBnZXRjKGYpOwotCSAgICBjb250aW51ZTsKLQl9Ci0KLQkvKgotCSAqIEJhY2tzbGFzaCBzdGFydHMgYSBuZXcgZXNjYXBlIHNlcXVlbmNlLgotCSAqLwotCWlmIChjID09ICdcXCcpIHsKLQkgICAgZXNjYXBlID0gMTsKLQkgICAgYyA9IGdldGMoZik7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotCS8qCi0JICogTm90IGVzY2FwZWQ6IGNoZWNrIGZvciB0aGUgc3RhcnQgb3IgZW5kIG9mIGEgcXVvdGVkCi0JICogc2VjdGlvbiBhbmQgc2VlIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgd29yZC4KLQkgKi8KLQlpZiAocXVvdGVkKSB7Ci0JICAgIGlmIChjID09IHF1b3RlZCkgewotCQlxdW90ZWQgPSAwOwotCQljID0gZ2V0YyhmKTsKLQkJY29udGludWU7Ci0JICAgIH0KLQl9IGVsc2UgaWYgKGMgPT0gJyInIHx8IGMgPT0gJ1wnJykgewotCSAgICBxdW90ZWQgPSBjOwotCSAgICBjID0gZ2V0YyhmKTsKLQkgICAgY29udGludWU7Ci0JfSBlbHNlIGlmIChpc3NwYWNlKGMpIHx8IGMgPT0gJyMnKSB7Ci0JICAgIHVuZ2V0YyAoYywgZik7Ci0JICAgIGJyZWFrOwotCX0KLQotCS8qCi0JICogQW4gb3JkaW5hcnkgY2hhcmFjdGVyOiBzdG9yZSBpdCBpbiB0aGUgd29yZCBhbmQgZ2V0IGFub3RoZXIuCi0JICovCi0JaWYgKGxlbiA8IE1BWFdPUkRMRU4pIHsKLQkgICAgd29yZFtsZW5dID0gYzsKLQkgICAgKytsZW47Ci0JfQotCi0JYyA9IGdldGMoZik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBFbmQgb2YgdGhlIHdvcmQ6IGNoZWNrIGZvciBlcnJvcnMuCi0gICAgICovCi0gICAgaWYgKGMgPT0gRU9GKSB7Ci0JaWYgKGZlcnJvcihmKSkgewotCSAgICBpZiAoZXJybm8gPT0gMCkKLQkJZXJybm8gPSBFSU87Ci0JICAgIG9wdGlvbl9lcnJvcigiRXJyb3IgcmVhZGluZyAlczogJW0iLCBmaWxlbmFtZSk7Ci0JICAgIGRpZSgxKTsKLQl9Ci0JLyoKLQkgKiBJZiBsZW4gaXMgemVybywgdGhlbiB3ZSBkaWRuJ3QgZmluZCBhIHdvcmQgYmVmb3JlIHRoZQotCSAqIGVuZCBvZiB0aGUgZmlsZS4KLQkgKi8KLQlpZiAobGVuID09IDApCi0JICAgIHJldHVybiAwOwotCWlmIChxdW90ZWQpCi0JICAgIG9wdGlvbl9lcnJvcigid2FybmluZzogcXVvdGVkIHdvcmQgcnVucyB0byBlbmQgb2YgZmlsZSAoJS4yMHMuLi4pIiwKLQkJCSBmaWxlbmFtZSwgd29yZCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBXYXJuIGlmIHRoZSB3b3JkIHdhcyB0b28gbG9uZywgYW5kIGFwcGVuZCBhIHRlcm1pbmF0aW5nIG51bGwuCi0gICAgICovCi0gICAgaWYgKGxlbiA+PSBNQVhXT1JETEVOKSB7Ci0Jb3B0aW9uX2Vycm9yKCJ3YXJuaW5nOiB3b3JkIGluIGZpbGUgJXMgdG9vIGxvbmcgKCUuMjBzLi4uKSIsCi0JCSAgICAgZmlsZW5hbWUsIHdvcmQpOwotCWxlbiA9IE1BWFdPUkRMRU4gLSAxOwotICAgIH0KLSAgICB3b3JkW2xlbl0gPSAwOwotCi0gICAgcmV0dXJuIDE7Ci0KLSN1bmRlZiBpc29jdGFsCi0KLX0KLQotLyoKLSAqIG51bWJlcl9vcHRpb24gLSBwYXJzZSBhbiB1bnNpZ25lZCBudW1lcmljIHBhcmFtZXRlciBmb3IgYW4gb3B0aW9uLgotICovCi1zdGF0aWMgaW50Ci1udW1iZXJfb3B0aW9uKHN0ciwgdmFscCwgYmFzZSkKLSAgICBjaGFyICpzdHI7Ci0gICAgdV9pbnQzMl90ICp2YWxwOwotICAgIGludCBiYXNlOwotewotICAgIGNoYXIgKnB0cjsKLQotICAgICp2YWxwID0gc3RydG91bChzdHIsICZwdHIsIGJhc2UpOwotICAgIGlmIChwdHIgPT0gc3RyKSB7Ci0Jb3B0aW9uX2Vycm9yKCJpbnZhbGlkIG51bWVyaWMgcGFyYW1ldGVyICclcycgZm9yICVzIG9wdGlvbiIsCi0JCSAgICAgc3RyLCBjdXJyZW50X29wdGlvbik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAxOwotfQotCi0KLS8qCi0gKiBpbnRfb3B0aW9uIC0gbGlrZSBudW1iZXJfb3B0aW9uLCBidXQgdmFscCBpcyBpbnQgKiwKLSAqIHRoZSBiYXNlIGlzIGFzc3VtZWQgdG8gYmUgMCwgYW5kICp2YWxwIGlzIG5vdCBjaGFuZ2VkCi0gKiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KLSAqLwotaW50Ci1pbnRfb3B0aW9uKHN0ciwgdmFscCkKLSAgICBjaGFyICpzdHI7Ci0gICAgaW50ICp2YWxwOwotewotICAgIHVfaW50MzJfdCB2OwotCi0gICAgaWYgKCFudW1iZXJfb3B0aW9uKHN0ciwgJnYsIDApKQotCXJldHVybiAwOwotICAgICp2YWxwID0gKGludCkgdjsKLSAgICByZXR1cm4gMTsKLX0KLQotCi0vKgotICogVGhlIGZvbGxvd2luZyBwcm9jZWR1cmVzIHBhcnNlIG9wdGlvbnMuCi0gKi8KLQotLyoKLSAqIHJlYWRmaWxlIC0gdGFrZSBjb21tYW5kcyBmcm9tIGEgZmlsZS4KLSAqLwotc3RhdGljIGludAotcmVhZGZpbGUoYXJndikKLSAgICBjaGFyICoqYXJndjsKLXsKLSAgICByZXR1cm4gb3B0aW9uc19mcm9tX2ZpbGUoKmFyZ3YsIDEsIDEsIHByaXZpbGVnZWRfb3B0aW9uKTsKLX0KLQotLyoKLSAqIGNhbGxmaWxlIC0gdGFrZSBjb21tYW5kcyBmcm9tIC9ldGMvcHBwL3BlZXJzLzxuYW1lPi4KLSAqIE5hbWUgbWF5IG5vdCBjb250YWluIC8uLi8sIHN0YXJ0IHdpdGggLyBvciAuLi8sIG9yIGVuZCBpbiAvLi4KLSAqLwotc3RhdGljIGludAotY2FsbGZpbGUoYXJndikKLSAgICBjaGFyICoqYXJndjsKLXsKLSAgICBjaGFyICpmbmFtZSwgKmFyZywgKnA7Ci0gICAgaW50IGwsIG9rOwotCi0gICAgYXJnID0gKmFyZ3Y7Ci0gICAgb2sgPSAxOwotICAgIGlmIChhcmdbMF0gPT0gJy8nIHx8IGFyZ1swXSA9PSAwKQotCW9rID0gMDsKLSAgICBlbHNlIHsKLQlmb3IgKHAgPSBhcmc7ICpwICE9IDA7ICkgewotCSAgICBpZiAocFswXSA9PSAnLicgJiYgcFsxXSA9PSAnLicgJiYgKHBbMl0gPT0gJy8nIHx8IHBbMl0gPT0gMCkpIHsKLQkJb2sgPSAwOwotCQlicmVhazsKLQkgICAgfQotCSAgICB3aGlsZSAoKnAgIT0gJy8nICYmICpwICE9IDApCi0JCSsrcDsKLQkgICAgaWYgKCpwID09ICcvJykKLQkJKytwOwotCX0KLSAgICB9Ci0gICAgaWYgKCFvaykgewotCW9wdGlvbl9lcnJvcigiY2FsbCBvcHRpb24gdmFsdWUgbWF5IG5vdCBjb250YWluIC4uIG9yIHN0YXJ0IHdpdGggLyIpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIGwgPSBzdHJsZW4oYXJnKSArIHN0cmxlbihfUEFUSF9QRUVSRklMRVMpICsgMTsKLSAgICBpZiAoKGZuYW1lID0gKGNoYXIgKikgbWFsbG9jKGwpKSA9PSBOVUxMKQotCW5vdm0oImNhbGwgZmlsZSBuYW1lIik7Ci0gICAgc2xwcmludGYoZm5hbWUsIGwsICIlcyVzIiwgX1BBVEhfUEVFUkZJTEVTLCBhcmcpOwotCi0gICAgb2sgPSBvcHRpb25zX2Zyb21fZmlsZShmbmFtZSwgMSwgMSwgMSk7Ci0KLSAgICBmcmVlKGZuYW1lKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KLSNpZmRlZiBQUFBfRklMVEVSCi0vKgotICogc2V0cGFzc2ZpbHRlciAtIFNldCB0aGUgcGFzcyBmaWx0ZXIgZm9yIHBhY2tldHMKLSAqLwotc3RhdGljIGludAotc2V0cGFzc2ZpbHRlcihhcmd2KQotICAgIGNoYXIgKiphcmd2OwotewotICAgIHBjYXBfdCAqcGM7Ci0gICAgaW50IHJldCA9IDE7Ci0KLSAgICBwYyA9IHBjYXBfb3Blbl9kZWFkKERMVF9QUFBfUFBQRCwgNjU1MzUpOwotICAgIGlmIChwY2FwX2NvbXBpbGUocGMsICZwYXNzX2ZpbHRlciwgKmFyZ3YsIDEsIG5ldG1hc2spID09IC0xKSB7Ci0Jb3B0aW9uX2Vycm9yKCJlcnJvciBpbiBwYXNzLWZpbHRlciBleHByZXNzaW9uOiAlc1xuIiwKLQkJICAgICBwY2FwX2dldGVycihwYykpOwotCXJldCA9IDA7Ci0gICAgfQotICAgIHBjYXBfY2xvc2UocGMpOwotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIHNldGFjdGl2ZWZpbHRlciAtIFNldCB0aGUgYWN0aXZlIGZpbHRlciBmb3IgcGFja2V0cwotICovCi1zdGF0aWMgaW50Ci1zZXRhY3RpdmVmaWx0ZXIoYXJndikKLSAgICBjaGFyICoqYXJndjsKLXsKLSAgICBwY2FwX3QgKnBjOwotICAgIGludCByZXQgPSAxOwotCi0gICAgcGMgPSBwY2FwX29wZW5fZGVhZChETFRfUFBQX1BQUEQsIDY1NTM1KTsKLSAgICBpZiAocGNhcF9jb21waWxlKHBjLCAmYWN0aXZlX2ZpbHRlciwgKmFyZ3YsIDEsIG5ldG1hc2spID09IC0xKSB7Ci0Jb3B0aW9uX2Vycm9yKCJlcnJvciBpbiBhY3RpdmUtZmlsdGVyIGV4cHJlc3Npb246ICVzXG4iLAotCQkgICAgIHBjYXBfZ2V0ZXJyKHBjKSk7Ci0JcmV0ID0gMDsKLSAgICB9Ci0gICAgcGNhcF9jbG9zZShwYyk7Ci0KLSAgICByZXR1cm4gcmV0OwotfQotI2VuZGlmCi0KLS8qCi0gKiBzZXRkb21haW4gLSBTZXQgZG9tYWluIG5hbWUgdG8gYXBwZW5kIHRvIGhvc3RuYW1lIAotICovCi1zdGF0aWMgaW50Ci1zZXRkb21haW4oYXJndikKLSAgICBjaGFyICoqYXJndjsKLXsKLSAgICBnZXRob3N0bmFtZShob3N0bmFtZSwgTUFYTkFNRUxFTik7Ci0gICAgaWYgKCoqYXJndiAhPSAwKSB7Ci0JaWYgKCoqYXJndiAhPSAnLicpCi0JICAgIHN0cm5jYXQoaG9zdG5hbWUsICIuIiwgTUFYTkFNRUxFTiAtIHN0cmxlbihob3N0bmFtZSkpOwotCWRvbWFpbiA9IGhvc3RuYW1lICsgc3RybGVuKGhvc3RuYW1lKTsKLQlzdHJuY2F0KGhvc3RuYW1lLCAqYXJndiwgTUFYTkFNRUxFTiAtIHN0cmxlbihob3N0bmFtZSkpOwotICAgIH0KLSAgICBob3N0bmFtZVtNQVhOQU1FTEVOLTFdID0gMDsKLSAgICByZXR1cm4gKDEpOwotfQotCi1zdGF0aWMgaW50Ci1zZXRsb2dmaWxlKGFyZ3YpCi0gICAgY2hhciAqKmFyZ3Y7Ci17Ci0gICAgaW50IGZkLCBlcnI7Ci0gICAgdWlkX3QgZXVpZDsKLQotICAgIGV1aWQgPSBnZXRldWlkKCk7Ci0gICAgaWYgKCFwcml2aWxlZ2VkX29wdGlvbiAmJiBzZXRldWlkKGdldHVpZCgpKSA9PSAtMSkgewotCW9wdGlvbl9lcnJvcigidW5hYmxlIHRvIGRyb3AgcGVybWlzc2lvbnMgdG8gb3BlbiAlczogJW0iLCAqYXJndik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGZkID0gb3BlbigqYXJndiwgT19XUk9OTFkgfCBPX0FQUEVORCB8IE9fQ1JFQVQgfCBPX0VYQ0wsIDA2NDQpOwotICAgIGlmIChmZCA8IDAgJiYgZXJybm8gPT0gRUVYSVNUKQotCWZkID0gb3BlbigqYXJndiwgT19XUk9OTFkgfCBPX0FQUEVORCk7Ci0gICAgZXJyID0gZXJybm87Ci0gICAgaWYgKCFwcml2aWxlZ2VkX29wdGlvbiAmJiBzZXRldWlkKGV1aWQpID09IC0xKQotCWZhdGFsKCJ1bmFibGUgdG8gcmVnYWluIHByaXZpbGVnZXM6ICVtIik7Ci0gICAgaWYgKGZkIDwgMCkgewotCWVycm5vID0gZXJyOwotCW9wdGlvbl9lcnJvcigiQ2FuJ3Qgb3BlbiBsb2cgZmlsZSAlczogJW0iLCAqYXJndik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIHN0cmxjcHkobG9nZmlsZV9uYW1lLCAqYXJndiwgc2l6ZW9mKGxvZ2ZpbGVfbmFtZSkpOwotICAgIGlmIChsb2dmaWxlX2ZkID49IDApCi0JY2xvc2UobG9nZmlsZV9mZCk7Ci0gICAgbG9nZmlsZV9mZCA9IGZkOwotICAgIGxvZ190b19mZCA9IGZkOwotICAgIGxvZ19kZWZhdWx0ID0gMDsKLSAgICByZXR1cm4gMTsKLX0KLQotI2lmZGVmIE1BWE9DVEVUUwotc3RhdGljIGludAotc2V0bW9kaXIoYXJndikKLSAgICBjaGFyICoqYXJndjsKLXsKLSAgICBpZigqYXJndiA9PSBOVUxMKQotCXJldHVybiAwOwotICAgIGlmKCFzdHJjbXAoKmFyZ3YsImluIikpIHsKLSAgICAgICAgbWF4b2N0ZXRzX2RpciA9IFBQUF9PQ1RFVFNfRElSRUNUSU9OX0lOOwotICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwib3V0IikpIHsKLSAgICAgICAgbWF4b2N0ZXRzX2RpciA9IFBQUF9PQ1RFVFNfRElSRUNUSU9OX09VVDsKLSAgICB9IGVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsIm1heCIpKSB7Ci0gICAgICAgIG1heG9jdGV0c19kaXIgPSBQUFBfT0NURVRTX0RJUkVDVElPTl9NQVhPVkVSQUw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbWF4b2N0ZXRzX2RpciA9IFBQUF9PQ1RFVFNfRElSRUNUSU9OX1NVTTsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFBMVUdJTgotc3RhdGljIGludAotbG9hZHBsdWdpbihhcmd2KQotICAgIGNoYXIgKiphcmd2OwotewotICAgIGNoYXIgKmFyZyA9ICphcmd2OwotICAgIHZvaWQgKmhhbmRsZTsKLSAgICBjb25zdCBjaGFyICplcnI7Ci0gICAgdm9pZCAoKmluaXQpIF9fUCgodm9pZCkpOwotICAgIGNoYXIgKnBhdGggPSBhcmc7Ci0gICAgY29uc3QgY2hhciAqdmVyczsKLQotICAgIGlmIChzdHJjaHIoYXJnLCAnLycpID09IDApIHsKLQljb25zdCBjaGFyICpiYXNlID0gX1BBVEhfUExVR0lOOwotCWludCBsID0gc3RybGVuKGJhc2UpICsgc3RybGVuKGFyZykgKyAyOwotCXBhdGggPSBtYWxsb2MobCk7Ci0JaWYgKHBhdGggPT0gMCkKLQkgICAgbm92bSgicGx1Z2luIGZpbGUgcGF0aCIpOwotCXN0cmxjcHkocGF0aCwgYmFzZSwgbCk7Ci0Jc3RybGNhdChwYXRoLCAiLyIsIGwpOwotCXN0cmxjYXQocGF0aCwgYXJnLCBsKTsKLSAgICB9Ci0gICAgaGFuZGxlID0gZGxvcGVuKHBhdGgsIFJUTERfR0xPQkFMIHwgUlRMRF9OT1cpOwotICAgIGlmIChoYW5kbGUgPT0gMCkgewotCWVyciA9IGRsZXJyb3IoKTsKLQlpZiAoZXJyICE9IDApCi0JICAgIG9wdGlvbl9lcnJvcigiJXMiLCBlcnIpOwotCW9wdGlvbl9lcnJvcigiQ291bGRuJ3QgbG9hZCBwbHVnaW4gJXMiLCBhcmcpOwotCWdvdG8gZXJyOwotICAgIH0KLSAgICBpbml0ID0gKHZvaWQgKCopKHZvaWQpKWRsc3ltKGhhbmRsZSwgInBsdWdpbl9pbml0Iik7Ci0gICAgaWYgKGluaXQgPT0gMCkgewotCW9wdGlvbl9lcnJvcigiJXMgaGFzIG5vIGluaXRpYWxpemF0aW9uIGVudHJ5IHBvaW50IiwgYXJnKTsKLQlnb3RvIGVycmNsb3NlOwotICAgIH0KLSAgICB2ZXJzID0gKGNvbnN0IGNoYXIgKikgZGxzeW0oaGFuZGxlLCAicHBwZF92ZXJzaW9uIik7Ci0gICAgaWYgKHZlcnMgPT0gMCkgewotCXdhcm4oIldhcm5pbmc6IHBsdWdpbiAlcyBoYXMgbm8gdmVyc2lvbiBpbmZvcm1hdGlvbiIsIGFyZyk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAodmVycywgVkVSU0lPTikgIT0gMCkgewotCW9wdGlvbl9lcnJvcigiUGx1Z2luICVzIGlzIGZvciBwcHBkIHZlcnNpb24gJXMsIHRoaXMgaXMgJXMiLAotCQkgICAgIGFyZywgdmVycywgVkVSU0lPTik7Ci0JZ290byBlcnJjbG9zZTsKLSAgICB9Ci0gICAgaW5mbygiUGx1Z2luICVzIGxvYWRlZC4iLCBhcmcpOwotICAgICgqaW5pdCkoKTsKLSAgICByZXR1cm4gMTsKLQotIGVycmNsb3NlOgotICAgIGRsY2xvc2UoaGFuZGxlKTsKLSBlcnI6Ci0gICAgaWYgKHBhdGggIT0gYXJnKQotCWZyZWUocGF0aCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogUExVR0lOICovCi0KLS8qCi0gKiBTZXQgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgotICovCi1zdGF0aWMgaW50Ci11c2VyX3NldGVudihhcmd2KQotICAgIGNoYXIgKiphcmd2OwotewotICAgIGNoYXIgKmFyZyA9IGFyZ3ZbMF07Ci0gICAgY2hhciAqZXFwOwotICAgIHN0cnVjdCB1c2VyZW52ICp1ZXAsICoqaW5zcDsKLQotICAgIGlmICgoZXFwID0gc3RyY2hyKGFyZywgJz0nKSkgPT0gTlVMTCkgewotCW9wdGlvbl9lcnJvcigibWlzc2luZyA9IGluIG5hbWU9dmFsdWU6ICVzIiwgYXJnKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGVxcCA9PSBhcmcpIHsKLQlvcHRpb25fZXJyb3IoIm1pc3NpbmcgdmFyaWFibGUgbmFtZTogJXMiLCBhcmcpOwotCXJldHVybiAwOwotICAgIH0KLSAgICBmb3IgKHVlcCA9IHVzZXJlbnZfbGlzdDsgdWVwICE9IE5VTEw7IHVlcCA9IHVlcC0+dWVfbmV4dCkgewotCWludCBubGVuID0gc3RybGVuKHVlcC0+dWVfbmFtZSk7Ci0JaWYgKG5sZW4gPT0gKGVxcCAtIGFyZykgJiYKLQkgICAgc3RybmNtcChhcmcsIHVlcC0+dWVfbmFtZSwgbmxlbikgPT0gMCkKLQkgICAgYnJlYWs7Ci0gICAgfQotICAgIC8qIElnbm9yZSBhdHRlbXB0cyBieSB1bnByaXZpbGVnZWQgdXNlcnMgdG8gb3ZlcnJpZGUgcHJpdmlsZWdlZCBzb3VyY2VzICovCi0gICAgaWYgKHVlcCAhPSBOVUxMICYmICFwcml2aWxlZ2VkX29wdGlvbiAmJiB1ZXAtPnVlX3ByaXYpCi0JcmV0dXJuIDE7Ci0gICAgLyogVGhlIG5hbWUgbmV2ZXIgY2hhbmdlcywgc28gYWxsb2NhdGUgaXQgd2l0aCB0aGUgc3RydWN0dXJlICovCi0gICAgaWYgKHVlcCA9PSBOVUxMKSB7Ci0JdWVwID0gbWFsbG9jKHNpemVvZiAoKnVlcCkgKyAoZXFwLWFyZykpOwotCXN0cm5jcHkodWVwLT51ZV9uYW1lLCBhcmcsIGVxcC1hcmcpOwotCXVlcC0+dWVfbmFtZVtlcXAtYXJnXSA9ICdcMCc7Ci0JdWVwLT51ZV9uZXh0ID0gTlVMTDsKLQlpbnNwID0gJnVzZXJlbnZfbGlzdDsKLQl3aGlsZSAoKmluc3AgIT0gTlVMTCkKLQkgICAgaW5zcCA9ICYoKmluc3ApLT51ZV9uZXh0OwotCSppbnNwID0gdWVwOwotICAgIH0gZWxzZSB7Ci0Jc3RydWN0IHVzZXJlbnYgKnVlcDI7Ci0JZm9yICh1ZXAyID0gdXNlcmVudl9saXN0OyB1ZXAyICE9IE5VTEw7IHVlcDIgPSB1ZXAyLT51ZV9uZXh0KSB7Ci0JICAgIGlmICh1ZXAyICE9IHVlcCAmJiAhdWVwMi0+dWVfaXNzZXQpCi0JCWJyZWFrOwotCX0KLQlpZiAodWVwMiA9PSBOVUxMICYmICF1ZXAtPnVlX2lzc2V0KQotCSAgICBmaW5kX29wdGlvbigidW5zZXQiKS0+ZmxhZ3MgfD0gT1BUX05PUFJJTlQ7Ci0JZnJlZSh1ZXAtPnVlX3ZhbHVlKTsKLSAgICB9Ci0gICAgdWVwLT51ZV9pc3NldCA9IDE7Ci0gICAgdWVwLT51ZV9wcml2ID0gcHJpdmlsZWdlZF9vcHRpb247Ci0gICAgdWVwLT51ZV9zb3VyY2UgPSBvcHRpb25fc291cmNlOwotICAgIHVlcC0+dWVfdmFsdWUgPSBzdHJkdXAoZXFwICsgMSk7Ci0gICAgY3Vyb3B0LT5mbGFncyAmPSB+T1BUX05PUFJJTlQ7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi11c2VyX3NldHByaW50KG9wdCwgcHJpbnRlciwgYXJnKQotICAgIG9wdGlvbl90ICpvcHQ7Ci0gICAgcHJpbnRlcl9mdW5jIHByaW50ZXI7Ci0gICAgdm9pZCAqYXJnOwotewotICAgIHN0cnVjdCB1c2VyZW52ICp1ZXAsICp1ZXBuZXh0OwotCi0gICAgdWVwbmV4dCA9IHVzZXJlbnZfbGlzdDsKLSAgICB3aGlsZSAodWVwbmV4dCAhPSBOVUxMICYmICF1ZXBuZXh0LT51ZV9pc3NldCkKLQl1ZXBuZXh0ID0gdWVwbmV4dC0+dWVfbmV4dDsKLSAgICB3aGlsZSAoKHVlcCA9IHVlcG5leHQpICE9IE5VTEwpIHsKLQl1ZXBuZXh0ID0gdWVwLT51ZV9uZXh0OwotCXdoaWxlICh1ZXBuZXh0ICE9IE5VTEwgJiYgIXVlcG5leHQtPnVlX2lzc2V0KQotCSAgICB1ZXBuZXh0ID0gdWVwbmV4dC0+dWVfbmV4dDsKLQkoKnByaW50ZXIpKGFyZywgIiVzPSVzIiwgdWVwLT51ZV9uYW1lLCB1ZXAtPnVlX3ZhbHVlKTsKLQlpZiAodWVwbmV4dCAhPSBOVUxMKQotCSAgICAoKnByaW50ZXIpKGFyZywgIlx0XHQjIChmcm9tICVzKVxuJXMgIiwgdWVwLT51ZV9zb3VyY2UsIG9wdC0+bmFtZSk7Ci0JZWxzZQotCSAgICBvcHQtPnNvdXJjZSA9IHVlcC0+dWVfc291cmNlOwotICAgIH0KLX0KLQotc3RhdGljIGludAotdXNlcl91bnNldGVudihhcmd2KQotICAgIGNoYXIgKiphcmd2OwotewotICAgIHN0cnVjdCB1c2VyZW52ICp1ZXAsICoqaW5zcDsKLSAgICBjaGFyICphcmcgPSBhcmd2WzBdOwotCi0gICAgaWYgKHN0cmNocihhcmcsICc9JykgIT0gTlVMTCkgewotCW9wdGlvbl9lcnJvcigidW5leHBlY3RlZCA9IGluIG5hbWU6ICVzIiwgYXJnKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGFyZyA9PSAnXDAnKSB7Ci0Jb3B0aW9uX2Vycm9yKCJtaXNzaW5nIHZhcmlhYmxlIG5hbWUgZm9yIHVuc2V0Iik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGZvciAodWVwID0gdXNlcmVudl9saXN0OyB1ZXAgIT0gTlVMTDsgdWVwID0gdWVwLT51ZV9uZXh0KSB7Ci0JaWYgKHN0cmNtcChhcmcsIHVlcC0+dWVfbmFtZSkgPT0gMCkKLQkgICAgYnJlYWs7Ci0gICAgfQotICAgIC8qIElnbm9yZSBhdHRlbXB0cyBieSB1bnByaXZpbGVnZWQgdXNlcnMgdG8gb3ZlcnJpZGUgcHJpdmlsZWdlZCBzb3VyY2VzICovCi0gICAgaWYgKHVlcCAhPSBOVUxMICYmICFwcml2aWxlZ2VkX29wdGlvbiAmJiB1ZXAtPnVlX3ByaXYpCi0JcmV0dXJuIDE7Ci0gICAgLyogVGhlIG5hbWUgbmV2ZXIgY2hhbmdlcywgc28gYWxsb2NhdGUgaXQgd2l0aCB0aGUgc3RydWN0dXJlICovCi0gICAgaWYgKHVlcCA9PSBOVUxMKSB7Ci0JdWVwID0gbWFsbG9jKHNpemVvZiAoKnVlcCkgKyBzdHJsZW4oYXJnKSk7Ci0Jc3RyY3B5KHVlcC0+dWVfbmFtZSwgYXJnKTsKLQl1ZXAtPnVlX25leHQgPSBOVUxMOwotCWluc3AgPSAmdXNlcmVudl9saXN0OwotCXdoaWxlICgqaW5zcCAhPSBOVUxMKQotCSAgICBpbnNwID0gJigqaW5zcCktPnVlX25leHQ7Ci0JKmluc3AgPSB1ZXA7Ci0gICAgfSBlbHNlIHsKLQlzdHJ1Y3QgdXNlcmVudiAqdWVwMjsKLQlmb3IgKHVlcDIgPSB1c2VyZW52X2xpc3Q7IHVlcDIgIT0gTlVMTDsgdWVwMiA9IHVlcDItPnVlX25leHQpIHsKLQkgICAgaWYgKHVlcDIgIT0gdWVwICYmIHVlcDItPnVlX2lzc2V0KQotCQlicmVhazsKLQl9Ci0JaWYgKHVlcDIgPT0gTlVMTCAmJiB1ZXAtPnVlX2lzc2V0KQotCSAgICBmaW5kX29wdGlvbigic2V0IiktPmZsYWdzIHw9IE9QVF9OT1BSSU5UOwotCWZyZWUodWVwLT51ZV92YWx1ZSk7Ci0gICAgfQotICAgIHVlcC0+dWVfaXNzZXQgPSAwOwotICAgIHVlcC0+dWVfcHJpdiA9IHByaXZpbGVnZWRfb3B0aW9uOwotICAgIHVlcC0+dWVfc291cmNlID0gb3B0aW9uX3NvdXJjZTsKLSAgICB1ZXAtPnVlX3ZhbHVlID0gTlVMTDsKLSAgICBjdXJvcHQtPmZsYWdzICY9IH5PUFRfTk9QUklOVDsKLSAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLXVzZXJfdW5zZXRwcmludChvcHQsIHByaW50ZXIsIGFyZykKLSAgICBvcHRpb25fdCAqb3B0OwotICAgIHByaW50ZXJfZnVuYyBwcmludGVyOwotICAgIHZvaWQgKmFyZzsKLXsKLSAgICBzdHJ1Y3QgdXNlcmVudiAqdWVwLCAqdWVwbmV4dDsKLQotICAgIHVlcG5leHQgPSB1c2VyZW52X2xpc3Q7Ci0gICAgd2hpbGUgKHVlcG5leHQgIT0gTlVMTCAmJiB1ZXBuZXh0LT51ZV9pc3NldCkKLQl1ZXBuZXh0ID0gdWVwbmV4dC0+dWVfbmV4dDsKLSAgICB3aGlsZSAoKHVlcCA9IHVlcG5leHQpICE9IE5VTEwpIHsKLQl1ZXBuZXh0ID0gdWVwLT51ZV9uZXh0OwotCXdoaWxlICh1ZXBuZXh0ICE9IE5VTEwgJiYgdWVwbmV4dC0+dWVfaXNzZXQpCi0JICAgIHVlcG5leHQgPSB1ZXBuZXh0LT51ZV9uZXh0OwotCSgqcHJpbnRlcikoYXJnLCAiJXMiLCB1ZXAtPnVlX25hbWUpOwotCWlmICh1ZXBuZXh0ICE9IE5VTEwpCi0JICAgICgqcHJpbnRlcikoYXJnLCAiXHRcdCMgKGZyb20gJXMpXG4lcyAiLCB1ZXAtPnVlX3NvdXJjZSwgb3B0LT5uYW1lKTsKLQllbHNlCi0JICAgIG9wdC0+c291cmNlID0gdWVwLT51ZV9zb3VyY2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHBwZC9wYXRjaGxldmVsLmggYi9wcHBkL3BhdGNobGV2ZWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE1ZTA1Mi4uMDAwMDAwMAotLS0gYS9wcHBkL3BhdGNobGV2ZWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotI2RlZmluZSBWRVJTSU9OCQkiMi40LjciCi0jZGVmaW5lIERBVEUJCSI5IEF1Z3VzdCAyMDE0IgpkaWZmIC0tZ2l0IGEvcHBwZC9wYXRobmFtZXMuaCBiL3BwcGQvcGF0aG5hbWVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NzFhYjUuLjAwMDAwMDAKLS0tIGEvcHBwZC9wYXRobmFtZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBkZWZpbmUgcGF0aCBuYW1lcwotICoKLSAqICRJZDogcGF0aG5hbWVzLmgsdiAxLjE4IDIwMDUvMDgvMjUgMjM6NTk6MzQgcGF1bHVzIEV4cCAkCi0gKi8KLQotI2lmZGVmIEhBVkVfUEFUSFNfSAotI2luY2x1ZGUgPHBhdGhzLmg+Ci0KLSNlbHNlIC8qIEhBVkVfUEFUSFNfSCAqLwotI2lmbmRlZiBfUEFUSF9WQVJSVU4KLSNkZWZpbmUgX1BBVEhfVkFSUlVOIAkiL2V0Yy9wcHAvIgotI2VuZGlmCi0jZGVmaW5lIF9QQVRIX0RFVk5VTEwJIi9kZXYvbnVsbCIKLSNlbmRpZiAvKiBIQVZFX1BBVEhTX0ggKi8KLQotI2lmbmRlZiBfUk9PVF9QQVRICi0jZGVmaW5lIF9ST09UX1BBVEgKLSNlbmRpZgotCi0jZGVmaW5lIF9QQVRIX1VQQVBGSUxFIAkgX1JPT1RfUEFUSCAiL2V0Yy9wcHAvcGFwLXNlY3JldHMiCi0jZGVmaW5lIF9QQVRIX0NIQVBGSUxFIAkgX1JPT1RfUEFUSCAiL2V0Yy9wcHAvY2hhcC1zZWNyZXRzIgotI2RlZmluZSBfUEFUSF9TUlBGSUxFIAkgX1JPT1RfUEFUSCAiL2V0Yy9wcHAvc3JwLXNlY3JldHMiCi0jZGVmaW5lIF9QQVRIX1NZU09QVElPTlMgX1JPT1RfUEFUSCAiL2V0Yy9wcHAvb3B0aW9ucyIKLSNkZWZpbmUgX1BBVEhfSVBVUAkgX1JPT1RfUEFUSCAiL3N5c3RlbS9iaW4vaXAtdXAiCi0jZGVmaW5lIF9QQVRIX0lQRE9XTgkgX1JPT1RfUEFUSCAiL2V0Yy9wcHAvaXAtZG93biIKLSNkZWZpbmUgX1BBVEhfSVBQUkVVUAkgX1JPT1RfUEFUSCAiL2V0Yy9wcHAvaXAtcHJlLXVwIgotI2RlZmluZSBfUEFUSF9BVVRIVVAJIF9ST09UX1BBVEggIi9ldGMvcHBwL2F1dGgtdXAiCi0jZGVmaW5lIF9QQVRIX0FVVEhET1dOCSBfUk9PVF9QQVRIICIvZXRjL3BwcC9hdXRoLWRvd24iCi0jZGVmaW5lIF9QQVRIX1RUWU9QVAkgX1JPT1RfUEFUSCAiL2V0Yy9wcHAvb3B0aW9ucy4iCi0jZGVmaW5lIF9QQVRIX0NPTk5FUlJTCSBfUk9PVF9QQVRIICIvZXRjL3BwcC9jb25uZWN0LWVycm9ycyIKLSNkZWZpbmUgX1BBVEhfUEVFUkZJTEVTCSBfUk9PVF9QQVRIICIvZXRjL3BwcC9wZWVycy8iCi0jZGVmaW5lIF9QQVRIX1JFU09MVgkgX1JPT1RfUEFUSCAiL2V0Yy9wcHAvcmVzb2x2LmNvbmYiCi0KLSNkZWZpbmUgX1BBVEhfVVNFUk9QVAkgIi5wcHByYyIKLSNkZWZpbmUJX1BBVEhfUFNFVURPTllNCSAiLnBwcF9wc2V1ZG9ueW0iCi0KLSNpZmRlZiBJTkVUNgotI2RlZmluZSBfUEFUSF9JUFY2VVAgICAgIF9ST09UX1BBVEggIi9ldGMvcHBwL2lwdjYtdXAiCi0jZGVmaW5lIF9QQVRIX0lQVjZET1dOICAgX1JPT1RfUEFUSCAiL2V0Yy9wcHAvaXB2Ni1kb3duIgotI2VuZGlmCi0KLSNpZmRlZiBJUFhfQ0hBTkdFCi0jZGVmaW5lIF9QQVRIX0lQWFVQCSBfUk9PVF9QQVRIICIvZXRjL3BwcC9pcHgtdXAiCi0jZGVmaW5lIF9QQVRIX0lQWERPV04JIF9ST09UX1BBVEggIi9ldGMvcHBwL2lweC1kb3duIgotI2VuZGlmIC8qIElQWF9DSEFOR0UgKi8KLQotI2lmZGVmIF9fU1REQ19fCi0jZGVmaW5lIF9QQVRIX1BQUERCCV9ST09UX1BBVEggX1BBVEhfVkFSUlVOICJwcHBkMi50ZGIiCi0jZWxzZSAvKiBfX1NURENfXyAqLwotI2lmZGVmIEhBVkVfUEFUSFNfSAotI2RlZmluZSBfUEFUSF9QUFBEQgkiL3Zhci9ydW4vcHBwZDIudGRiIgotI2Vsc2UKLSNkZWZpbmUgX1BBVEhfUFBQREIJIi9ldGMvcHBwL3BwcGQyLnRkYiIKLSNlbmRpZgotI2VuZGlmIC8qIF9fU1REQ19fICovCi0KLSNpZmRlZiBQTFVHSU4KLSNpZmRlZiBfX0FORFJPSURfXwotCi0vKgotICogSW4gQW5kcm9pZCB3ZSBjYW4ndCBsb2FkIHBsdWdpbnMgZnJvbSAvc3lzdGVtL2xpYns2NH0vcHBwZC8sIGJlY2F1c2UKLSAqIEJpb25pYyBsb2FkZXIgb25seSBhbGxvd3MgdXMgdG8gZGxvcGVuKCkgbGlicmFyaWVzIGZyb20gL3N5c3RlbS9saWJ7NjR9IHJvb3QKLSAqIGRpcmVjdG9yeSAoYXMgc3BlY2lmaWVkIGluIGxkLmNvbmZpZy50eHQsIHNlZSAiZGVmYXVsdCIgbGlua2VyIG5hbWVzcGFjZSkuCi0gKi8KLSNpZmRlZiBfX0xQNjRfXwotI2RlZmluZSBfUEFUSF9QTFVHSU4JIi9zeXN0ZW0vbGliNjQiCi0jZWxzZSAgLyogX19MUDY0X18gKi8KLSNkZWZpbmUgX1BBVEhfUExVR0lOCSIvc3lzdGVtL2xpYiIKLSNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCi0jZWxzZSAvKiBfX0FORFJPSURfXyAqLwotCi0jaWZkZWYgX19TVERDX18KLSNkZWZpbmUgX1BBVEhfUExVR0lOCURFU1RESVIgIi9saWIvcHBwZC8iIFZFUlNJT04KLSNlbHNlIC8qIF9fU1REQ19fICovCi0jZGVmaW5lIF9QQVRIX1BMVUdJTgkiL3Vzci9saWIvcHBwZCIKLSNlbmRpZiAvKiBfX1NURENfXyAqLwotCi0jZW5kaWYgLyogX19BTkRST0lEX18gKi8KLSNlbmRpZiAvKiBQTFVHSU4gKi8KZGlmZiAtLWdpdCBhL3BwcGQvcGx1Z2lucy9NYWtlZmlsZS5saW51eCBiL3BwcGQvcGx1Z2lucy9NYWtlZmlsZS5saW51eApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI4Y2Y1MC4uMDAwMDAwMAotLS0gYS9wcHBkL3BsdWdpbnMvTWFrZWZpbGUubGludXgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jQ0MJPSBnY2MKLUNPUFRTCT0gLU8yIC1nCi1DRkxBR1MJPSAkKENPUFRTKSAtSS4uIC1JLi4vLi4vaW5jbHVkZSAtZlBJQwotTERGTEFHUwk9IC1zaGFyZWQKLUlOU1RBTEwJPSBpbnN0YWxsCi0KLURFU1RESVIgPSAkKElOU1RST09UKUBERVNURElSQAotQklORElSID0gJChERVNURElSKS9zYmluCi1NQU5ESVIgPSAkKERFU1RESVIpL3NoYXJlL21hbi9tYW44Ci1MSUJESVIgPSAkKERFU1RESVIpL2xpYi9wcHBkLyQoVkVSU0lPTikKLQotU1VCRElSUyA6PSBycC1wcHBvZSBwcHBvYXRtIHBwcG9sMnRwCi0jIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIGluY2x1ZGUgdGhlIHJhZGl1cyBhdXRoZW50aWNhdGlvbiBwbHVnaW4KLVNVQkRJUlMgKz0gcmFkaXVzCi1QTFVHSU5TIDo9IG1pbmNvbm4uc28gcGFzc3Byb21wdC5zbyBwYXNzd29yZGZkLnNvIHdpbmJpbmQuc28KLQotIyBUaGlzIHNldHRpbmcgc2hvdWxkIG1hdGNoIHRoZSBvbmUgaW4gLi4vTWFrZWZpbGUubGludXgKLU1QUEU9eQotCi1pZmRlZiBNUFBFCi1DRkxBR1MgICArPSAtRE1QUEU9MQotZW5kaWYKLQotIyBpbmNsdWRlIGRlcGVuZGVuY2llcyBpZiBwcmVzZW50Ci1pZmVxICguZGVwZW5kLCQod2lsZGNhcmQgLmRlcGVuZCkpCi1pbmNsdWRlIC5kZXBlbmQKLWVuZGlmCi0KLWFsbDoJJChQTFVHSU5TKQotCWZvciBkIGluICQoU1VCRElSUyk7IGRvICQoTUFLRSkgJChNRkxBR1MpIC1DICQkZCBhbGw7IGRvbmUKLQotJS5zbzogJS5jCi0JJChDQykgLW8gJEAgJChMREZMQUdTKSAkKENGTEFHUykgJF4KLQotVkVSU0lPTiA9ICQoc2hlbGwgYXdrIC1GICciJyAnL1ZFUlNJT04vIHsgcHJpbnQgJCQyOyB9JyAuLi9wYXRjaGxldmVsLmgpCi0KLWluc3RhbGw6ICQoUExVR0lOUykKLQkkKElOU1RBTEwpIC1kICQoTElCRElSKQotCSQoSU5TVEFMTCkgJD8gJChMSUJESVIpCi0JZm9yIGQgaW4gJChTVUJESVJTKTsgZG8gJChNQUtFKSAkKE1GTEFHUykgLUMgJCRkIGluc3RhbGw7IGRvbmUKLQotY2xlYW46Ci0Jcm0gLWYgKi5vICouc28gKi5hCi0JZm9yIGQgaW4gJChTVUJESVJTKTsgZG8gJChNQUtFKSAkKE1GTEFHUykgLUMgJCRkIGNsZWFuOyBkb25lCi0KLWRlcGVuZDoKLQkkKENQUCkgLU0gJChDRkxBR1MpICouYyA+LmRlcGVuZAotCWZvciBkIGluICQoU1VCRElSUyk7IGRvICQoTUFLRSkgJChNRkxBR1MpIC1DICQkZCBkZXBlbmQ7IGRvbmUKZGlmZiAtLWdpdCBhL3BwcGQvcGx1Z2lucy9NYWtlZmlsZS5zb2wyIGIvcHBwZC9wbHVnaW5zL01ha2VmaWxlLnNvbDIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjN2Q4NWQuLjAwMDAwMDAKLS0tIGEvcHBwZC9wbHVnaW5zL01ha2VmaWxlLnNvbDIKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciBwbHVnaW5zIG9uIFNvbGFyaXMgMgotIwotIyAkSWQ6IE1ha2VmaWxlLnNvbDIsdiAxLjMgMjAwMi8wOS8wNyAwNToxNToyNSBjYXJsc29uaiBFeHAgJAotIwotCi1pbmNsdWRlIC4uLy4uL01ha2VkZWZzLmNvbQotCi1DRkxBR1MJPSAtYyAtTyAtSS4uIC1JLi4vLi4vaW5jbHVkZSAkKENPUFRTKQotTERGTEFHUwk9IC1HIAotCi1hbGw6CW1pbmNvbm4uc28KLQotbWluY29ubi5zbzogbWluY29ubi5vCi0JbGQgLW8gJEAgJChMREZMQUdTKSAtaCAkQCBtaW5jb25uLm8KLQotbWluY29ubi5vOiBtaW5jb25uLmMKLQkkKENDKSAkKENGTEFHUykgLWMgJD8gCi0KLXBhc3Nwcm9tcHQuc286IHBhc3Nwcm9tcHQubwotCWxkIC1vICRAICQoTERGTEFHUykgLWggJEAgcGFzc3Byb21wdC5vCi0KLXBhc3Nwcm9tcHQubzogcGFzc3Byb21wdC5jCi0JJChDQykgJChDRkxBR1MpIC1jICQ/Ci0KLWNsZWFuOgotCXJtIC1mICoubyAqLnNvCmRpZmYgLS1naXQgYS9wcHBkL3BsdWdpbnMvbWluY29ubi5jIGIvcHBwZC9wbHVnaW5zL21pbmNvbm4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEyMjE2YS4uMDAwMDAwMAotLS0gYS9wcHBkL3BsdWdpbnMvbWluY29ubi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIG1pbmNvbm4uYyAtIHBwcGQgcGx1Z2luIHRvIGltcGxlbWVudCBhIGBtaW5jb25uZWN0JyBvcHRpb24uCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5IFBhdWwgTWFja2VycmFzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBuYW1lKHMpIG9mIHRoZSBhdXRob3JzIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiA0LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFBhdWwgTWFja2VycmFzCi0gKiAgICAgPHBhdWx1c0BzYW1iYS5vcmc+Ii4KLSAqCi0gKiBUSEUgQVVUSE9SUyBPRiBUSElTIFNPRlRXQVJFIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi0gKiBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLSAqIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLSAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLSAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgInBwcGQuaCIKLQotY2hhciBwcHBkX3ZlcnNpb25bXSA9IFZFUlNJT047Ci0KLXN0YXRpYyBpbnQgbWluY29ubmVjdCA9IDA7Ci0KLXN0YXRpYyBvcHRpb25fdCBteV9vcHRpb25zW10gPSB7Ci0JeyAibWluY29ubmVjdCIsIG9faW50LCAmbWluY29ubmVjdCwKLQkgICJTZXQgbWluaW11bSBjb25uZWN0IHRpbWUgYmVmb3JlIGlkbGUgdGltZW91dCBhcHBsaWVzIiB9LAotCXsgTlVMTCB9Ci19OwotCi1zdGF0aWMgaW50IG15X2dldF9pZGxlKHN0cnVjdCBwcHBfaWRsZSAqaWRsZSkKLXsKLQl0aW1lX3QgdDsKLQotCWlmIChpZGxlID09IE5VTEwpCi0JCXJldHVybiBtaW5jb25uZWN0PyBtaW5jb25uZWN0OiBpZGxlX3RpbWVfbGltaXQ7Ci0JdCA9IGlkbGUtPnhtaXRfaWRsZTsKLQlpZiAoaWRsZS0+cmVjdl9pZGxlIDwgdCkKLQkJdCA9IGlkbGUtPnJlY3ZfaWRsZTsKLQlyZXR1cm4gaWRsZV90aW1lX2xpbWl0IC0gdDsKLX0KLQotdm9pZCBwbHVnaW5faW5pdCh2b2lkKQotewotCWluZm8oInBsdWdpbl9pbml0Iik7Ci0JYWRkX29wdGlvbnMobXlfb3B0aW9ucyk7Ci0JaWRsZV90aW1lX2hvb2sgPSBteV9nZXRfaWRsZTsKLX0KZGlmZiAtLWdpdCBhL3BwcGQvcGx1Z2lucy9wYXNzcHJvbXB0LmMgYi9wcHBkL3BsdWdpbnMvcGFzc3Byb21wdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWJiNmRjLi4wMDAwMDAwCi0tLSBhL3BwcGQvcGx1Z2lucy9wYXNzcHJvbXB0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIHBhc3Nwcm9tcHQuYyAtIHBwcGQgcGx1Z2luIHRvIGludm9rZSBhbiBleHRlcm5hbCBQQVAgcGFzc3dvcmQgcHJvbXB0ZXIKLSAqCi0gKiBDb3B5cmlnaHQgMTk5OSBQYXVsIE1hY2tlcnJhcywgQWxhbiBDdXJyeS4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIDxzeXNsb2cuaD4KLSNpbmNsdWRlICJwcHBkLmgiCi0KLWNoYXIgcHBwZF92ZXJzaW9uW10gPSBWRVJTSU9OOwotCi1zdGF0aWMgY2hhciBwcm9tcHRwcm9nW1BBVEhfTUFYKzFdOwotCi1zdGF0aWMgb3B0aW9uX3Qgb3B0aW9uc1tdID0gewotICAgIHsgInByb21wdHByb2ciLCBvX3N0cmluZywgcHJvbXB0cHJvZywKLSAgICAgICJFeHRlcm5hbCBQQVAgcGFzc3dvcmQgcHJvbXB0aW5nIHByb2dyYW0iLAotICAgICAgT1BUX1NUQVRJQywgTlVMTCwgUEFUSF9NQVggfSwKLSAgICB7IE5VTEwgfQotfTsKLQotc3RhdGljIGludCBwcm9tcHRwYXNzKGNoYXIgKnVzZXIsIGNoYXIgKnBhc3N3ZCkKLXsKLSAgICBpbnQgcFsyXTsKLSAgICBwaWRfdCBraWQ7Ci0gICAgaW50IHJlYWRnb29kLCB3c3RhdDsKLSAgICBzc2l6ZV90IHJlZDsKLQotICAgIGlmIChwcm9tcHRwcm9nWzBdID09IDAgfHwgYWNjZXNzKHByb21wdHByb2csIFhfT0spIDwgMCkKLQlyZXR1cm4gLTE7CS8qIHNvcnJ5LCBjYW4ndCBoZWxwICovCi0KLSAgICBpZiAoIXBhc3N3ZCkKLQlyZXR1cm4gMTsKLQotICAgIGlmIChwaXBlKHApKSB7Ci0Jd2FybigiQ2FuJ3QgbWFrZSBhIHBpcGUgZm9yICVzIiwgcHJvbXB0cHJvZyk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmICgoa2lkID0gZm9yaygpKSA9PSAocGlkX3QpIC0xKSB7Ci0Jd2FybigiQ2FuJ3QgZm9yayB0byBydW4gJXMiLCBwcm9tcHRwcm9nKTsKLQljbG9zZShwWzBdKTsKLQljbG9zZShwWzFdKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKCFraWQpIHsKLQkvKiB3ZSBhcmUgdGhlIGNoaWxkLCBleGVjIHRoZSBwcm9ncmFtICovCi0JY2hhciAqYXJndls1XSwgZmRzdHJbMzJdOwotCXN5c19jbG9zZSgpOwotCWNsb3NlbG9nKCk7Ci0JY2xvc2UocFswXSk7Ci0Jc2V0ZXVpZChnZXR1aWQoKSk7Ci0Jc2V0ZWdpZChnZXRnaWQoKSk7Ci0JYXJndlswXSA9IHByb21wdHByb2c7Ci0JYXJndlsxXSA9IHVzZXI7Ci0JYXJndlsyXSA9IHJlbW90ZV9uYW1lOwotCXNwcmludGYoZmRzdHIsICIlZCIsIHBbMV0pOwotCWFyZ3ZbM10gPSBmZHN0cjsKLQlhcmd2WzRdID0gMDsKLQlleGVjdigqYXJndiwgYXJndik7Ci0JX2V4aXQoMTI3KTsKLSAgICB9Ci0KLSAgICAvKiB3ZSBhcmUgdGhlIHBhcmVudCwgcmVhZCB0aGUgcGFzc3dvcmQgZnJvbSB0aGUgcGlwZSAqLwotICAgIGNsb3NlKHBbMV0pOwotICAgIHJlYWRnb29kID0gMDsKLSAgICBkbyB7Ci0JcmVkID0gcmVhZChwWzBdLCBwYXNzd2QgKyByZWFkZ29vZCwgTUFYU0VDUkVUTEVOLTEgLSByZWFkZ29vZCk7Ci0JaWYgKHJlZCA9PSAwKQotCSAgICBicmVhazsKLQlpZiAocmVkIDwgMCkgewotCSAgICBpZiAoZXJybm8gPT0gRUlOVFIpCi0JCWNvbnRpbnVlOwotCSAgICBlcnJvcigiQ2FuJ3QgcmVhZCBzZWNyZXQgZnJvbSAlczogJW0iLCBwcm9tcHRwcm9nKTsKLQkgICAgcmVhZGdvb2QgPSAtMTsKLQkgICAgYnJlYWs7Ci0JfQotCXJlYWRnb29kICs9IHJlZDsKLSAgICB9IHdoaWxlIChyZWFkZ29vZCA8IE1BWFNFQ1JFVExFTiAtIDEpOwotICAgIGNsb3NlKHBbMF0pOwotCi0gICAgLyogbm93IHdhaXQgZm9yIGNoaWxkIHRvIGV4aXQgKi8KLSAgICB3aGlsZSAod2FpdHBpZChraWQsICZ3c3RhdCwgMCkgPCAwKSB7Ci0JaWYgKGVycm5vICE9IEVJTlRSKSB7Ci0JICAgIHdhcm4oImVycm9yIHdhaXRpbmcgZm9yICVzOiAlbSIsIHByb21wdHByb2cpOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gICAgaWYgKHJlYWRnb29kIDwgMCkKLQlyZXR1cm4gMDsKLSAgICBwYXNzd2RbcmVhZGdvb2RdID0gMDsKLSAgICBpZiAoIVdJRkVYSVRFRCh3c3RhdCkpCi0Jd2FybigiJXMgdGVybWluYXRlZCBhYm5vcm1hbGx5IiwgcHJvbXB0cHJvZyk7Ci0gICAgaWYgKFdFWElUU1RBVFVTKHdzdGF0KSkKLQl3YXJuKCIlcyBleGl0ZWQgd2l0aCBjb2RlICVkIiwgcHJvbXB0cHJvZywgV0VYSVRTVEFUVVMoc3RhdHVzKSk7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotdm9pZCBwbHVnaW5faW5pdCh2b2lkKQotewotICAgIGFkZF9vcHRpb25zKG9wdGlvbnMpOwotICAgIHBhcF9wYXNzd2RfaG9vayA9IHByb21wdHBhc3M7Ci19CmRpZmYgLS1naXQgYS9wcHBkL3BsdWdpbnMvcGFzc3dvcmRmZC5jIGIvcHBwZC9wbHVnaW5zL3Bhc3N3b3JkZmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcxOGYzYi4uMDAwMDAwMAotLS0gYS9wcHBkL3BsdWdpbnMvcGFzc3dvcmRmZC5jCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotCi0vKgotICogIEF1dGhvcjogQXJ2aW4gU2NobmVsbCA8YXJ2aW5Ac3VzZS5kZT4KLSAqCi0gKiAgVGhpcyBwbHVnaW4gbGV0J3MgeW91IHBhc3MgdGhlIHBhc3N3b3JkIHRvIHRoZSBwcHBkIHZpYQotICogIGEgZmlsZSBkZXNjcmlwdG9yLiBUaGF0J3MgZWFzeSBhbmQgc2VjdXJlIC0gbm8gZmlkZGxpbmcKLSAqICB3aXRoIHBhcC0gYW5kIGNoYXAtc2VjcmV0cyBmaWxlcy4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAicHBwZC5oIgotCi1jaGFyIHBwcGRfdmVyc2lvbltdID0gVkVSU0lPTjsKLQotc3RhdGljIGludCBwYXNzd2RmZCA9IC0xOwotc3RhdGljIGNoYXIgc2F2ZV9wYXNzd2RbTUFYU0VDUkVUTEVOXTsKLQotc3RhdGljIG9wdGlvbl90IG9wdGlvbnNbXSA9IHsKLSAgICB7ICJwYXNzd29yZGZkIiwgb19pbnQsICZwYXNzd2RmZCwKLSAgICAgICJSZWNlaXZlIHBhc3N3b3JkIG9uIHRoaXMgZmlsZSBkZXNjcmlwdG9yIiB9LAotICAgIHsgTlVMTCB9Ci19OwotCi1zdGF0aWMgaW50IHB3ZmRfY2hlY2sgKHZvaWQpCi17Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgcHdmZF9wYXNzd2QgKGNoYXIgKnVzZXIsIGNoYXIgKnBhc3N3ZCkKLXsKLSAgICBpbnQgcmVhZGdvb2QsIHJlZDsKLQotICAgIGlmIChwYXNzd2RmZCA9PSAtMSkKLQlyZXR1cm4gLTE7Ci0KLSAgICBpZiAocGFzc3dkID09IE5VTEwpCi0JcmV0dXJuIDE7Ci0KLSAgICBpZiAocGFzc3dkZmQgPT0gLTIpIHsKLQlzdHJjcHkgKHBhc3N3ZCwgc2F2ZV9wYXNzd2QpOwotCXJldHVybiAxOwotICAgIH0KLQotICAgIHJlYWRnb29kID0gMDsKLSAgICBkbyB7Ci0JcmVkID0gcmVhZCAocGFzc3dkZmQsIHBhc3N3ZCArIHJlYWRnb29kLCBNQVhTRUNSRVRMRU4gLSAxIC0gcmVhZGdvb2QpOwotCWlmIChyZWQgPT0gMCkKLQkgICAgYnJlYWs7Ci0JaWYgKHJlZCA8IDApIHsKLQkgICAgZXJyb3IgKCJDYW4ndCByZWFkIHNlY3JldCBmcm9tIGZkXG4iKTsKLQkgICAgcmVhZGdvb2QgPSAtMTsKLQkgICAgYnJlYWs7Ci0JfQotCXJlYWRnb29kICs9IHJlZDsKLSAgICB9IHdoaWxlIChyZWFkZ29vZCA8IE1BWFNFQ1JFVExFTiAtIDEpOwotCi0gICAgY2xvc2UgKHBhc3N3ZGZkKTsKLQotICAgIGlmIChyZWFkZ29vZCA8IDApCi0JcmV0dXJuIDA7Ci0KLSAgICBwYXNzd2RbcmVhZGdvb2RdID0gMDsKLSAgICBzdHJjcHkgKHNhdmVfcGFzc3dkLCBwYXNzd2QpOwotICAgIHBhc3N3ZGZkID0gLTI7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotdm9pZCBwbHVnaW5faW5pdCAodm9pZCkKLXsKLSAgICBhZGRfb3B0aW9ucyAob3B0aW9ucyk7Ci0KLSAgICBwYXBfY2hlY2tfaG9vayA9IHB3ZmRfY2hlY2s7Ci0gICAgcGFwX3Bhc3N3ZF9ob29rID0gcHdmZF9wYXNzd2Q7Ci0KLSAgICBjaGFwX2NoZWNrX2hvb2sgPSBwd2ZkX2NoZWNrOwotICAgIGNoYXBfcGFzc3dkX2hvb2sgPSBwd2ZkX3Bhc3N3ZDsKLX0KZGlmZiAtLWdpdCBhL3BwcGQvcGx1Z2lucy9wcHBvYXRtL0NPUFlJTkcgYi9wcHBkL3BsdWdpbnMvcHBwb2F0bS9DT1BZSU5HCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmIyNjIxLi4wMDAwMDAwCi0tLSBhL3BwcGQvcGx1Z2lucy9wcHBvYXRtL0NPUFlJTkcKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVRoZSBmaWxlcyBhbnMuYywgYXRtLmgsIGF0bXJlcy5oLCBhdG1zYXAuaCwgbWlzYy5jLCB0ZXh0MmF0bS5jICBhbmQKLXRleHQycW9zLmMgYXJlIHRha2VuIGZyb20gdGhlIGxpbnV4LWF0bSBsaWJyYXJpZXMuICBUaGVzZSBhcmUgCi1Db3B5cmlnaHQgMTk5NS0yMDAwIEVQRkwtTFJDL0lDQSwgYW5kIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgR05VIExlc3NlcgotR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLQotVGhlIGZpbGUgcHBwb2F0bS5jIGNvbnRhaW5zIGl0cyBvd24gY29weXJpZ2h0IG5vdGljZSwgYW5kIGlzIGxpY2Vuc2VkCi11bmRlciB0aGUgR1BMLgpkaWZmIC0tZ2l0IGEvcHBwZC9wbHVnaW5zL3BwcG9hdG0vTWFrZWZpbGUubGludXggYi9wcHBkL3BsdWdpbnMvcHBwb2F0bS9NYWtlZmlsZS5saW51eApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBmNjJlNi4uMDAwMDAwMAotLS0gYS9wcHBkL3BsdWdpbnMvcHBwb2F0bS9NYWtlZmlsZS5saW51eAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLSNDQwk9IGdjYwotQ09QVFMJPSAtTzIgLWcKLUNGTEFHUwk9ICQoQ09QVFMpIC1JLi4vLi4gLUkuLi8uLi8uLi9pbmNsdWRlIC1mUElDCi1MREZMQUdTCT0gLXNoYXJlZAotSU5TVEFMTAk9IGluc3RhbGwKLQotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLURFU1RESVIgPSAkKElOU1RST09UKUBERVNURElSQAotTElCRElSID0gJChERVNURElSKS9saWIvcHBwZC8kKFZFUlNJT04pCi0KLVZFUlNJT04gPSAkKHNoZWxsIGF3ayAtRiAnIicgJy9WRVJTSU9OLyB7IHByaW50ICQkMjsgfScgLi4vLi4vcGF0Y2hsZXZlbC5oKQotCi1QTFVHSU4gOj0gcHBwb2F0bS5zbwotUExVR0lOX09CSlMgOj0gcHBwb2F0bS5vIAotCi0jKioqKioqKgotIyBEbyB3ZSBoYXZlIHRoZSBBVE0gbGlicmFyaWVzIGluc3RhbGxlZD8gU2V0IEhBVkVfTElCQVRNIHRvIHVzZSB0aGVtLAotIyBvciBsZWF2ZSBpdCB1bnNldCB0byBidWlsZCB0aGUgZmV3IHJvdXRpbmVzIHdlIGFjdHVhbGx5IF91c2VfIGludG8KLSMgdGhlIHBsdWdpbiBkaXJlY3RseS4KLSMKLSNIQVZFX0xJQkFUTT15ZXMKLQotaWZkZWYgSEFWRV9MSUJBVE0KLUxJQlMgOj0gLWxhdG0KLWVsc2UKLUNGTEFHUyArPSAtSS4KLVBMVUdJTl9PQkpTICs9IHRleHQycW9zLm8gdGV4dDJhdG0ubyBtaXNjLm8gYW5zLm8KLUxJQlMgOj0gLWxyZXNvbHYKLWVuZGlmCi0KLSMqKioqKioqKioKLWFsbDogJChQTFVHSU4pCi0KLSQoUExVR0lOKTogJChQTFVHSU5fT0JKUykKLQkkKENDKSAkKENGTEFHUykgLW8gJEAgLXNoYXJlZCAkXiAkKExJQlMpCi0KLWluc3RhbGw6IGFsbAotCSQoSU5TVEFMTCkgLWQgLW0gNzU1ICQoTElCRElSKQotCSQoSU5TVEFMTCkgLWMgLW0gNDU1MCAkKFBMVUdJTikgJChMSUJESVIpCi0KLWNsZWFuOgotCXJtIC1mICoubyAqLnNvCi0KLSUubzogJS5jCi0JJChDQykgJChDRkxBR1MpIC1jIC1vICRAICQ8CmRpZmYgLS1naXQgYS9wcHBkL3BsdWdpbnMvcHBwb2F0bS9hbnMuYyBiL3BwcGQvcGx1Z2lucy9wcHBvYXRtL2Fucy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzNlYjMzLi4wMDAwMDAwCi0tLSBhL3BwcGQvcGx1Z2lucy9wcHBvYXRtL2Fucy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qIGFucy5jIC0gSW50ZXJmYWNlIGZvciB0ZXh0MmF0bSBhbmQgYXRtMnRleHQgdG8gQU5TICovCi0KLS8qIFdyaXR0ZW4gMTk5Ni0yMDAwIGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgRVBGTC1MUkMvSUNBICovCi0KLQotLyoKLSAqIFRoaXMgc3R1ZmYgaXMgYSB0ZW1wb3JhcnkgaGFjayB0byBhdm9pZCB1c2luZyBnZXRob3N0YnluYW1lX25zYXAgYW5kIHN1Y2gKLSAqIHdpdGhvdXQgZG9pbmcgdGhlICJmdWxsIHVwZ3JhZGUiIHRvIGdldGFkZHJpbmZvL2dldG5hbWVpbmZvLiBUaGlzIGFsc28KLSAqIHNlcnZlcyBhcyBhbiBleGVyY2lzZSBmb3IgbWUgdG8gZ2V0IGFsbCB0aGUgZGV0YWlscyByaWdodCBiZWZvcmUgSSBwcm9wb3NlCi0gKiBhIHBhdGNoIHRoYXQgd291bGQgZXZlbnR1YWxseSBlbmQgdXAgaW4gbGliYyAoYW5kIHRoYXQgc2hvdWxkIHRoZXJlZm9yZSBiZQotICogYXMgc3RhYmxlIGFzIHBvc3NpYmxlKS4KLSAqLwotCi0jaWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPGFycGEvbmFtZXNlci5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaW5jbHVkZSA8cmVzb2x2Lmg+Ci0KLSNpbmNsdWRlICJhdG0uaCIKLSNpbmNsdWRlICJhdG1yZXMuaCIKLQotCi0jZGVmaW5lIE1BWF9BTlNXRVIgMjA0OAotI2RlZmluZSBNQVhfTkFNRSAgIDEwMjQKLQotI2RlZmluZSBNQVhfTElORQkJMjA0OAkvKiBpbiAvZXRjL2UxNjRfY2MgKi8KLSNkZWZpbmUgRTE2NF9DQ19ERUZBVUxUX0xFTgkgICAyCi0jZGVmaW5lIEUxNjRfQ0NfRklMRQkJIi9ldGMvZTE2NF9jYyIKLQotI2RlZmluZSBHRVQxNihwb3MpICgoKHBvcylbMF0gPDwgOCkgfCAocG9zKVsxXSkKLQotCi1zdGF0aWMgaW50IGFucyhjb25zdCBjaGFyICp0ZXh0LGludCB3YW50ZWQsdm9pZCAqcmVzdWx0LGludCByZXNfbGVuKQotewotICAgIHVuc2lnbmVkIGNoYXIgYW5zd2VyW01BWF9BTlNXRVJdOwotICAgIHVuc2lnbmVkIGNoYXIgbmFtZVtNQVhfTkFNRV07Ci0gICAgdW5zaWduZWQgY2hhciAqcG9zLCpkYXRhLCpmb3VuZDsKLSAgICBpbnQgYW5zd2VyX2xlbixuYW1lX2xlbixkYXRhX2xlbixmb3VuZF9sZW47Ci0gICAgaW50IHF1ZXN0aW9ucyxhbnN3ZXJzOwotCi0gICAgZm91bmRfbGVuID0gMDsgLyogZ2NjIHdhbnRzIGl0ICovCi0gICAgaWYgKChhbnN3ZXJfbGVuID0gcmVzX3NlYXJjaCh0ZXh0LENfSU4sd2FudGVkLGFuc3dlcixNQVhfQU5TV0VSKSkgPCAwKQotCXJldHVybiBUUllfT1RIRVI7Ci0gICAgLyoKLSAgICAgKiBSZXNwb25zZSBoZWFkZXI6IGlkLCBmbGFncywgI3F1ZXJpZXMsICNhbnN3ZXJzLCAjYXV0aG9yaXR5LAotICAgICAqICNhZGRpdGlvbmFsIChhbGwgMTYgYml0cykKLSAgICAgKi8KLSAgICBwb3MgPSBhbnN3ZXIrMTI7Ci0gICAgaWYgKGFuc3dlclszXSAmIDE1KSByZXR1cm4gVFJZX09USEVSOyAvKiByY29kZSAhPSAwICovCi0gICAgcXVlc3Rpb25zID0gR0VUMTYoYW5zd2VyKzQpOwotICAgIGlmIChxdWVzdGlvbnMgIT0gMSkgcmV0dXJuIFRSWV9PVEhFUjsgLyogdHJvdWJsZSAuLi4gKi8KLSAgICBhbnN3ZXJzID0gR0VUMTYoYW5zd2VyKzYpOwotICAgIGlmIChhbnN3ZXJzIDwgMSkgcmV0dXJuIFRSWV9PVEhFUjsKLSAgICAvKgotICAgICAqIFF1ZXJ5OiBuYW1lLCB0eXBlICgxNiksIGNsYXNzICgxNikKLSAgICAgKi8KLSAgICBpZiAoKG5hbWVfbGVuID0gZG5fZXhwYW5kKGFuc3dlcixhbnN3ZXIrYW5zd2VyX2xlbixwb3MsbmFtZSxNQVhfTkFNRSkpIDwgMCkKLQlyZXR1cm4gVFJZX09USEVSOwotICAgIHBvcyArPSBuYW1lX2xlbjsKLSAgICBpZiAoR0VUMTYocG9zKSAhPSB3YW50ZWQgfHwgR0VUMTYocG9zKzIpICE9IENfSU4pIHJldHVybiBUUllfT1RIRVI7Ci0gICAgcG9zICs9IDQ7Ci0gICAgLyoKLSAgICAgKiBJdGVyYXRlIG92ZXIgYW5zd2VycyB1bnRpbCB3ZSBmaW5kIHNvbWV0aGluZyB3ZSBsaWtlLCBnaXZpbmcgcHJpb3JpdHkKLSAgICAgKiB0byBBVE1BX0FFU0EgKHVudGlsIHNpZ25hbGluZyBpcyBmaXhlZCB0byB3b3JrIHdpdGggRS4xNjQgdG9vKQotICAgICAqLwotICAgIGZvdW5kID0gTlVMTDsKLSAgICB3aGlsZSAoYW5zd2Vycy0tKSB7Ci0JLyoKLQkgKiBSUjogbmFtZSwgdHlwZSAoMTYpLCBjbGFzcyAoMTYpLCBUVEwgKDMyKSwgcmVzb3VyY2VfbGVuICgxNiksCi0JICogcmVzb3VyY2VfZGF0YSAuLi4KLQkgKi8KLQlpZiAoKG5hbWVfbGVuID0gZG5fZXhwYW5kKGFuc3dlcixhbnN3ZXIrYW5zd2VyX2xlbixwb3MsbmFtZSxNQVhfTkFNRSkpCi0JICA8IDApIHJldHVybiBUUllfT1RIRVI7Ci0JcG9zICs9IG5hbWVfbGVuOwotCWRhdGFfbGVuID0gR0VUMTYocG9zKzgpOwotCWRhdGEgPSBwb3MrMTA7Ci0JcG9zID0gZGF0YStkYXRhX2xlbjsKLQlpZiAoR0VUMTYoZGF0YS0xMCkgIT0gd2FudGVkIHx8IEdFVDE2KGRhdGEtOCkgIT0gQ19JTiB8fCAhLS1kYXRhX2xlbikKLQkgICAgY29udGludWU7Ci0Jc3dpdGNoICh3YW50ZWQpIHsKLSAgICAgICAgICAgIGNhc2UgVF9OU0FQOgotICAgICAgICAgICAgICAgIGRhdGFfbGVuKys7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGFfbGVuICE9IEFUTV9FU0FfTEVOKSBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKChzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjICopIHJlc3VsdCktPgotICAgICAgICAgICAgICAgICAgc2FzX2FkZHIucHJ2LGRhdGEsQVRNX0VTQV9MRU4pOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotCSAgICBjYXNlIFRfQVRNQToKLQkJc3dpdGNoICgqZGF0YSsrKSB7Ci0JCSAgICBjYXNlIEFUTUFfQUVTQToKLQkJCWlmIChkYXRhX2xlbiAhPSBBVE1fRVNBX0xFTikgY29udGludWU7Ci0JCQltZW1jcHkoKChzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjICopIHJlc3VsdCktPgotCQkJICBzYXNfYWRkci5wcnYsZGF0YSxBVE1fRVNBX0xFTik7Ci0JCQlyZXR1cm4gMDsKLQkJICAgIGNhc2UgQVRNQV9FMTY0OgotCQkJaWYgKGRhdGFfbGVuID4gQVRNX0UxNjRfTEVOKSBjb250aW51ZTsKLQkJCWlmICghZm91bmQpIHsKLQkJCSAgICBmb3VuZCA9IGRhdGE7Ci0JCQkgICAgZm91bmRfbGVuID0gZGF0YV9sZW47Ci0JCQl9Ci0JCQlicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCQljb250aW51ZTsKLQkJfQotCSAgICBjYXNlIFRfUFRSOgotCQkgICAgaWYgKGRuX2V4cGFuZChhbnN3ZXIsYW5zd2VyK2Fuc3dlcl9sZW4sZGF0YSxyZXN1bHQsCi0JCSAgICAgIHJlc19sZW4pIDwgMCkgcmV0dXJuIEZBVEFMOwotCQkgICAgcmV0dXJuIDA7Ci0JCWRlZmF1bHQ6Ci0JCSAgICBjb250aW51ZTsKLQl9Ci0gICAgfQotICAgIGlmICghZm91bmQpIHJldHVybiBUUllfT1RIRVI7Ci0gICAgbWVtY3B5KCgoc3RydWN0IHNvY2thZGRyX2F0bXN2YyAqKSByZXN1bHQpLT5zYXNfYWRkci5wdWIsZm91bmQsCi0gICAgICBmb3VuZF9sZW4pOwotICAgICgoc3RydWN0IHNvY2thZGRyX2F0bXN2YyAqKSByZXN1bHQpLT5zYXNfYWRkci5wdWJbZm91bmRfbGVuXSA9IDA7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IGFuc19ieW5hbWUoY29uc3QgY2hhciAqdGV4dCxzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjICphZGRyLGludCBsZW5ndGgsCi0gIGludCBmbGFncykKLXsKLSAgICBpZiAoIShmbGFncyAmIFQyQV9TVkMpIHx8IGxlbmd0aCAhPSBzaXplb2YoKmFkZHIpKSByZXR1cm4gVFJZX09USEVSOyAKLSAgICBtZW1zZXQoYWRkciwwLHNpemVvZigqYWRkcikpOwotICAgIGFkZHItPnNhc19mYW1pbHkgPSBBRl9BVE1TVkM7Ci0gICAgaWYgKCFhbnModGV4dCxUX0FUTUEsYWRkcixsZW5ndGgpKSByZXR1cm4gMDsKLSAgICByZXR1cm4gYW5zKHRleHQsVF9OU0FQLGFkZHIsbGVuZ3RoKTsKLX0KLQotCi1zdGF0aWMgaW50IGVuY29kZV9uc2FwKGNoYXIgKmJ1Zixjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyKQotewotICAgIHN0YXRpYyBpbnQgZm10X2RjY1tdID0geyAyLDEyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKLSAgICAgIDQsMiwwIH07Ci0gICAgc3RhdGljIGludCBmbXRfZTE2NFtdID0geyAyLDEyLDEsMSwxLDEsMSwxLDEsMSwxNiwyLDAgfTsKLSAgICBpbnQgKmZtdDsKLSAgICBpbnQgcG9zLGksajsKLQotICAgIHN3aXRjaCAoKmFkZHIpIHsKLQljYXNlIEFUTV9BRklfRENDOgotCWNhc2UgQVRNX0FGSV9JQ0Q6Ci0JY2FzZSBBVE1fQUZJX0xPQ0FMOgotCWNhc2UgQVRNX0FGSV9EQ0NfR1JPVVA6Ci0JY2FzZSBBVE1fQUZJX0lDRF9HUk9VUDoKLQljYXNlIEFUTV9BRklfTE9DQUxfR1JPVVA6Ci0JICAgIGZtdCA9IGZtdF9kY2M7Ci0JICAgIGJyZWFrOwotCWNhc2UgQVRNX0FGSV9FMTY0OgotCWNhc2UgQVRNX0FGSV9FMTY0X0dST1VQOgotCSAgICBmbXQgPSBmbXRfZTE2NDsKLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICAgcmV0dXJuIFRSWV9PVEhFUjsKLSAgICB9Ci0gICAgcG9zID0gMipBVE1fRVNBX0xFTjsKLSAgICBmb3IgKGkgPSAwOyBmbXRbaV07IGkrKykgewotCXBvcyAtPSBmbXRbaV07Ci0JZm9yIChqID0gMDsgaiA8IGZtdFtpXTsgaisrKQotCSAgICBzcHJpbnRmKGJ1ZisrLCIleCIsCi0JICAgICAgKGFkZHJbKHBvcytqKSA+PiAxXSA+PiA0KigxLSgocG9zK2opICYgMSkpKSAmIDB4Zik7Ci0JKmJ1ZisrID0gJy4nOwotICAgIH0KLSAgICBzdHJjcHkoYnVmLCJBRVNBLkFUTUEuSU5ULiIpOwotICAgIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgZW5jb2RlX25zYXBfbmV3KGNoYXIgKmJ1Zixjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyKQotewotICAgIGludCBpOwotICAgIGludCBkaWdpdDsKLQotICAgIGZvciAoaSA9IDIwOyBpOyApIHsKLSAgICAgICAgaS0tOwotICAgICAgICBkaWdpdCA9IGFkZHJbaV0gJiAweDBGOwotICAgICAgICAqKGJ1ZisrKSA9IGRpZ2l0ICsgKGRpZ2l0ID49IDEwID8gJzcnIDogJzAnKTsKLSAgICAgICAgKihidWYrKykgPSAnLic7Ci0gICAgICAgIGRpZ2l0ID0gKCh1bnNpZ25lZCBjaGFyKSAoYWRkcltpXSkpID4+IDQ7Ci0gICAgICAgICooYnVmKyspID0gZGlnaXQgKyAoZGlnaXQgPj0gMTAgPyAnNycgOiAnMCcpOwotICAgICAgICAqKGJ1ZisrKSA9ICcuJzsKLSAgICB9Ci0gICAgc3RyY3B5IChidWYsICJOU0FQLklOVC4iKTsKLSAgICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IGNjX2xlbihpbnQgcDAsaW50IHAxKQotewotICAgIHN0YXRpYyBjaGFyICpjY190YWJsZSA9IE5VTEw7Ci0gICAgRklMRSAqZmlsZTsKLSAgICBjaGFyIGJ1ZmZlcltNQVhfTElORV07Ci0gICAgY2hhciAqaGVyZTsKLSAgICBpbnQgY2M7Ci0KLSAgICBpZiAoIWNjX3RhYmxlKSB7Ci0JaWYgKCEoY2NfdGFibGUgPSBtYWxsb2MoMTAwKSkpIHsKLQkgICAgcGVycm9yKCJtYWxsb2MiKTsKLQkgICAgcmV0dXJuIEUxNjRfQ0NfREVGQVVMVF9MRU47Ci0JfQotCW1lbXNldChjY190YWJsZSxFMTY0X0NDX0RFRkFVTFRfTEVOLDEwMCk7Ci0JaWYgKCEoZmlsZSA9IGZvcGVuKEUxNjRfQ0NfRklMRSwiciIpKSkKLQkgICAgcGVycm9yKEUxNjRfQ0NfRklMRSk7Ci0JZWxzZSB7Ci0JICAgIHdoaWxlIChmZ2V0cyhidWZmZXIsTUFYX0xJTkUsZmlsZSkpIHsKLQkJaGVyZSA9IHN0cmNocihidWZmZXIsJyMnKTsKLQkJaWYgKGhlcmUpICpoZXJlID0gMDsKLQkJaWYgKHNzY2FuZihidWZmZXIsIiVkIiwmY2MpID09IDEpIHsKLQkJICAgIGlmIChjYyA8IDEwKSBjY190YWJsZVtjY10gPSAxOwotCQkgICAgZWxzZSBpZiAoY2MgPCAxMDApIGNjX3RhYmxlW2NjXSA9IDI7Ci0JCQllbHNlIGNjX3RhYmxlW2NjLzEwXSA9IDM7Ci0JCX0KLQkgICAgfQotCSAgICBmY2xvc2UoZmlsZSk7Ci0JfQotICAgIH0KLSAgICBpZiAoY2NfdGFibGVbcDBdID09IDEpIHJldHVybiAxOwotICAgIHJldHVybiBjY190YWJsZVtwMCoxMCtwMV07Ci19Ci0KLQotc3RhdGljIGludCBlbmNvZGVfZTE2NChjaGFyICpidWYsY29uc3QgY2hhciAqYWRkcikKLXsKLSAgICBjb25zdCBjaGFyICpwcmVmaXgsKmhlcmU7Ci0KLSAgICBwcmVmaXggPSBhZGRyK2NjX2xlbihhZGRyWzBdLTQ4LGFkZHJbMV0tNDgpOwotICAgIGhlcmUgPSBzdHJjaHIoYWRkciwwKTsKLSAgICB3aGlsZSAoaGVyZSA+IHByZWZpeCkgewotCSpidWYrKyA9ICotLWhlcmU7Ci0JKmJ1ZisrID0gJy4nOwotICAgIH0KLSAgICB3aGlsZSAoaGVyZSA+IGFkZHIpICpidWYrKyA9ICphZGRyKys7Ci0gICAgc3RyY3B5KGJ1ZiwiLkUxNjQuQVRNQS5JTlQuIik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IGFuc19ieWFkZHIoY2hhciAqYnVmZmVyLGludCBsZW5ndGgsY29uc3Qgc3RydWN0IHNvY2thZGRyX2F0bXN2YyAqYWRkciwKLSAgaW50IGZsYWdzKQotewotICAgIGNoYXIgdG1wW01BWF9OQU1FXTsgLyogY291bGQgYmUgc21hbGxlciAuLi4gKi8KLSAgICBpbnQgcmVzOwotCi0gICAgaWYgKGFkZHItPnNhc19hZGRyLnBydikgewotICAgICAgICByZXMgPSBlbmNvZGVfbnNhcCh0bXAsYWRkci0+c2FzX2FkZHIucHJ2KTsKLSAgICAgICAgaWYgKCFyZXMgJiYgIWFucyh0bXAsVF9QVFIsYnVmZmVyLGxlbmd0aCkpIHJldHVybiAwOwotCXJlcyA9IGVuY29kZV9uc2FwX25ldyh0bXAsYWRkci0+c2FzX2FkZHIucHJ2KTsKLSAgICAgICAgaWYgKHJlcyA8IDApIHJldHVybiByZXM7Ci0JcmV0dXJuIGFucyh0bXAsVF9QVFIsYnVmZmVyLGxlbmd0aCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVzID0gZW5jb2RlX2UxNjQodG1wLGFkZHItPnNhc19hZGRyLnB1Yik7Ci0gICAgICAgIGlmIChyZXMgPCAwKSByZXR1cm4gcmVzOwotICAgICAgICByZXR1cm4gYW5zKHRtcCxUX1BUUixidWZmZXIsbGVuZ3RoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcHBkL3BsdWdpbnMvcHBwb2F0bS9hdG0uaCBiL3BwcGQvcGx1Z2lucy9wcHBvYXRtL2F0bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjE1ZGRhLi4wMDAwMDAwCi0tLSBhL3BwcGQvcGx1Z2lucy9wcHBvYXRtL2F0bS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qIGF0bS5oIC0gRnVuY3Rpb25zIHVzZWZ1bCBmb3IgQVRNIGFwcGxpY2F0aW9ucyAqLwotIAotLyogV3JpdHRlbiAxOTk1LTIwMDAgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMLUxSQy9JQ0EgKi8KLSAKLQotI2lmbmRlZiBfQVRNX0gKLSNkZWZpbmUgX0FUTV9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bGludXgvYXRtLmg+Ci0KLQotLyoKLSAqIEZvciB2ZXJzaW9ucyBvZiBnbGliYyA8IDIuMQotICovCi0KLSNpZm5kZWYgQUZfQVRNUFZDCi0jZGVmaW5lIEFGX0FUTVBWQwk4Ci0jZW5kaWYKLQotI2lmbmRlZiBBRl9BVE1TVkMKLSNkZWZpbmUgQUZfQVRNU1ZDCTIwCi0jZW5kaWYKLQotI2lmbmRlZiBQRl9BVE1QVkMKLSNkZWZpbmUgUEZfQVRNUFZDCUFGX0FUTVBWQwotI2VuZGlmCi0KLSNpZm5kZWYgUEZfQVRNU1ZDCi0jZGVmaW5lIFBGX0FUTVNWQwlBRl9BVE1TVkMKLSNlbmRpZgotCi0jaWZuZGVmIFNPTF9BVE0KLSNkZWZpbmUgU09MX0FUTQkJMjY0Ci0jZW5kaWYKLQotI2lmbmRlZiBTT0xfQUFMCi0jZGVmaW5lIFNPTF9BQUwJCTI2NQotI2VuZGlmCi0KLQotI2RlZmluZSBIT1NUU19BVE0gIi9ldGMvaG9zdHMuYXRtIgotCi0vKiB0ZXh0MmF0bSBmbGFncyAqLwotI2RlZmluZSBUMkFfUFZDCQkgIDEJLyogYWRkcmVzcyBpcyBQVkMgKi8KLSNkZWZpbmUgVDJBX1NWQwkJICAyCS8qIGFkZHJlc3MgaXMgU1ZDICovCi0jZGVmaW5lIFQyQV9VTlNQRUMJICA0CS8qIGFsbG93IHVuc3BlY2lmaWVkIHBhcnRzIGluIFBWQyBhZGRyZXNzICovCi0jZGVmaW5lIFQyQV9XSUxEQ0FSRAkgIDgJLyogYWxsb3cgd2lsZGNhcmRzIGluIFBWQyBvciBTVkMgYWRkcmVzcyAqLwotI2RlZmluZSBUMkFfTk5JCQkgMTYJLyogYWxsb3cgTk5JIFZQSSByYW5nZSAoUFZDKSAqLwotI2RlZmluZSBUMkFfTkFNRQkgMzIJLyogYWxsb3cgbmFtZSByZXNvbHV0aW9uICovCi0jZGVmaW5lIFQyQV9SRU1PVEUJIDY0CS8qIE9CU09MRVRFICovCi0jZGVmaW5lIFQyQV9MT0NBTAkxMjgJLyogZG9uJ3QgdXNlIEFOUyAqLwotCi0vKiBhdG0ydGV4dCBmbGFncyAqLwotI2RlZmluZSBBMlRfUFJFVFRZCSAxCS8qIGFkZCBzeW50YWN0aWMgc3VnYXIgKi8KLSNkZWZpbmUgQTJUX05BTUUJIDIJLyogYXR0ZW1wdCBuYW1lIGxvb2t1cCAqLwotI2RlZmluZSBBMlRfUkVNT1RFCSA0CS8qIE9CU09MRVRFICovCi0jZGVmaW5lIEEyVF9MT0NBTAkgOAkvKiBkb24ndCB1c2UgQU5TICovCi0KLS8qIGF0bV9lcXVhbCBmbGFncyAqLwotI2RlZmluZSBBWEVfV0lMRENBUkQJIDEJLyogYWxsb3cgd2lsZGNhcmQgbWF0Y2ggKi8KLSNkZWZpbmUgQVhFX1BSVk9QVAkgMgkvKiBwcml2YXRlIHBhcnQgb2YgU1ZDIGFkZHJlc3MgaXMgb3B0aW9uYWwgKi8KLQotLyogdGV4dDJxb3MgZmxhZ3MgKi8KLSNkZWZpbmUgVDJRX0RFRkFVTFRTCSAxCS8qIHN0cnVjdHVyZSBjb250YWlucyBkZWZhdWx0IHZhbHVlcyAqLwotCi0vKiB0ZXh0MnNhcCBmbGFncyAqLwotI2RlZmluZSBUMlNfTkFNRQkgMQkvKiBhdHRlbXB0IG5hbWUgbG9va3VwICovCi0jZGVmaW5lIFQyU19MT0NBTAkgMgkvKiB3ZSBtYXkgc3VwcG9ydCBOSVMgb3Igc3VjaCBpbiB0aGUgZnV0dXJlICovCi0KLS8qIHNhcDJ0ZXh0IGZsYWdzICovCi0jZGVmaW5lIFMyVF9OQU1FCSAxCS8qIGF0dGVtcHQgbmFtZSBsb29rdXAgKi8KLSNkZWZpbmUgUzJUX0xPQ0FMCSAyCS8qIHdlIG1heSBzdXBwb3J0IE5JUyBvciBzdWNoIGluIHRoZSBmdXR1cmUgKi8KLQotLyogc2FwX2VxdWFsIGZsYWdzICovCi0jZGVmaW5lIFNYRV9DT01QQVRJQkxFCSAxCS8qIGNoZWNrIGZvciBjb21wYXRpYmlsaXR5IGluc3RlYWQgb2YgaWRlbnRpdHkqLwotI2RlZmluZSBTWEVfTkVHT1RJQVRJT04JIDIJLyogYWxsb3cgbmVnb3RpYXRpb247IHJlcXVpcmVzIFNYRV9DT01QQVRJQkxFOwotCQkJCSAgIGFzc3VtZXMgImEiIGRlZmluZXMgdGhlIGF2YWlsYWJsZQotCQkJCSAgIGNhcGFiaWxpdGllcyAqLwotI2RlZmluZSBTWEVfUkVTVUxUCSA0CS8qIHJldHVybiBzZWxlY3RlZCBTQVAgKi8KLQotI2RlZmluZSBNQVhfQVRNX0FERFJfTEVOICgyKkFUTV9FU0FfTEVOK0FUTV9FMTY0X0xFTis1KQotCQkJCS8qIDQgZG90cywgMSBwbHVzICovCi0jZGVmaW5lIE1BWF9BVE1fTkFNRV9MRU4gMjU2CS8qIHdpbGQgZ3Vlc3MgKi8KLSNkZWZpbmUgTUFYX0FUTV9RT1NfTEVOIDExNgkvKiA1KzQrMiooMyszKig3KzkpKzIpKzEgKi8KLSNkZWZpbmUgTUFYX0FUTV9TQVBfTEVOCTI1NQkvKiBCSExJKDI3KSsxKzMqQkxMSShMMj0zMyxMMz00MSwrMSkrMiAqLwotCi0KLWludCB0ZXh0MmF0bShjb25zdCBjaGFyICp0ZXh0LHN0cnVjdCBzb2NrYWRkciAqYWRkcixpbnQgbGVuZ3RoLGludCBmbGFncyk7Ci1pbnQgYXRtMnRleHQoY2hhciAqYnVmZmVyLGludCBsZW5ndGgsY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLGludCBmbGFncyk7Ci1pbnQgYXRtX2VxdWFsKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYSxjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmIsaW50IGxlbiwKLSAgaW50IGZsYWdzKTsKLQotaW50IHNkdTJjZWxsKGludCBzLGludCBzaXplcyxjb25zdCBpbnQgKnNkdV9zaXplLGludCAqbnVtX3NkdSk7Ci0KLWludCB0ZXh0MnFvcyhjb25zdCBjaGFyICp0ZXh0LHN0cnVjdCBhdG1fcW9zICpxb3MsaW50IGZsYWdzKTsKLWludCBxb3MydGV4dChjaGFyICpidWZmZXIsaW50IGxlbmd0aCxjb25zdCBzdHJ1Y3QgYXRtX3FvcyAqcW9zLGludCBmbGFncyk7Ci1pbnQgcW9zX2VxdWFsKGNvbnN0IHN0cnVjdCBhdG1fcW9zICphLGNvbnN0IHN0cnVjdCBhdG1fcW9zICpiKTsKLQotaW50IHRleHQyc2FwKGNvbnN0IGNoYXIgKnRleHQsc3RydWN0IGF0bV9zYXAgKnNhcCxpbnQgZmxhZ3MpOwotaW50IHNhcDJ0ZXh0KGNoYXIgKmJ1ZmZlcixpbnQgbGVuZ3RoLGNvbnN0IHN0cnVjdCBhdG1fc2FwICpzYXAsaW50IGZsYWdzKTsKLWludCBzYXBfZXF1YWwoY29uc3Qgc3RydWN0IGF0bV9zYXAgKmEsY29uc3Qgc3RydWN0IGF0bV9zYXAgKmIsaW50IGZsYWdzLC4uLik7Ci0KLWludCBfX3QycV9nZXRfcmF0ZShjb25zdCBjaGFyICoqdGV4dCxpbnQgdXApOwotaW50IF9fYXRtbGliX2ZldGNoKGNvbnN0IGNoYXIgKipwb3MsLi4uKTsgLyogaW50ZXJuYWwgdXNlIG9ubHkgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9wcHBkL3BsdWdpbnMvcHBwb2F0bS9hdG1yZXMuaCBiL3BwcGQvcGx1Z2lucy9wcHBvYXRtL2F0bXJlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWIzYjhjLi4wMDAwMDAwCi0tLSBhL3BwcGQvcGx1Z2lucy9wcHBvYXRtL2F0bXJlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyogYXRtcmVzLmggLSBDb21tb24gZGVmaW5pdGlvbnMgYW5kIHByb3RvdHlwZXMgZm9yIHJlc29sdmVyIGZ1bmN0aW9ucyAqLwotCi0vKiBXcml0dGVuIDE5OTYsMTk5OCBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIEVQRkwtTFJDL0lDQSAqLwotCi0KLSNpZm5kZWYgX0FUTVJFU19ICi0jZGVmaW5lIF9BVE1SRVNfSAotCi0jaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+Ci0jaW5jbHVkZSA8bGludXgvYXRtLmg+Ci0KLQotLyogU29tZSAjZGVmaW5lcyB0aGF0IG1heSBiZSBuZWVkZWQgaWYgQU5TIGlzbid0IGluc3RhbGxlZCBvbiB0aGF0IHN5c3RlbSAqLwotCi0jaWZuZGVmIFRfQVRNQQotI2RlZmluZSBUX0FUTUEJCTM0Ci0jZW5kaWYKLSNpZm5kZWYgQVRNQV9BRVNBCi0jZGVmaW5lIEFUTUFfQUVTQQkwCi0jZW5kaWYKLSNpZm5kZWYgQVRNQV9FMTY0Ci0jZGVmaW5lIEFUTUFfRTE2NAkxCi0jZW5kaWYKLQotLyogUmV0dXJuIGNvZGVzIGZvciB0ZXh0MmF0bSBhbmQgYXRtMnRleHQgKi8KLQotI2RlZmluZSBUUllfT1RIRVIgLTIKLSNkZWZpbmUgRkFUQUwJICAtMSAvKiBtdXN0IGJlIC0xICovCi0KLQotaW50IGFuc19ieW5hbWUoY29uc3QgY2hhciAqdGV4dCxzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjICphZGRyLGludCBsZW5ndGgsCi0gIGludCBmbGFncyk7Ci1pbnQgYW5zX2J5YWRkcihjaGFyICpidWZmZXIsaW50IGxlbmd0aCxjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjICphZGRyLAotICBpbnQgZmxhZ3MpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3BwcGQvcGx1Z2lucy9wcHBvYXRtL2F0bXNhcC5oIGIvcHBwZC9wbHVnaW5zL3BwcG9hdG0vYXRtc2FwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYTBjOGUuLjAwMDAwMDAKLS0tIGEvcHBwZC9wbHVnaW5zL3BwcG9hdG0vYXRtc2FwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKiBhdG1zYXAuaCAtIEFUTSBTZXJ2aWNlIEFjY2VzcyBQb2ludCBhZGRyZXNzaW5nIGRlZmluaXRpb25zICovCi0KLS8qIFdyaXR0ZW4gMTk5Ni0xOTk4IGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgRVBGTCBMUkMvSUNBICovCi0KLQotI2lmbmRlZiBfQVRNU0FQX0gKLSNkZWZpbmUgX0FUTVNBUF9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxsaW51eC9hdG1zYXAuaD4KLQotCi0vKgotICogU2VsZWN0ZWQgSVNPL0lFQyBUUiA5NTc3IE5ldHdvcmsgTGF5ZXIgUHJvdG9jb2wgSWRlbnRpZmllcnMgKE5MUElEKQotICovCi0KLSNkZWZpbmUgTkxQSURfSUVFRTgwMl8xX1NOQVAJMHg4MAkvKiBJRUVFIDgwMi4xIFNOQVAgKi8KLQotLyoKLSAqIFNlbGVjdGVkIE9yZ2FuaXphdGlvbmFsbHkgVW5pcXVlIElkZW50aWZpZXJzIChPVUlzKQotICovCi0KLSNkZWZpbmUgQVRNX0ZPUlVNX09VSQkJIlx4MDBceEEwXHgzRSIJLyogQVRNIEZvcnVtICovCi0jZGVmaW5lIEVQRkxfT1VJCQkiXHgwMFx4NjBceEQ3IgkvKiBFUEYgTGF1c2FubmUsIENIICovCi0KLS8qCi0gKiBTZWxlY3RlZCB2ZW5kb3Itc3BlY2lmaWMgYXBwbGljYXRpb24gaWRlbnRpZmllcnMgKGZvciBCLUhMSSkuIFN1Y2ggYW4KLSAqIGlkZW50aWZpZXIgY29uc2lzdHMgb2YgdGhyZWUgYnl0ZXMgY29udGFpbmluZyB0aGUgT1VJLCBmb2xsb3dlZCBieSBmb3VyCi0gKiBieXRlcyBhc3NpZ25lZCBieSB0aGUgb3JnYW5pemF0aW9uIG93bmluZyB0aGUgT1VJLgotICovCi0KLSNkZWZpbmUgQU5TX0hMVF9WU19JRAkJQVRNX0ZPUlVNX09VSSAiXHgwMFx4MDBceDAwXHgwMSIKLQkJCQkJIC8qIEFUTSBOYW1lIFN5c3RlbSwgYWYtc2FhLTAwNjkuMDAwICovCi0jZGVmaW5lIFZPRF9ITFRfVlNfSUQJCUFUTV9GT1JVTV9PVUkgIlx4MDBceDAwXHgwMFx4MDIiCi0JCQkJCQkgICAgIC8qIFZvRCwgYWYtc2FhLTAwNDkuMDAxICovCi0jZGVmaW5lIEFSRVFVSVBBX0hMVF9WU19JRAlFUEZMX09VSSAiXHgwMVx4MDBceDAwXHgwMSIJLyogQXJlcXVpcGEgICovCi0jZGVmaW5lIFRUQ1BfSExUX1ZTX0lECQlFUEZMX09VSSAiXHgwMVx4MDBceDAwXHgwMyIJLyogdHRjcF9hdG0gKi8KLQotCi0vKiBNYXBwaW5nIG9mICJ3ZWxsLWtub3duIiBUQ1AsIFVEUCwgZXRjLiBwb3J0IG51bWJlcnMgdG8gQVRNIEJITElzLgotICAgYnRkLXNhYS1hcGktYmhsaS0wMS4wMiAqLwotCi12b2lkIGF0bV90Y3BpcF9wb3J0X21hcHBpbmcoY2hhciAqdnNfaWQsdWludDhfdCBwcm90b2NvbCx1aW50MTZfdCBwb3J0KTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9wcHBkL3BsdWdpbnMvcHBwb2F0bS9taXNjLmMgYi9wcHBkL3BsdWdpbnMvcHBwb2F0bS9taXNjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNjk3NWYuLjAwMDAwMDAKLS0tIGEvcHBwZC9wbHVnaW5zL3BwcG9hdG0vbWlzYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyogbWlzYy5jIC0gTWlzY2VsbGFuZW91cyBsaWJyYXJ5IGZ1bmN0aW9ucyAqLwotCi0vKiBXcml0dGVuIDE5OTctMjAwMCBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIEVQRkwtSUNBL0lDQSAqLwotCi0jaWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPiAvKiBmb3IgaHRvbnMgKi8KLQotI2luY2x1ZGUgPGF0bS5oPgotI2luY2x1ZGUgPGF0bXNhcC5oPgotCi0KLWludCBfX2F0bWxpYl9mZXRjaChjb25zdCBjaGFyICoqcG9zLC4uLikKLXsKLSAgICBjb25zdCBjaGFyICp2YWx1ZTsKLSAgICBpbnQgcmVmX2xlbixiZXN0X2xlbixsZW47Ci0gICAgaW50IGksYmVzdDsKLSAgICB2YV9saXN0IGFwOwotCi0gICAgdmFfc3RhcnQoYXAscG9zKTsKLSAgICByZWZfbGVuID0gc3RybGVuKCpwb3MpOwotICAgIGJlc3RfbGVuID0gMDsKLSAgICBiZXN0ID0gLTE7Ci0gICAgZm9yIChpID0gMDsgKHZhbHVlID0gdmFfYXJnKGFwLGNvbnN0IGNoYXIgKikpOyBpKyspIHsKLQlsZW4gPSBzdHJsZW4odmFsdWUpOwotCWlmICgqdmFsdWUgIT0gJyEnICYmIGxlbiA8PSByZWZfbGVuICYmIGxlbiA+IGJlc3RfbGVuICYmCi0JICAhc3RybmNhc2VjbXAoKnBvcyx2YWx1ZSxsZW4pKSB7Ci0JICAgIGJlc3QgPSBpOwotCSAgICBiZXN0X2xlbiA9IGxlbjsKLQl9Ci0gICAgfQotICAgIHZhX2VuZChhcCk7Ci0gICAgaWYgKGJlc3QgPiAtMSkgKCpwb3MpICs9IGJlc3RfbGVuOwotICAgIHJldHVybiBiZXN0OwotfQotCi0KLXZvaWQgYXRtX3RjcGlwX3BvcnRfbWFwcGluZyhjaGFyICp2c19pZCx1aW50OF90IHByb3RvY29sLHVpbnQxNl90IHBvcnQpCi17Ci0gICAgbWVtY3B5KHZzX2lkLEFUTV9GT1JVTV9PVUkgIlx4MDEiLDQpOwotICAgIHZzX2lkWzRdID0gcHJvdG9jb2w7IC8qIGUuZy4gSVBfVENQIG9yIElQX1VEUDsgZnJvbSBuZXRpbmV0L3Byb3RvY29scy5oICovCi0gICAgdnNfaWRbNV0gPSAoaHRvbnMocG9ydCkgPj4gOCkgJiAyNTU7Ci0gICAgdnNfaWRbNl0gPSBodG9ucyhwb3J0KSAmIDI1NTsKLX0KZGlmZiAtLWdpdCBhL3BwcGQvcGx1Z2lucy9wcHBvYXRtL3BwcG9hdG0uYyBiL3BwcGQvcGx1Z2lucy9wcHBvYXRtL3BwcG9hdG0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY5MzM1MC4uMDAwMDAwMAotLS0gYS9wcHBkL3BsdWdpbnMvcHBwb2F0bS9wcHBvYXRtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyogcHBwb2F0bS5jIC0gcHBwZCBwbHVnaW4gdG8gaW1wbGVtZW50IFBQUG9BVE0gcHJvdG9jb2wuCi0gKgotICogQ29weXJpZ2h0IDIwMDAgTWl0Y2hlbGwgQmxhbmsgSnIuCi0gKiBCYXNlZCBpbiBwYXJ0IG9uIHdvcmsgZnJvbSBKZW5zIEF4Ym9lIGFuZCBQYXVsIE1hY2tlcnJhcy4KLSAqIFVwZGF0ZWQgdG8gcHBwLTIuNC4xIGJ5IEJlcm5oYXJkIEthaW5kbAotICoKLSAqIFVwZGF0ZWQgdG8gcHBwLTIuNC4yIGJ5IERhdmlkIFdvb2Rob3VzZSAyMDA0LgotICogIC0gZGlzY29ubmVjdCBtZXRob2QgYWRkZWQKLSAqICAtIHJlbW92ZV9vcHRpb25zKCkgYWJ1c2UgcmVtb3ZlZC4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgInBwcGQuaCIKLSNpbmNsdWRlICJwYXRobmFtZXMuaCIKLSNpbmNsdWRlICJmc20uaCIgLyogTmVlZGVkIGZvciBsY3AuaCB0byBpbmNsdWRlIGNsZWFubHkgKi8KLSNpbmNsdWRlICJsY3AuaCIKLSNpbmNsdWRlIDxhdG0uaD4KLSNpbmNsdWRlIDxsaW51eC9hdG1kZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9hdG1wcHAuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPG5ldC9pZi5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotCi1jb25zdCBjaGFyIHBwcGRfdmVyc2lvbltdID0gVkVSU0lPTjsKLQotc3RhdGljIHN0cnVjdCBzb2NrYWRkcl9hdG1wdmMgcHZjYWRkcjsKLXN0YXRpYyBjaGFyICpxb3NzdHIgPSBOVUxMOwotc3RhdGljIGJvb2wgbGxjX2VuY2FwcyA9IDA7Ci1zdGF0aWMgYm9vbCB2Y19lbmNhcHMgPSAwOwotc3RhdGljIGludCBkZXZpY2VfZ290X3NldCA9IDA7Ci1zdGF0aWMgaW50IHBwcG9hdG1fbWF4X210dSwgcHBwb2F0bV9tYXhfbXJ1Owotc3RhdGljIGludCBzZXRkZXZuYW1lX3BwcG9hdG0oY29uc3QgY2hhciAqY3AsIGNvbnN0IGNoYXIgKiphcmd2LCBpbnQgZG9pdCk7Ci1zdHJ1Y3QgY2hhbm5lbCBwcHBvYV9jaGFubmVsOwotc3RhdGljIGludCBwcHBvYV9mZCA9IC0xOwotCi1zdGF0aWMgb3B0aW9uX3QgcHBwb2Ffb3B0aW9uc1tdID0gewotCXsgImRldmljZSBuYW1lIiwgb193aWxkLCAodm9pZCAqKSAmc2V0ZGV2bmFtZV9wcHBvYXRtLAotCSAgIkFUTSBzZXJ2aWNlIHByb3ZpZGVyIElEczogVlBJLlZDSSIsCi0JICBPUFRfREVWTkFNIHwgT1BUX1BSSVZGSVggfCBPUFRfTk9BUkcgIHwgT1BUX0EyU1RSVkFMIHwgT1BUX1NUQVRJQywKLQkgIGRldm5hbX0sCi0JeyAibGxjLWVuY2FwcyIsIG9fYm9vbCwgJmxsY19lbmNhcHMsCi0JICAidXNlIExMQyBlbmNhcHN1bGF0aW9uIGZvciBQUFBvQVRNIiwgMX0sCi0JeyAidmMtZW5jYXBzIiwgb19ib29sLCAmdmNfZW5jYXBzLAotCSAgInVzZSBWQyBtdWx0aXBsZXhpbmcgZm9yIFBQUG9BVE0gKGRlZmF1bHQpIiwgMX0sCi0JeyAicW9zIiwgb19zdHJpbmcsICZxb3NzdHIsCi0JICAic2V0IFFvUyBmb3IgUFBQb0FUTSBjb25uZWN0aW9uIiwgMX0sCi0JeyBOVUxMIH0KLX07Ci0KLS8qIHJldHVybnM6Ci0gKiAgLTEgaWYgdGhlcmUncyBhIHByb2JsZW0gd2l0aCBzZXR0aW5nIHRoZSBkZXZpY2UKLSAqICAgMCBpZiB3ZSBjYW4ndCBwYXJzZSAiY3AiIGFzIGEgdmFsaWQgbmFtZSBvZiBhIGRldmljZQotICogICAxIGlmICJjcCIgaXMgYSByZWFzb25hYmxlIHRoaW5nIHRvIG5hbWUgYSBkZXZpY2UKLSAqIE5vdGUgdGhhdCB3ZSBkb24ndCBhY3R1YWxseSBvcGVuIHRoZSBkZXZpY2UgYXQgdGhpcyBwb2ludAotICogV2UgZG8gbmVlZCB0byBmaWxsIGluOgotICogICBkZXZuYW06IGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkZXZpY2UKLSAqICAgZGV2c3RhdDogYSBzdGF0IHN0cnVjdHVyZSBvZiB0aGUgZGV2aWNlLiAgSW4gdGhpcyBjYXNlCi0gKiAgICAgd2UncmUgbm90IG9wZW5pbmcgYSBkZXZpY2UsIHNvIHdlIGp1c3QgbWFrZSBzdXJlCi0gKiAgICAgdG8gc2V0IHVwIFNfSVNDSFIoZGV2c3RhdC5zdF9tb2RlKSAhPSAxLCBzbyB3ZQotICogICAgIGRvbid0IGdldCBjb25mdXNlZCB0aGF0IHdlJ3JlIG9uIHN0ZGluLgotICovCi1pbnQgKCpvbGRfc2V0ZGV2bmFtZV9ob29rKShjb25zdCBjaGFyKiBjcCkgPSBOVUxMOwotc3RhdGljIGludCBzZXRkZXZuYW1lX3BwcG9hdG0oY29uc3QgY2hhciAqY3AsIGNvbnN0IGNoYXIgKiphcmd2LCBpbnQgZG9pdCkKLXsKLQlzdHJ1Y3Qgc29ja2FkZHJfYXRtcHZjIGFkZHI7Ci0JZXh0ZXJuIHN0cnVjdCBzdGF0IGRldnN0YXQ7Ci0JaWYgKGRldmljZV9nb3Rfc2V0KQotCQlyZXR1cm4gMDsKLQkvL2luZm8oIlBQUG9BVE0gc2V0ZGV2bmFtZV9wcHBvYXRtOiAnJXMnIiwgY3ApOwotCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mIGFkZHIpOwotCWlmICh0ZXh0MmF0bShjcCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpLAotCSAgICBUMkFfUFZDIHwgVDJBX05BTUUpIDwgMCkgewotICAgICAgICAgICAgICAgaWYoZG9pdCkKLSAgICAgICAgICAgICAgICAgICBpbmZvKCJhdG0gZG9lcyBub3QgcmVjb2duaXplOiAlcyIsIGNwKTsKLQkJcmV0dXJuIDA7Ci0gICAgICAgICAgIH0KLQlpZiAoIWRvaXQpIHJldHVybiAxOwotCS8vaWYgKCFkZXZfc2V0X29rKCkpIHJldHVybiAtMTsKLQltZW1jcHkoJnB2Y2FkZHIsICZhZGRyLCBzaXplb2YgcHZjYWRkcik7Ci0Jc3RybGNweShkZXZuYW0sIGNwLCBzaXplb2YgZGV2bmFtKTsKLQlkZXZzdGF0LnN0X21vZGUgPSBTX0lGU09DSzsKLQlpZiAodGhlX2NoYW5uZWwgIT0gJnBwcG9hX2NoYW5uZWwpIHsKLQkJdGhlX2NoYW5uZWwgPSAmcHBwb2FfY2hhbm5lbDsKLQkJbGNwX3dhbnRvcHRpb25zWzBdLm5lZ19hY2NvbXByZXNzaW9uID0gMDsKLQkJbGNwX2FsbG93b3B0aW9uc1swXS5uZWdfYWNjb21wcmVzc2lvbiA9IDA7Ci0JCWxjcF93YW50b3B0aW9uc1swXS5uZWdfYXN5bmNtYXAgPSAwOwotCQlsY3BfYWxsb3dvcHRpb25zWzBdLm5lZ19hc3luY21hcCA9IDA7Ci0JCWxjcF93YW50b3B0aW9uc1swXS5uZWdfcGNvbXByZXNzaW9uID0gMDsKLQl9Ci0JaW5mbygiUFBQb0FUTSBzZXRkZXZuYW1lX3BwcG9hdG0gLSBTVUNDRVNTOiVzIiwgY3ApOwotCWRldmljZV9nb3Rfc2V0ID0gMTsKLQlyZXR1cm4gMTsKLX0KLQotI2RlZmluZSBwcHBvYXRtX292ZXJoZWFkKCkgKGxsY19lbmNhcHMgPyA2IDogMikKLQotc3RhdGljIHZvaWQgbm9fZGV2aWNlX2dpdmVuX3BwcG9hdG0odm9pZCkKLXsKLQlmYXRhbCgiTm8gdnBpLnZjaSBzcGVjaWZpZWQiKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0X2xpbmVfZGlzY2lwbGluZV9wcHBvYXRtKGludCBmZCkKLXsKLQlzdHJ1Y3QgYXRtX2JhY2tlbmRfcHBwIGJlOwotCWJlLmJhY2tlbmRfbnVtID0gQVRNX0JBQ0tFTkRfUFBQOwotCWlmICghbGxjX2VuY2FwcykKLQkJYmUuZW5jYXBzID0gUFBQT0FUTV9FTkNBUFNfVkM7Ci0JZWxzZSBpZiAoIXZjX2VuY2FwcykKLQkJYmUuZW5jYXBzID0gUFBQT0FUTV9FTkNBUFNfTExDOwotCWVsc2UKLQkJYmUuZW5jYXBzID0gUFBQT0FUTV9FTkNBUFNfQVVUT0RFVEVDVDsKLQlpZiAoaW9jdGwoZmQsIEFUTV9TRVRCQUNLRU5ELCAmYmUpIDwgMCkKLQkJZmF0YWwoImlvY3RsKEFUTV9TRVRCQUNLRU5EKTogJW0iKTsKLX0KLQotI2lmIDAKLXN0YXRpYyB2b2lkIHJlc2V0X2xpbmVfZGlzY2lwbGluZV9wcHBvYXRtKGludCBmZCkKLXsKLQlhdG1fYmFja2VuZF90IGJlID0gQVRNX0JBQ0tFTkRfUkFXOwotCS8qIDIuNCBkb2Vzbid0IHN1cHBvcnQgdGhpcyB5ZXQgKi8KLQkodm9pZCkgaW9jdGwoZmQsIEFUTV9TRVRCQUNLRU5ELCAmYmUpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgY29ubmVjdF9wcHBvYXRtKHZvaWQpCi17Ci0JaW50IGZkOwotCXN0cnVjdCBhdG1fcW9zIHFvczsKLQotCWlmICghZGV2aWNlX2dvdF9zZXQpCi0JCW5vX2RldmljZV9naXZlbl9wcHBvYXRtKCk7Ci0JZmQgPSBzb2NrZXQoQUZfQVRNUFZDLCBTT0NLX0RHUkFNLCAwKTsKLQlpZiAoZmQgPCAwKQotCQlmYXRhbCgiZmFpbGVkIHRvIGNyZWF0ZSBzb2NrZXQ6ICVtIik7Ci0JbWVtc2V0KCZxb3MsIDAsIHNpemVvZiBxb3MpOwotCXFvcy50eHRwLnRyYWZmaWNfY2xhc3MgPSBxb3Mucnh0cC50cmFmZmljX2NsYXNzID0gQVRNX1VCUjsKLQkvKiBUT0RPOiBzdXBwb3J0IHNpbXBsaWZpZWQgUW9TIHNldHRpbmcgKi8KLQlpZiAocW9zc3RyICE9IE5VTEwpCi0JCWlmICh0ZXh0MnFvcyhxb3NzdHIsICZxb3MsIDApKQotCQkJZmF0YWwoIkNhbid0IHBhcnNlIFFvUzogXCIlc1wiIik7Ci0JcW9zLnR4dHAubWF4X3NkdSA9IGxjcF9hbGxvd29wdGlvbnNbMF0ubXJ1ICsgcHBwb2F0bV9vdmVyaGVhZCgpOwotCXFvcy5yeHRwLm1heF9zZHUgPSBsY3Bfd2FudG9wdGlvbnNbMF0ubXJ1ICsgcHBwb2F0bV9vdmVyaGVhZCgpOwotCXFvcy5hYWwgPSBBVE1fQUFMNTsKLQlpZiAoc2V0c29ja29wdChmZCwgU09MX0FUTSwgU09fQVRNUU9TLCAmcW9zLCBzaXplb2YocW9zKSkgPCAwKQotCQlmYXRhbCgic2V0c29ja29wdChTT19BVE1RT1MpOiAlbSIpOwotCS8qIFRPRE86IGFjY2VwdCBvbiBTVkNzLi4uICovCi0JaWYgKGNvbm5lY3QoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnB2Y2FkZHIsCi0JICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfYXRtcHZjKSkpCi0JCWZhdGFsKCJjb25uZWN0KCVzKTogJW0iLCBkZXZuYW0pOwotCXBwcG9hdG1fbWF4X210dSA9IGxjcF9hbGxvd29wdGlvbnNbMF0ubXJ1OwotCXBwcG9hdG1fbWF4X21ydSA9IGxjcF93YW50b3B0aW9uc1swXS5tcnU7Ci0Jc2V0X2xpbmVfZGlzY2lwbGluZV9wcHBvYXRtKGZkKTsKLQlzdHJsY3B5KHBwcF9kZXZuYW0sIGRldm5hbSwgc2l6ZW9mKHBwcF9kZXZuYW0pKTsKLQlwcHBvYV9mZCA9IGZkOwotCXJldHVybiBmZDsKLX0KLQotc3RhdGljIHZvaWQgZGlzY29ubmVjdF9wcHBvYXRtKHZvaWQpCi17Ci0JY2xvc2UocHBwb2FfZmQpOwotfQotCi12b2lkIHBsdWdpbl9pbml0KHZvaWQpCi17Ci0jaWYgZGVmaW5lZChfX2xpbnV4X18pCi0JZXh0ZXJuIGludCBuZXdfc3R5bGVfZHJpdmVyOwkvKiBGcm9tIHN5cy1saW51eC5jICovCi0JaWYgKCFwcHBfYXZhaWxhYmxlKCkgJiYgIW5ld19zdHlsZV9kcml2ZXIpCi0JCWZhdGFsKCJLZXJuZWwgZG9lc24ndCBzdXBwb3J0IHBwcF9nZW5lcmljIC0gIgotCQkgICAgIm5lZWRlZCBmb3IgUFBQb0FUTSIpOwotI2Vsc2UKLQlmYXRhbCgiTm8gUFBQb0FUTSBzdXBwb3J0IG9uIHRoaXMgT1MiKTsKLSNlbmRpZgotCWluZm8oIlBQUG9BVE0gcGx1Z2luX2luaXQiKTsKLQlhZGRfb3B0aW9ucyhwcHBvYV9vcHRpb25zKTsKLX0KLXN0cnVjdCBjaGFubmVsIHBwcG9hX2NoYW5uZWwgPSB7Ci0gICAgb3B0aW9uczogcHBwb2Ffb3B0aW9ucywKLSAgICBwcm9jZXNzX2V4dHJhX29wdGlvbnM6IE5VTEwsCi0gICAgY2hlY2tfb3B0aW9uczogTlVMTCwKLSAgICBjb25uZWN0OiAmY29ubmVjdF9wcHBvYXRtLAotICAgIGRpc2Nvbm5lY3Q6ICZkaXNjb25uZWN0X3BwcG9hdG0sCi0gICAgZXN0YWJsaXNoX3BwcDogJmdlbmVyaWNfZXN0YWJsaXNoX3BwcCwKLSAgICBkaXNlc3RhYmxpc2hfcHBwOiAmZ2VuZXJpY19kaXNlc3RhYmxpc2hfcHBwLAotICAgIHNlbmRfY29uZmlnOiBOVUxMLAotICAgIHJlY3ZfY29uZmlnOiBOVUxMLAotICAgIGNsb3NlOiBOVUxMLAotICAgIGNsZWFudXA6IE5VTEwKLX07CmRpZmYgLS1naXQgYS9wcHBkL3BsdWdpbnMvcHBwb2F0bS90ZXh0MmF0bS5jIGIvcHBwZC9wbHVnaW5zL3BwcG9hdG0vdGV4dDJhdG0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI4M2I1Mi4uMDAwMDAwMAotLS0gYS9wcHBkL3BsdWdpbnMvcHBwb2F0bS90ZXh0MmF0bS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qIHRleHQyYXRtLmMgLSBDb252ZXJ0cyB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIEFUTSBhZGRyZXNzIHRvIGJpbmFyeQotCQllbmNvZGluZyAqLwotCi0vKiBXcml0dGVuIDE5OTUtMjAwMCBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIEVQRkwtTFJDL0lDQSAqLwotCi0jaWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0KLSNpbmNsdWRlICJhdG0uaCIKLSNpbmNsdWRlICJhdG1zYXAuaCIKLSNpbmNsdWRlICJhdG1yZXMuaCIKLQotCi1zdGF0aWMgaW50IHRyeV9wdmMoY29uc3QgY2hhciAqdGV4dCxzdHJ1Y3Qgc29ja2FkZHJfYXRtcHZjICphZGRyLGludCBmbGFncykKLXsKLSAgICBpbnQgcGFydFszXTsKLSAgICBpbnQgaTsKLQotICAgIHBhcnRbMF0gPSBwYXJ0WzFdID0gcGFydFsyXSA9IDA7Ci0gICAgaSA9IDA7Ci0gICAgd2hpbGUgKDEpIHsKLQlpZiAoISp0ZXh0KSByZXR1cm4gRkFUQUw7IC8qIGVtcHR5IG9yIGVuZHMgd2l0aCBhIGRvdCAqLwotCWlmIChpID09IDMpIHJldHVybiBUUllfT1RIRVI7IC8qIHRvbyBsb25nICovCi0JaWYgKGlzZGlnaXQoKnRleHQpKSB7Ci0JICAgIGlmICgqdGV4dCA9PSAnMCcgJiYgaXNkaWdpdCh0ZXh0WzFdKSkgcmV0dXJuIFRSWV9PVEhFUjsKLQkJLyogbm8gbGVhZGluZyB6ZXJvZXMgKi8KLQkgICAgZG8gewotCQlpZiAocGFydFtpXSA+IElOVF9NQVgvMTApIHJldHVybiBUUllfT1RIRVI7LyogbnVtYmVyIHRvbyBiaWcgKi8KLQkJcGFydFtpXSA9IHBhcnRbaV0qMTArKnRleHQrKy0nMCc7Ci0JICAgIH0KLQkgICAgd2hpbGUgKGlzZGlnaXQoKnRleHQpKTsKLQkgICAgaSsrOwotCSAgICBpZiAoISp0ZXh0KSBicmVhazsKLQkgICAgaWYgKCp0ZXh0KysgIT0gJy4nKSByZXR1cm4gVFJZX09USEVSOyAvKiBub24tUFZDIGNoYXJhY3RlciAqLwotCSAgICBjb250aW51ZTsKLQl9Ci0JaWYgKCp0ZXh0ID09ICcqJykgewotCSAgICBpZiAoIShmbGFncyAmIFQyQV9XSUxEQ0FSRCkpIHJldHVybiBGQVRBTDsgLyogbm90IGFsbG93ZWQgKi8KLQkgICAgcGFydFtpKytdID0gQVRNX0lURl9BTlk7IC8qIGFsbCAqX0FOWSBoYXZlIHRoZSBzYW1lIHZhbHVlICovCi0JfQotCWVsc2UgewotCSAgICBpZiAoKnRleHQgIT0gJz8nKSByZXR1cm4gVFJZX09USEVSOyAvKiBpbnZhbGlkIGNoYXJhY3RlciAqLwotCSAgICBpZiAoIShmbGFncyAmIFQyQV9VTlNQRUMpKSByZXR1cm4gRkFUQUw7IC8qIG5vdCBhbGxvd2VkICovCi0JICAgIHBhcnRbaSsrXSA9IEFUTV9WUElfVU5TUEVDOyAvKiBhbGwgKl9VTlNQRUMgaGF2ZSB0aGUgc2FtZQotCQkJCQkgICB2YWx1ZSAqLwotCX0KLQlpZiAoISorK3RleHQpIGJyZWFrOwotCWlmICgqdGV4dCsrICE9ICcuJykgcmV0dXJuIEZBVEFMOyAvKiBkb3QgcmVxdWlyZWQgKi8KLSAgICB9Ci0gICAgaWYgKGkgPCAyKSByZXR1cm4gVFJZX09USEVSOyAvKiBubyBkb3RzICovCi0gICAgaWYgKGkgPT0gMikgewotCXBhcnRbMl0gPSBwYXJ0WzFdOwotCXBhcnRbMV0gPSBwYXJ0WzBdOwotCXBhcnRbMF0gPSAwOyAvKiBkZWZhdWx0IGludGVyZmFjZSAqLwotICAgIH0KLSAgICBpZiAocGFydFswXSA+IFNIUlRfTUFYIHx8IHBhcnRbMl0gPiBBVE1fTUFYX1ZDSSkKLQlyZXR1cm4gVFJZX09USEVSOyAvKiB0b28gYmlnICovCi0gICAgaWYgKHBhcnRbMV0gPiAoZmxhZ3MgJiBUMkFfTk5JID8gQVRNX01BWF9WUElfTk5JIDogQVRNX01BWF9WUEkpKQotCXJldHVybiBUUllfT1RIRVI7IC8qIHRvbyBiaWcgKi8KLSAgICBpZiAocGFydFswXSA9PSBBVE1fVlBJX1VOU1BFQykgcmV0dXJuIEZBVEFMOyAvKiBiYWQgKi8KLSAgICBhZGRyLT5zYXBfZmFtaWx5ID0gQUZfQVRNUFZDOwotICAgIGFkZHItPnNhcF9hZGRyLml0ZiA9IHBhcnRbMF07Ci0gICAgYWRkci0+c2FwX2FkZHIudnBpID0gcGFydFsxXTsKLSAgICBhZGRyLT5zYXBfYWRkci52Y2kgPSBwYXJ0WzJdOwotICAgIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgZG9fdHJ5X25zYXAoY29uc3QgY2hhciAqdGV4dCxzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjICphZGRyLGludCBmbGFncykKLXsKLSAgICBjb25zdCBjaGFyICp3YWxrOwotICAgIGludCBjb3VudCxwb3MsZG90OwotICAgIGludCBvZmZzZXQsbGVuOwotICAgIGNoYXIgdmFsdWU7Ci0KLSAgICBjb3VudCA9IGRvdCA9IDA7Ci0gICAgZm9yICh3YWxrID0gdGV4dDsgKndhbGs7IHdhbGsrKykKLQlpZiAoaXNkaWdpdCgqd2FsaykpIHsKLQkgICAgaWYgKGNvdW50KysgPT0gMTUpIGJyZWFrOwotCSAgICBkb3QgPSAxOwotCX0KLQllbHNlIGlmICgqdGV4dCAhPSAnLicpIGJyZWFrOwotCSAgICBlbHNlIGlmICghZG90KSByZXR1cm4gRkFUQUw7IC8qIHR3byBkb3RzIGluIGEgcm93ICovCi0JCWVsc2UgZG90ID0gMDsKLSAgICBpZiAoKndhbGsgIT0gJzonKSB7Ci0JcG9zID0gMDsKLQlvZmZzZXQgPSAwOwotICAgIH0KLSAgICBlbHNlIHsKLQlpZiAoIWRvdCB8fCAqdGV4dCA9PSAnMCcpIHJldHVybiBGQVRBTDsKLQlhZGRyLT5zYXNfYWRkci5wcnZbMF0gPSBBVE1fQUZJX0UxNjQ7Ci0JYWRkci0+c2FzX2FkZHIucHJ2WzFdID0gMDsKLQltZW1zZXQoYWRkci0+c2FzX2FkZHIucHJ2KzEsMCw4KTsKLQlmb3IgKHBvcyA9IDE4LWNvdW50LTE7ICp0ZXh0OyB0ZXh0KyspIHsKLQkgICAgaWYgKCp0ZXh0ID09ICcuJykgY29udGludWU7Ci0JICAgIGlmICgqdGV4dCA9PSAnOicpIGJyZWFrOwotCSAgICBlbHNlIHsKLQkJaWYgKHBvcyAmIDEpIGFkZHItPnNhc19hZGRyLnBydltwb3MgPj4gMV0gfD0gKnRleHQtJzAnOwotCQllbHNlIGFkZHItPnNhc19hZGRyLnBydltwb3MgPj4gMV0gPSAoKnRleHQtJzAnKSA8PCA0OwotCQlwb3MrKzsKLQkgICAgfQotIAl9Ci0JYWRkci0+c2FzX2FkZHIucHJ2WzhdIHw9IDB4ZjsKLQl0ZXh0Kys7Ci0JcG9zKys7Ci0Jb2Zmc2V0ID0gNzI7Ci0gICAgfQotICAgIGZvciAoZG90ID0gMDsgKnRleHQ7IHRleHQrKykKLQlpZiAoaXN4ZGlnaXQoKnRleHQpKSB7Ci0JICAgIGlmIChwb3MgPT0gQVRNX0VTQV9MRU4qMikgcmV0dXJuIFRSWV9PVEhFUjsgLyogdG9vIGxvbmcgKi8KLQkgICAgdmFsdWUgPSBpc2RpZ2l0KCp0ZXh0KSA/ICp0ZXh0LScwJyA6IChpc2xvd2VyKCp0ZXh0KSA/Ci0JICAgICAgdG91cHBlcigqdGV4dCkgOiAqdGV4dCktJ0EnKzEwOwotCSAgICBpZiAocG9zICYgMSkgYWRkci0+c2FzX2FkZHIucHJ2W3BvcyA+PiAxXSB8PSB2YWx1ZTsKLQkgICAgZWxzZSBhZGRyLT5zYXNfYWRkci5wcnZbcG9zID4+IDFdID0gdmFsdWUgPDwgNDsKLQkgICAgcG9zKys7Ci0JICAgIGRvdCA9IDE7Ci0JfQotCWVsc2UgCi0JICAgIGlmICgqdGV4dCA9PSAnLycgJiYgKGZsYWdzICYgVDJBX1dJTERDQVJEKSkgYnJlYWs7Ci0JICAgIGVsc2UgaWYgKCp0ZXh0ICE9ICcuJykgcmV0dXJuIFRSWV9PVEhFUjsKLQkJZWxzZSB7Ci0JCSAgICBpZiAoIWRvdCkgcmV0dXJuIEZBVEFMOyAvKiB0d28gZG90cyBpbiBhIHJvdyAqLwotCQkgICAgZG90ID0gMDsKLQkJfQotICAgIGlmICghZG90KSByZXR1cm4gRkFUQUw7Ci0gICAgaWYgKHBvcyA+IDEgJiYgISphZGRyLT5zYXNfYWRkci5wcnYpCi0JcmV0dXJuIFRSWV9PVEhFUjsgLyogbm8gbGVhZGluZyB6ZXJvZXMgKi8KLSAgICBpZiAoISp0ZXh0KQotCXJldHVybiBwb3MgIT0gQVRNX0VTQV9MRU4qMiA/IFRSWV9PVEhFUiA6IEFUTV9FU0FfTEVOKjI7Ci0JICAvKiBoYW5kbGUgYmFkIGxlbmd0aCAqLwotICAgIGxlbiA9IDA7Ci0gICAgd2hpbGUgKCorK3RleHQpIHsKLQlpZiAoIWlzZGlnaXQoKnRleHQpKSByZXR1cm4gLTE7IC8qIG5vbi1kaWdpdCBpbiBsZW5ndGggKi8KLQlpZiAobGVuID49IHBvcyo0KSByZXR1cm4gLTE7IC8qIHRvbyBsb25nICovCi0JbGVuID0gbGVuKjEwKyp0ZXh0LScwJzsKLSAgICB9Ci0gICAgaWYgKGxlbiA+IDcgJiYgYWRkci0+c2FzX2FkZHIucHJ2WzBdICE9IEFUTV9BRklfRTE2NCkgb2Zmc2V0ID0gNzI7Ci0gICAgaWYgKGxlbiA8IG9mZnNldCkgcmV0dXJuIEZBVEFMOwotICAgIHJldHVybiBsZW4gPiBwb3MqNCA/IFRSWV9PVEhFUiA6IGxlbjsKLX0KLQotCi1zdGF0aWMgaW50IHRyeV9uc2FwKGNvbnN0IGNoYXIgKnRleHQsc3RydWN0IHNvY2thZGRyX2F0bXN2YyAqYWRkcixpbnQgZmxhZ3MpCi17Ci0gICAgaW50IHJlc3VsdDsKLQotICAgIHJlc3VsdCA9IGRvX3RyeV9uc2FwKHRleHQsYWRkcixmbGFncyk7Ci0gICAgaWYgKHJlc3VsdCA8IDApIHJldHVybiByZXN1bHQ7Ci0gICAgYWRkci0+c2FzX2ZhbWlseSA9IEFGX0FUTVNWQzsKLSAgICAqYWRkci0+c2FzX2FkZHIucHViID0gMDsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0KLXN0YXRpYyBpbnQgdHJ5X2UxNjQoY29uc3QgY2hhciAqdGV4dCxzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjICphZGRyLGludCBmbGFncykKLXsKLSAgICBpbnQgaSxkb3QscmVzdWx0OwotCi0gICAgaWYgKCp0ZXh0ID09ICc6JyB8fCAqdGV4dCA9PSAnKycpIHRleHQrKzsKLSAgICBmb3IgKGkgPSBkb3QgPSAwOyAqdGV4dDsgdGV4dCsrKQotCWlmIChpc2RpZ2l0KCp0ZXh0KSkgewotCSAgICBpZiAoaSA9PSBBVE1fRTE2NF9MRU4pIHJldHVybiBUUllfT1RIRVI7IC8qIHRvbyBsb25nICovCi0JICAgIGFkZHItPnNhc19hZGRyLnB1YltpKytdID0gKnRleHQ7Ci0JICAgIGRvdCA9IDE7Ci0JfQotCWVsc2UgaWYgKCp0ZXh0ICE9ICcuJykgYnJlYWs7Ci0JICAgIGVsc2UgewotCQlpZiAoIWRvdCkgcmV0dXJuIFRSWV9PVEhFUjsgLyogdHdvIGRvdHMgaW4gYSByb3cgKi8KLQkJZG90ID0gMDsKLQkgICAgfQotICAgIGlmICghZG90KSByZXR1cm4gVFJZX09USEVSOwotICAgIGFkZHItPnNhc19hZGRyLnB1YltpXSA9IDA7Ci0gICAgKmFkZHItPnNhc19hZGRyLnBydiA9IDA7Ci0gICAgcmVzdWx0ID0gMDsKLSAgICBpZiAoKnRleHQpIHsKLQlpZiAoKnRleHQrKyAhPSAnKycpIHJldHVybiBUUllfT1RIRVI7Ci0JZWxzZSB7Ci0JICAgIHJlc3VsdCA9IGRvX3RyeV9uc2FwKHRleHQsYWRkcixmbGFncyk7Ci0JICAgIGlmIChyZXN1bHQgPCAwKSByZXR1cm4gRkFUQUw7Ci0JfQotICAgIH0KLSAgICBhZGRyLT5zYXNfZmFtaWx5ID0gQUZfQVRNU1ZDOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotc3RhdGljIGludCBzZWFyY2goRklMRSAqZmlsZSxjb25zdCBjaGFyICp0ZXh0LHN0cnVjdCBzb2NrYWRkciAqYWRkcixpbnQgbGVuZ3RoLAotICBpbnQgZmxhZ3MpCi17Ci0gICAgY2hhciBsaW5lW01BWF9BVE1fTkFNRV9MRU4rMV07Ci0gICAgY29uc3QgY2hhciAqaGVyZTsKLSAgICBpbnQgcmVzdWx0OwotCi0gICAgd2hpbGUgKGZnZXRzKGxpbmUsTUFYX0FUTV9OQU1FX0xFTixmaWxlKSkgewotCWlmICghc3RydG9rKGxpbmUsIlx0XG4gIikpIGNvbnRpbnVlOwotCXdoaWxlICgoaGVyZSA9IHN0cnRvayhOVUxMLCJcdFxuICIpKSkKLQkgICAgaWYgKCFzdHJjYXNlY21wKGhlcmUsdGV4dCkpIHsKLQkJaGVyZSA9IHN0cnRvayhsaW5lLCJcdFxuICIpOwotCQlyZXN1bHQgPSB0ZXh0MmF0bShoZXJlLGFkZHIsbGVuZ3RoLGZsYWdzKTsKLQkJaWYgKHJlc3VsdCA+PSAwKSByZXR1cm4gcmVzdWx0OwotCSAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUllfT1RIRVI7Ci19Ci0KLQotc3RhdGljIGludCB0cnlfbmFtZShjb25zdCBjaGFyICp0ZXh0LHN0cnVjdCBzb2NrYWRkciAqYWRkcixpbnQgbGVuZ3RoLAotICBpbnQgZmxhZ3MpCi17Ci0gICAgRklMRSAqZmlsZTsKLSAgICBpbnQgcmVzdWx0OwotCi0gICAgaWYgKCEoZmlsZSA9IGZvcGVuKEhPU1RTX0FUTSwiciIpKSkgcmV0dXJuIFRSWV9PVEhFUjsKLSAgICByZXN1bHQgPSBzZWFyY2goZmlsZSx0ZXh0LGFkZHIsbGVuZ3RoLGZsYWdzKTsKLSAgICAodm9pZCkgZmNsb3NlKGZpbGUpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotaW50IHRleHQyYXRtKGNvbnN0IGNoYXIgKnRleHQsc3RydWN0IHNvY2thZGRyICphZGRyLGludCBsZW5ndGgsaW50IGZsYWdzKQotewotICAgIGludCByZXN1bHQ7Ci0KLSAgICBpZiAoISp0ZXh0KSByZXR1cm4gLTE7Ci0gICAgaWYgKCEoZmxhZ3MgJiAoVDJBX1BWQyB8IFQyQV9TVkMpKSkgZmxhZ3MgfD0gVDJBX1BWQyB8IFQyQV9TVkM7Ci0gICAgaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfYXRtcHZjKSkgcmV0dXJuIC0xOwotICAgIGlmIChmbGFncyAmIFQyQV9QVkMpIHsKLQlyZXN1bHQgPSB0cnlfcHZjKHRleHQsKHN0cnVjdCBzb2NrYWRkcl9hdG1wdmMgKikgYWRkcixmbGFncyk7Ci0JaWYgKHJlc3VsdCAhPSBUUllfT1RIRVIpIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGlmICgoZmxhZ3MgJiBUMkFfU1ZDKSAmJiBsZW5ndGggPj0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9hdG1zdmMpKSB7Ci0JcmVzdWx0ID0gdHJ5X25zYXAodGV4dCwoc3RydWN0IHNvY2thZGRyX2F0bXN2YyAqKSBhZGRyLGZsYWdzKTsKLQlpZiAocmVzdWx0ICE9IFRSWV9PVEhFUikgcmV0dXJuIHJlc3VsdDsKLQlyZXN1bHQgPSB0cnlfZTE2NCh0ZXh0LChzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjICopIGFkZHIsZmxhZ3MpOwotCWlmIChyZXN1bHQgIT0gVFJZX09USEVSKSByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBpZiAoIShmbGFncyAmIFQyQV9OQU1FKSkgcmV0dXJuIC0xOwotICAgIHJlc3VsdCA9IHRyeV9uYW1lKHRleHQsYWRkcixsZW5ndGgsZmxhZ3MgJiB+VDJBX05BTUUpOwotICAgIGlmIChyZXN1bHQgPT0gVFJZX09USEVSICYmICEoZmxhZ3MgJiBUMkFfTE9DQUwpKQotCXJlc3VsdCA9IGFuc19ieW5hbWUodGV4dCwoc3RydWN0IHNvY2thZGRyX2F0bXN2YyAqKSBhZGRyLGxlbmd0aCxmbGFncyk7Ci0gICAgaWYgKHJlc3VsdCAhPSBUUllfT1RIRVIpIHJldHVybiByZXN1bHQ7Ci0gICAgcmV0dXJuIC0xOwotfQpkaWZmIC0tZ2l0IGEvcHBwZC9wbHVnaW5zL3BwcG9hdG0vdGV4dDJxb3MuYyBiL3BwcGQvcGx1Z2lucy9wcHBvYXRtL3RleHQycW9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MDQwN2EuLjAwMDAwMDAKLS0tIGEvcHBwZC9wbHVnaW5zL3BwcG9hdG0vdGV4dDJxb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKiB0ZXh0MnFvcy5jIC0gQ29udmVydHMgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiBRT1MgcGFyYW1ldGVycyB0byBiaW5hcnkKLQkJZW5jb2RpbmcgKi8KLQotLyogV3JpdHRlbiAxOTk2LTIwMDAgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMLUxSQy9JQ0EgKi8KLQotI2lmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotI2luY2x1ZGUgImF0bS5oIgotCi0KLSNkZWZpbmUgZmV0Y2ggX19hdG1saWJfZmV0Y2gKLQotCi0jZGVmaW5lIFJBVEVfRVJST1IgLTIKLQotCi1pbnQgX190MnFfZ2V0X3JhdGUoY29uc3QgY2hhciAqKnRleHQsaW50IHVwKQotewotICAgIGNvbnN0IGNoYXIgbXVsdFtdID0gImtLbU1nR2ciOwotICAgIGNvbnN0IGNoYXIgKm11bHRpcGxpZXI7Ci0gICAgY2hhciAqZW5kOwotICAgIHVuc2lnbmVkIGludCByYXRlLGZyYWN0OwotICAgIGludCBwb3dlcjsKLQotICAgIGlmICghc3RybmNtcCgqdGV4dCwibWF4IiwzKSkgewotCSp0ZXh0ICs9IDM7Ci0JcmV0dXJuIEFUTV9NQVhfUENSOwotICAgIH0KLSAgICByYXRlID0gc3RydG91bCgqdGV4dCwmZW5kLDEwKTsKLSAgICBwb3dlciA9IGZyYWN0ID0gMDsKLSAgICBpZiAoKmVuZCA9PSAnLicpCi0JZm9yIChlbmQrKzsgKmVuZCAmJiBpc2RpZ2l0KCplbmQpOyBlbmQrKykgewotCSAgICBmcmFjdCA9IGZyYWN0KjEwKyplbmQtNDg7Ci0JICAgIGlmICgtLXBvd2VyID09IC05KSBicmVhazsKLQl9Ci0gICAgbXVsdGlwbGllciA9IE5VTEw7Ci0gICAgaWYgKCplbmQgJiYgKG11bHRpcGxpZXIgPSBzdHJjaHIobXVsdCwqZW5kKSkpIHsKLQl3aGlsZSAobXVsdGlwbGllciA+PSBtdWx0KSB7Ci0JICAgIGlmIChyYXRlID4gVUlOVF9NQVgvMTAwMCkgcmV0dXJuIFJBVEVfRVJST1I7Ci0JICAgIHJhdGUgKj0gMTAwMDsKLQkgICAgcG93ZXIgKz0gMzsKLQkgICAgbXVsdGlwbGllciAtPSAyOwotCX0KLQllbmQrKzsKLSAgICB9Ci0gICAgd2hpbGUgKHBvd2VyICYmIGZyYWN0KQotCWlmIChwb3dlciA8IDApIHsKLQkgICAgZnJhY3QgLz0gMTA7Ci0JICAgIHBvd2VyKys7Ci0JfQotCWVsc2UgewotCSAgICBmcmFjdCAqPSAxMDsKLQkgICAgcG93ZXItLTsKLQl9Ci0gICAgcmF0ZSArPSBmcmFjdDsKLSAgICBpZiAoc3RybGVuKGVuZCkgPCAzKSB7Ci0JaWYgKG11bHRpcGxpZXIpIHJldHVybiBSQVRFX0VSUk9SOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RybmNtcChlbmQsImNwcyIsMykpIGVuZCArPSAzOwotCWVsc2UgaWYgKCFzdHJuY21wKGVuZCwiYnBzIiwzKSkgewotCQlyYXRlID0gKHJhdGUrKHVwID8gOCpBVE1fQ0VMTF9QQVlMT0FELTEgOiAwKSkvOC8KLQkJICBBVE1fQ0VMTF9QQVlMT0FEOwotCQllbmQgKz0gMzsKLQkgICAgfQotCSAgICBlbHNlIGlmIChtdWx0aXBsaWVyKSByZXR1cm4gUkFURV9FUlJPUjsKLSAgICBpZiAocmF0ZSA+IElOVF9NQVgpIHJldHVybiBSQVRFX0VSUk9SOwotICAgICp0ZXh0ID0gZW5kOwotICAgIHJldHVybiByYXRlOwotfQotCi0KLXN0YXRpYyBpbnQgcGFyYW1zKGNvbnN0IGNoYXIgKip0ZXh0LHN0cnVjdCBhdG1fdHJhZnBybSAqYSwKLSAgc3RydWN0IGF0bV90cmFmcHJtICpiKQotewotICAgIGludCB2YWx1ZTsKLSAgICBjaGFyICplbmQ7Ci0KLSAgICBpZiAoKigqdGV4dCkrKyAhPSAnOicpIHJldHVybiAtMTsKLSAgICB3aGlsZSAoMSkgewotCWlmICghKip0ZXh0KSByZXR1cm4gLTE7Ci0Jc3dpdGNoIChmZXRjaCh0ZXh0LCJtYXhfcGNyPSIsInBjcj0iLCJtaW5fcGNyPSIsIm1heF9zZHU9Iiwic2R1PSIsCi0JICBOVUxMKSkgewotCSAgICBjYXNlIDA6Ci0JCWlmICgodmFsdWUgPSBfX3QycV9nZXRfcmF0ZSh0ZXh0LDApKSA9PSBSQVRFX0VSUk9SKSByZXR1cm4gLTE7Ci0JCWlmIChhKSBhLT5tYXhfcGNyID0gdmFsdWU7Ci0JCWlmIChiKSBiLT5tYXhfcGNyID0gdmFsdWU7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDE6Ci0JCWlmICgodmFsdWUgPSBfX3QycV9nZXRfcmF0ZSh0ZXh0LDApKSA9PSBSQVRFX0VSUk9SKSByZXR1cm4gLTE7Ci0JCWlmIChhKSBhLT5wY3IgPSB2YWx1ZTsKLQkJaWYgKGIpIGItPnBjciA9IHZhbHVlOwotCQlicmVhazsKLQkgICAgY2FzZSAyOgotCQlpZiAoKHZhbHVlID0gX190MnFfZ2V0X3JhdGUodGV4dCwxKSkgPT0gUkFURV9FUlJPUikgcmV0dXJuIC0xOwotCQlpZiAodmFsdWUgPT0gQVRNX01BWF9QQ1IpIHJldHVybiAtMTsKLQkJaWYgKGEpIGEtPm1pbl9wY3IgPSB2YWx1ZTsKLQkJaWYgKGIpIGItPm1pbl9wY3IgPSB2YWx1ZTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgMzoKLQkgICAgY2FzZSA0OgotCQl2YWx1ZSA9IHN0cnRvbCgqdGV4dCwmZW5kLDEwKTsKLQkJaWYgKHZhbHVlIDwgMCkgcmV0dXJuIC0xOwotCQkqdGV4dCA9IGVuZDsKLQkJaWYgKGEpIGEtPm1heF9zZHUgPSB2YWx1ZTsKLQkJaWYgKGIpIGItPm1heF9zZHUgPSB2YWx1ZTsKLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoISoqdGV4dCkgYnJlYWs7Ci0JaWYgKCooKnRleHQpKysgIT0gJywnKSByZXR1cm4gLTE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0KLWludCB0ZXh0MnFvcyhjb25zdCBjaGFyICp0ZXh0LHN0cnVjdCBhdG1fcW9zICpxb3MsaW50IGZsYWdzKQotewotICAgIGludCB0cmFmZmljX2NsYXNzLGFhbDsKLQotICAgIHRyYWZmaWNfY2xhc3MgPSBBVE1fTk9ORTsKLSAgICBhYWwgPSBBVE1fTk9fQUFMOwotICAgIGRvIHsKLQlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhYWxfbnVtYmVyW10gPSB7IEFUTV9BQUwwLCBBVE1fQUFMNSB9OwotCWludCBpdGVtOwotCi0JaXRlbSA9IGZldGNoKCZ0ZXh0LCIhbm9uZSIsInViciIsImNiciIsInZiciIsImFiciIsImFhbDAiLCJhYWw1IixOVUxMKTsKLQlzd2l0Y2ggKGl0ZW0pIHsKLQkgICAgY2FzZSAxOgotCSAgICBjYXNlIDI6Ci0JCS8qIHdlIGRvbid0IHN1cHBvcnQgVkJSIHlldCAqLwotCSAgICBjYXNlIDQ6Ci0JCXRyYWZmaWNfY2xhc3MgPSBpdGVtOwotCQlicmVhazsKLQkgICAgY2FzZSA1OgotCSAgICBjYXNlIDY6Ci0JCWFhbCA9IGFhbF9udW1iZXJbaXRlbS01XTsKLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCXJldHVybiAtMTsKLQl9Ci0gICAgfQotICAgIHdoaWxlICgqdGV4dCA9PSAnLCcgPyB0ZXh0KysgOiAwKTsKLSAgICBpZiAoIXRyYWZmaWNfY2xhc3MpIHJldHVybiAtMTsKLSAgICBpZiAocW9zICYmICEoZmxhZ3MgJiBUMlFfREVGQVVMVFMpKSBtZW1zZXQocW9zLDAsc2l6ZW9mKCpxb3MpKTsKLSAgICBpZiAocW9zKSBxb3MtPnR4dHAudHJhZmZpY19jbGFzcyA9IHFvcy0+cnh0cC50cmFmZmljX2NsYXNzID0gdHJhZmZpY19jbGFzczsKLSAgICBpZiAocW9zICYmIGFhbCkgcW9zLT5hYWwgPSBhYWw7Ci0gICAgaWYgKCEqdGV4dCkgcmV0dXJuIDA7Ci0gICAgaWYgKHBhcmFtcygmdGV4dCxxb3MgPyAmcW9zLT50eHRwIDogTlVMTCxxb3MgPyAmcW9zLT5yeHRwIDogTlVMTCkpCi0JcmV0dXJuIC0xOwotICAgIGlmICghKnRleHQpIHJldHVybiAwOwotICAgIHN3aXRjaCAoZmV0Y2goJnRleHQsInR4IiwicngiLE5VTEwpKSB7Ci0JY2FzZSAwOgotCSAgICBpZiAoIWZldGNoKCZ0ZXh0LCI6bm9uZSIsTlVMTCkpIHsKLQkJaWYgKHFvcykgcW9zLT50eHRwLnRyYWZmaWNfY2xhc3MgPSBBVE1fTk9ORTsKLQkJaWYgKCp0ZXh0ID09ICcsJykgdGV4dCsrOwotCQlicmVhazsKLQkgICAgfQotCSAgICBpZiAocGFyYW1zKCZ0ZXh0LHFvcyA/ICZxb3MtPnR4dHAgOiBOVUxMLE5VTEwpKSByZXR1cm4gLTE7Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgdGV4dCAtPSAyOwotCSAgICBicmVhazsKLQlkZWZhdWx0OgotCSAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmICghKnRleHQpIHJldHVybiAwOwotICAgIGlmIChmZXRjaCgmdGV4dCwicngiLE5VTEwpKSByZXR1cm4gLTE7Ci0gICAgaWYgKCFmZXRjaCgmdGV4dCwiOm5vbmUiLE5VTEwpICYmIHFvcykgcW9zLT5yeHRwLnRyYWZmaWNfY2xhc3MgPSBBVE1fTk9ORTsKLSAgICBlbHNlIGlmIChwYXJhbXMoJnRleHQscW9zID8gJnFvcy0+cnh0cCA6IE5VTEwsTlVMTCkpIHJldHVybiAtMTsKLSAgICByZXR1cm4gKnRleHQgPyAtMSA6IDA7Ci19CmRpZmYgLS1naXQgYS9wcHBkL3BsdWdpbnMvcHBwb2wydHAtYW5kcm9pZC9wcHBvbDJ0cC1hbmRyb2lkLmMgYi9wcHBkL3BsdWdpbnMvcHBwb2wydHAtYW5kcm9pZC9wcHBvbDJ0cC1hbmRyb2lkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhOTg0ZGUuLjAwMDAwMDAKLS0tIGEvcHBwZC9wbHVnaW5zL3BwcG9sMnRwLWFuZHJvaWQvcHBwb2wydHAtYW5kcm9pZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAicHBwZC5oIgotI2luY2x1ZGUgImZzbS5oIgotI2luY2x1ZGUgImxjcC5oIgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX3BwcC5oPgotCi1jaGFyIHBwcGRfdmVyc2lvbltdID0gVkVSU0lPTjsKLQotc3RhdGljIHN0cnVjdCBjaGFubmVsIHBwcG9sMnRwX2NoYW5uZWw7Ci0KLS8qIE9wdGlvbnMgdmFyaWFibGVzICovCi1zdGF0aWMgaW50IHNlc3Npb25fZmQgPSAtMTsKLXN0YXRpYyBpbnQgdHVubmVsX2ZkID0gLTE7Ci1zdGF0aWMgaW50IHNlc3Npb25faWQgPSAwOwotc3RhdGljIGludCB0dW5uZWxfaWQgPSAwOwotCi1zdGF0aWMgaW50IHBwcG9sMnRwX3NldF9zZXNzaW9uX2ZkKGNoYXIgKiphcmd2KTsKLQotc3RhdGljIG9wdGlvbl90IHBwcG9sMnRwX29wdGlvbnNbXSA9IHsKLQl7ICJzZXNzaW9uX2ZkIiwgb19zcGVjaWFsLCBwcHBvbDJ0cF9zZXRfc2Vzc2lvbl9mZCwKLQkJIlNlc3Npb24gUFBQb1ggZGF0YSBzb2NrZXQiLCBPUFRfREVWTkFNIH0sCi0JeyAidHVubmVsX2ZkIiwgb19pbnQsICZ0dW5uZWxfZmQsCi0JCSJUdW5uZWwgbWFuYWdlbWVudCBQUFBvWCBzb2NrZXQiLCBPUFRfUFJJTyB9LAotCXsgInNlc3Npb25faWQiLCBvX2ludCwgJnNlc3Npb25faWQsICJTZXNzaW9uIElEIiwgT1BUX1BSSU8gfSwKLQl7ICJ0dW5uZWxfaWQiLCBvX2ludCwgJnR1bm5lbF9pZCwgIlR1bm5lbCBJRCIsIE9QVF9QUklPIH0sCi0JeyBOVUxMIH0KLX07Ci0KLXN0YXRpYyBpbnQgcHBwb2wydHBfc2V0X3Nlc3Npb25fZmQoY2hhciAqKmFyZ3YpCi17Ci0JaWYgKCFpbnRfb3B0aW9uKCphcmd2LCAmc2Vzc2lvbl9mZCkpCi0JCXJldHVybiAwOwotCi0JaW5mbygiVXNpbmcgUFBQb0wyVFAgKHNvY2tldCA9ICVkKSIsIHNlc3Npb25fZmQpOwotCXRoZV9jaGFubmVsID0gJnBwcG9sMnRwX2NoYW5uZWw7Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qKgotICogU2V0IHRoZSBNUlUgb24gdGhlIFBQUCBuZXR3b3JrIGludGVyZmFjZS4KLSAqCi0gKiBAcGFyYW0gbXJ1IE5ldyBNUlUgdmFsdWUKLSAqCi0gKiBAbm90ZSBuZXRpZl9zZXRfbXJ1KCkgaXMgbWlzc2luZyBpbiBzeXMtbGludXguYywgc28gaW1wbGVtZW50IGl0IG1hbnVhbGx5Ci0gKiBAbm90ZSBTZWUgbmV0L2wydHAvbDJ0cF9wcHAuYzpwcHBvbDJ0cF9zZXNzaW9uX2lvY3RsKCkgaW4ga2VybmVsIGZvciBkZXRhaWxzCi0gKi8KLXN0YXRpYyB2b2lkIHBwcG9sMnRwX3NldF9tcnUoaW50IG1ydSkKLXsKLQlpbnQgcmVzOwotCi0JaWYgKGlmdW5pdCA8IDApCi0JCXJldHVybjsKLQotCXJlcyA9IGlvY3RsKHNlc3Npb25fZmQsIFBQUElPQ1NNUlUsIChjYWRkcl90KSZtcnUpOwotCWlmIChyZXMgPCAwKQotCQllcnJvcigiaW9jdGwoUFBQSU9DU01SVSk6ICVtIChsaW5lICVkKSIsIF9fTElORV9fKTsKLX0KLQotLyogU2V0IHRoZSB0cmFuc21pdC1zaWRlIFBQUCBwYXJhbWV0ZXJzIG9mIHRoZSBjaGFubmVsICovCi1zdGF0aWMgdm9pZCBwcHBvbDJ0cF9zZW5kX2NvbmZpZyhpbnQgbXR1LCB1X2ludDMyX3QgYWNjbSwgaW50IHBjb21wLCBpbnQgYWNjb21wKQotewotCWludCBuZXdfbXR1ID0gbGNwX2FsbG93b3B0aW9uc1swXS5tcnU7CS8qICJtdHUiIHBwcGQgb3B0aW9uICovCi0KLQlpZiAobmV3X210dSA8PSBQUFBfTUFYTVRVICYmIG5ld19tdHUgPj0gUFBQX01JTk1UVSkKLQkJbmV0aWZfc2V0X210dShpZnVuaXQsIG5ld19tdHUpOwotfQotCi0vKiBTZXQgdGhlIHJlY2VpdmUtc2lkZSBQUFAgcGFyYW1ldGVycyBvZiB0aGUgY2hhbm5lbCAqLwotc3RhdGljIHZvaWQgcHBwb2wydHBfcmVjdl9jb25maWcoaW50IG1ydSwgdV9pbnQzMl90IGFjY20sIGludCBwY29tcCwgaW50IGFjY29tcCkKLXsKLQlpbnQgbmV3X21ydSA9IGxjcF93YW50b3B0aW9uc1swXS5tcnU7CS8qICJtcnUiIHBwcGQgb3B0aW9uICovCi0KLQlpZiAobmV3X21ydSA8PSBQUFBfTUFYTVJVICYmIG5ld19tcnUgPj0gUFBQX01JTk1SVSkKLQkJcHBwb2wydHBfc2V0X21ydShuZXdfbXJ1KTsKLX0KLQotc3RhdGljIGludCBwcHBvbDJ0cF9jb25uZWN0KHZvaWQpCi17Ci0JcmV0dXJuIHNlc3Npb25fZmQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHBwcG9sMnRwX2Rpc2Nvbm5lY3Qodm9pZCkKLXsKLQlpZiAoc2Vzc2lvbl9mZCAhPSAtMSkgewotCQljbG9zZShzZXNzaW9uX2ZkKTsKLQkJc2Vzc2lvbl9mZCA9IC0xOwotCX0KLQotCWlmICh0dW5uZWxfZmQgIT0gLTEpIHsKLQkJY2xvc2UodHVubmVsX2ZkKTsKLQkJdHVubmVsX2ZkID0gLTE7Ci0JfQotfQotCi12b2lkIHBsdWdpbl9pbml0KHZvaWQpCi17Ci0JYWRkX29wdGlvbnMocHBwb2wydHBfb3B0aW9ucyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2hhbm5lbCBwcHBvbDJ0cF9jaGFubmVsID0gewotCS5vcHRpb25zCQk9IHBwcG9sMnRwX29wdGlvbnMsCi0JLnByb2Nlc3NfZXh0cmFfb3B0aW9ucwk9IE5VTEwsCi0JLmNoZWNrX29wdGlvbnMJCT0gTlVMTCwKLQkuY29ubmVjdAkJPSBwcHBvbDJ0cF9jb25uZWN0LAotCS5kaXNjb25uZWN0CQk9IHBwcG9sMnRwX2Rpc2Nvbm5lY3QsCi0JLmVzdGFibGlzaF9wcHAJCT0gZ2VuZXJpY19lc3RhYmxpc2hfcHBwLAotCS5kaXNlc3RhYmxpc2hfcHBwCT0gZ2VuZXJpY19kaXNlc3RhYmxpc2hfcHBwLAotCS5zZW5kX2NvbmZpZwkJPSBwcHBvbDJ0cF9zZW5kX2NvbmZpZywKLQkucmVjdl9jb25maWcJCT0gcHBwb2wydHBfcmVjdl9jb25maWcsCi0JLmNsZWFudXAJCT0gTlVMTCwKLQkuY2xvc2UJCQk9IE5VTEwsCi19OwpkaWZmIC0tZ2l0IGEvcHBwZC9wbHVnaW5zL3BwcG9wcHRwLWFuZHJvaWQvcHBwb3BwdHAtYW5kcm9pZC5jIGIvcHBwZC9wbHVnaW5zL3BwcG9wcHRwLWFuZHJvaWQvcHBwb3BwdHAtYW5kcm9pZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRlM2JmLi4wMDAwMDAwCi0tLSBhL3BwcGQvcGx1Z2lucy9wcHBvcHB0cC1hbmRyb2lkL3BwcG9wcHRwLWFuZHJvaWQuYworKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAicHBwZC5oIgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi1jaGFyIHBwcGRfdmVyc2lvbltdID0gVkVSU0lPTjsKLQotc3RhdGljIHN0cnVjdCBjaGFubmVsIHBwcG9wcHRwX2NoYW5uZWw7Ci0KLS8qIE9wdGlvbiB2YXJpYWJsZXMgKi8KLXN0YXRpYyBpbnQgcHB0cF9zb2NrZXQgPSAtMTsKLQotc3RhdGljIG9wdGlvbl90IHBwcG9wcHRwX29wdGlvbnNbXSA9Ci17Ci0JeyAicHB0cF9zb2NrZXQiLCBvX2ludCwgJnBwdHBfc29ja2V0LCAiUFBUUCBzb2NrZXQgRkQiLCBPUFRfUFJJTyB9LAotCXsgTlVMTCB9Ci19OwotCi1zdGF0aWMgaW50IHBwdHBfY29ubmVjdCh2b2lkKQotewotCWluZm8oIlVzaW5nIFBQUG9QUFRQIChzb2NrZXQgPSAlZCkiLCBwcHRwX3NvY2tldCk7Ci0JcmV0dXJuIHBwdHBfc29ja2V0OwotfQotCi1zdGF0aWMgdm9pZCBwcHRwX2Rpc2Nvbm5lY3Qodm9pZCkKLXsKLQlpZiAocHB0cF9zb2NrZXQgIT0gLTEpIHsKLQkJY2xvc2UocHB0cF9zb2NrZXQpOwotCQlwcHRwX3NvY2tldCA9IC0xOwotCX0KLX0KLQotdm9pZCBwbHVnaW5faW5pdCh2b2lkKQotewotCWFkZF9vcHRpb25zKHBwcG9wcHRwX29wdGlvbnMpOwotCXRoZV9jaGFubmVsID0gJnBwcG9wcHRwX2NoYW5uZWw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2hhbm5lbCBwcHBvcHB0cF9jaGFubmVsID0gewotCS5vcHRpb25zCQk9IHBwcG9wcHRwX29wdGlvbnMsCi0JLnByb2Nlc3NfZXh0cmFfb3B0aW9ucwk9IE5VTEwsCi0JLmNoZWNrX29wdGlvbnMJCT0gTlVMTCwKLQkuY29ubmVjdAkJPSBwcHRwX2Nvbm5lY3QsCi0JLmRpc2Nvbm5lY3QJCT0gcHB0cF9kaXNjb25uZWN0LAotCS5lc3RhYmxpc2hfcHBwCQk9IGdlbmVyaWNfZXN0YWJsaXNoX3BwcCwKLQkuZGlzZXN0YWJsaXNoX3BwcAk9IGdlbmVyaWNfZGlzZXN0YWJsaXNoX3BwcCwKLQkuc2VuZF9jb25maWcJCT0gTlVMTCwKLQkucmVjdl9jb25maWcJCT0gTlVMTCwKLQkuY2xvc2UJCQk9IE5VTEwsCi0JLmNsZWFudXAJCT0gTlVMTCwKLX07CmRpZmYgLS1naXQgYS9wcHBkL3BsdWdpbnMvcmFkaXVzL0NPUFlSSUdIVCBiL3BwcGQvcGx1Z2lucy9yYWRpdXMvQ09QWVJJR0hUCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTBmOTk5Li4wMDAwMDAwCi0tLSBhL3BwcGQvcGx1Z2lucy9yYWRpdXMvQ09QWVJJR0hUCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotU2VlIHRoZSByZXNwZWN0aXZlIHNvdXJjZSBmaWxlcyB0byBmaW5kIG91dCB3aGljaCBjb3B5cmlnaHRzIGFwcGx5LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoQykgMjAwMiBSb2FyaW5nIFBlbmd1aW4gU29mdHdhcmUgSW5jLgotCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLXB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMKLWNvcHlyaWdodCBhbmQgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIG9uIGFsbCBjb3BpZXMgYW5kIHN1cHBvcnRpbmcKLWRvY3VtZW50YXRpb24sIHRoZSBuYW1lIG9mIFJvYXJpbmcgUGVuZ3VpbiBTb2Z0d2FyZSBJbmMuIG5vdCBiZSB1c2VkCi1pbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHByb2dyYW0KLXdpdGhvdXQgc3BlY2lmaWMgcHJpb3IgcGVybWlzc2lvbiwgYW5kIG5vdGljZSBiZSBnaXZlbiBpbiBzdXBwb3J0aW5nCi1kb2N1bWVudGF0aW9uIHRoYXQgY29weWluZyBhbmQgZGlzdHJpYnV0aW9uIGlzIGJ5IHBlcm1pc3Npb24gb2YKLVJvYXJpbmcgUGVuZ3VpbiBTb2Z0d2FyZSBJbmMuLgotCi1Sb2FyaW5nIFBlbmd1aW4gU29mdHdhcmUgSW5jLiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlCi1zdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKLXdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoQykgMTk5NSwxOTk2LDE5OTcsMTk5OCBMYXJzIEZlbm5lYmVyZyA8bGZAZWxlbWVudGFsLm5ldD4KLQotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci1wdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIGNvcHlyaWdodCBhbmQKLXBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBvbiBhbGwgY29waWVzIGFuZCBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIHRoZQotbmFtZSBvZiBMYXJzIEZlbm5lYmVyZyBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0bwotZGlzdHJpYnV0aW9uIG9mIHRoZSBwcm9ncmFtIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IgcGVybWlzc2lvbiwgYW5kIG5vdGljZSBiZQotZ2l2ZW4gaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uIHRoYXQgY29weWluZyBhbmQgZGlzdHJpYnV0aW9uIGlzIGJ5Ci1wZXJtaXNzaW9uIG9mIExhcnMgRmVubmViZXJnLgotCi1MYXJzIEZlbm5lYmVyZyBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMKLXNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKLXdhcnJhbnR5LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAxOTkyIExpdmluZ3N0b24gRW50ZXJwcmlzZXMsIEluYy4KLUxpdmluZ3N0b24gRW50ZXJwcmlzZXMsIEluYy4gNjkyMCBLb2xsIENlbnRlciBQYXJrd2F5IFBsZWFzYW50b24sIENBICA5NDU2NgotCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLXB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgY29weXJpZ2h0Ci1hbmQgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIG9uIGFsbCBjb3BpZXMgYW5kIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwKLXRoZSBuYW1lIG9mIExpdmluZ3N0b24gRW50ZXJwcmlzZXMsIEluYy4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKLXB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgcHJvZ3JhbSB3aXRob3V0IHNwZWNpZmljCi1wcmlvciBwZXJtaXNzaW9uLCBhbmQgbm90aWNlIGJlIGdpdmVuIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiB0aGF0Ci1jb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gaXMgYnkgcGVybWlzc2lvbiBvZiBMaXZpbmdzdG9uIEVudGVycHJpc2VzLCBJbmMuCi0KLUxpdmluZ3N0b24gRW50ZXJwcmlzZXMsIEluYy4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eQotb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcwotb3IgaW1wbGllZCB3YXJyYW50eS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotW0NdIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuIGFuZCBNZXJpdCBOZXR3b3JrLCBJbmMuIDE5OTIsCi0xOTkzLCAxOTk0LCAxOTk1IEFsbCBSaWdodHMgUmVzZXJ2ZWQKLQotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi1kb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkCi10aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKLWNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIGRlcml2YXRpdmUgd29ya3Mgb3IgbW9kaWZpZWQgdmVyc2lvbnMgdGhlcmVvZiwKLWFuZCB0aGF0IGJvdGggdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBhbmQgZGlzY2xhaW1lcgotbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIKLUVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIFJFR0VOVFMgT0YgVEhFCi1VTklWRVJTSVRZIE9GIE1JQ0hJR0FOIEFORCBNRVJJVCBORVRXT1JLLCBJTkMuIERPIE5PVCBXQVJSQU5UIFRIQVQgVEhFCi1GVU5DVElPTlMgQ09OVEFJTkVEIElOIFRIRSBTT0ZUV0FSRSBXSUxMIE1FRVQgTElDRU5TRUUnUyBSRVFVSVJFTUVOVFMgT1IKLVRIQVQgT1BFUkFUSU9OIFdJTEwgQkUgVU5JTlRFUlJVUFRFRCBPUiBFUlJPUiBGUkVFLiAgVGhlIFJlZ2VudHMgb2YgdGhlCi1Vbml2ZXJzaXR5IG9mIE1pY2hpZ2FuIGFuZCBNZXJpdCBOZXR3b3JrLCBJbmMuIHNoYWxsIG5vdCBiZSBsaWFibGUgZm9yIGFueQotc3BlY2lhbCwgaW5kaXJlY3QsIGluY2lkZW50YWwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIHdpdGggcmVzcGVjdCB0byBhbnkKLWNsYWltIGJ5IExpY2Vuc2VlIG9yIGFueSB0aGlyZCBwYXJ0eSBhcmlzaW5nIGZyb20gdXNlIG9mIHRoZSBzb2Z0d2FyZS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChDKSAxOTkxLTIsIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIENyZWF0ZWQgMTk5MS4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLUxpY2Vuc2UgdG8gY29weSBhbmQgdXNlIHRoaXMgc29mdHdhcmUgaXMgZ3JhbnRlZCBwcm92aWRlZCB0aGF0IGl0Ci1pcyBpZGVudGlmaWVkIGFzIHRoZSAiUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2UtRGlnZXN0Ci1BbGdvcml0aG0iIGluIGFsbCBtYXRlcmlhbCBtZW50aW9uaW5nIG9yIHJlZmVyZW5jaW5nIHRoaXMgc29mdHdhcmUKLW9yIHRoaXMgZnVuY3Rpb24uCi0KLUxpY2Vuc2UgaXMgYWxzbyBncmFudGVkIHRvIG1ha2UgYW5kIHVzZSBkZXJpdmF0aXZlIHdvcmtzIHByb3ZpZGVkCi10aGF0IHN1Y2ggd29ya3MgYXJlIGlkZW50aWZpZWQgYXMgImRlcml2ZWQgZnJvbSB0aGUgUlNBIERhdGEKLVNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0iIGluIGFsbCBtYXRlcmlhbAotbWVudGlvbmluZyBvciByZWZlcmVuY2luZyB0aGUgZGVyaXZlZCB3b3JrLgotCi1SU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgY29uY2VybmluZyBlaXRoZXIKLXRoZSBtZXJjaGFudGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBvciB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcwotc29mdHdhcmUgZm9yIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKLXdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5IG9mIGFueSBraW5kLgotCi1UaGVzZSBub3RpY2VzIG11c3QgYmUgcmV0YWluZWQgaW4gYW55IGNvcGllcyBvZiBhbnkgcGFydCBvZiB0aGlzCi1kb2N1bWVudGF0aW9uIGFuZC9vciBzb2Z0d2FyZS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9NYWtlZmlsZS5saW51eCBiL3BwcGQvcGx1Z2lucy9yYWRpdXMvTWFrZWZpbGUubGludXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZWQzZTUuLjAwMDAwMDAKLS0tIGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9NYWtlZmlsZS5saW51eAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIFJBRElVUyBwbHVnaW4KLSMKLSMgQ29weXJpZ2h0IDIwMDIgUm9hcmluZyBQZW5ndWluIFNvZnR3YXJlIEluYy4KLSMKLQotREVTVERJUiA9ICQoSU5TVFJPT1QpQERFU1RESVJACi1NQU5ESVIgPSAkKERFU1RESVIpL3NoYXJlL21hbi9tYW44Ci1MSUJESVIgPSAkKERFU1RESVIpL2xpYi9wcHBkLyQoVkVSU0lPTikKLQotVkVSU0lPTiA9ICQoc2hlbGwgYXdrIC1GICciJyAnL1ZFUlNJT04vIHsgcHJpbnQgJCQyOyB9JyAuLi8uLi9wYXRjaGxldmVsLmgpCi0KLUlOU1RBTEwJPSBpbnN0YWxsCi0KLVBMVUdJTj1yYWRpdXMuc28gcmFkYXR0ci5zbyByYWRyZWFsbXMuc28KLUNGTEFHUz0tSS4gLUkuLi8uLiAtSS4uLy4uLy4uL2luY2x1ZGUgLU8yIC1mUElDIC1EUkNfTE9HX0ZBQ0lMSVRZPUxPR19EQUVNT04KLQotIyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIE1pY3Jvc29mdCdzCi0jIE1TLUNIQVAgYXV0aGVudGljYXRpb24gcHJvdG9jb2wuCi1DSEFQTVM9eQotIyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIE1QUEUuCi1NUFBFPXkKLSMgVW5jb21tZW50IHRoZSBuZXh0IGxpbnQgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0cmFmZmljIGxpbWl0aW5nCi1NQVhPQ1RFVFM9eQotCi1pZmRlZiBDSEFQTVMKLUNGTEFHUyArPSAtRENIQVBNUz0xCi1pZmRlZiBNUFBFCi1DRkxBR1MgKz0gLURNUFBFPTEKLWVuZGlmCi1lbmRpZgotaWZkZWYgTUFYT0NURVRTCi1DRkxBR1MgKz0gLURNQVhPQ1RFVFM9MQotZW5kaWYKLQotYWxsOiAkKFBMVUdJTikKLQotaW5zdGFsbDogYWxsCi0JJChJTlNUQUxMKSAtZCAtbSA3NTUgJChMSUJESVIpCi0JJChJTlNUQUxMKSAtcyAtYyAtbSA3NTUgcmFkaXVzLnNvICQoTElCRElSKQotCSQoSU5TVEFMTCkgLXMgLWMgLW0gNzU1IHJhZGF0dHIuc28gJChMSUJESVIpCi0JJChJTlNUQUxMKSAtcyAtYyAtbSA3NTUgcmFkcmVhbG1zLnNvICQoTElCRElSKQotCSQoSU5TVEFMTCkgLWMgLW0gNDQ0IHBwcGQtcmFkaXVzLjggJChNQU5ESVIpCi0JJChJTlNUQUxMKSAtYyAtbSA0NDQgcHBwZC1yYWRhdHRyLjggJChNQU5ESVIpCi0KLXJhZGl1cy5zbzogcmFkaXVzLm8gbGlicmFkaXVzY2xpZW50LmEKLQkkKENDKSAtbyByYWRpdXMuc28gLXNoYXJlZCByYWRpdXMubyBsaWJyYWRpdXNjbGllbnQuYQotCi1yYWRhdHRyLnNvOiByYWRhdHRyLm8KLQkkKENDKSAtbyByYWRhdHRyLnNvIC1zaGFyZWQgcmFkYXR0ci5vCi0KLXJhZHJlYWxtcy5zbzogcmFkcmVhbG1zLm8KLQkkKENDKSAtbyByYWRyZWFsbXMuc28gLXNoYXJlZCByYWRyZWFsbXMubwotCi1DTElFTlRPQkpTID0gYXZwYWlyLm8gYnVpbGRyZXEubyBjb25maWcubyBkaWN0Lm8gaXBfdXRpbC5vIFwKLQljbGllbnRpZC5vIHNlbmRzZXJ2ZXIubyBsb2NrLm8gdXRpbC5vIG1kNS5vCi1saWJyYWRpdXNjbGllbnQuYTogJChDTElFTlRPQkpTKQotCSQoQVIpIHJ2ICRAICQ/Ci0KLWNsZWFuOgotCXJtIC1mICoubyAqLnNvICouYQotCi1kaXN0Y2xlYW46Ci0Jcm0gLWYgKi5vICouc28gKi5hCi0KLWRpc3QtY2xlYW46IGRpc3RjbGVhbgpkaWZmIC0tZ2l0IGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9hdnBhaXIuYyBiL3BwcGQvcGx1Z2lucy9yYWRpdXMvYXZwYWlyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNmQyM2YuLjAwMDAwMDAKLS0tIGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9hdnBhaXIuYworKysgL2Rldi9udWxsCkBAIC0xLDc5NSArMCwwIEBACi0vKgotICogJElkOiBhdnBhaXIuYyx2IDEuMSAyMDA0LzExLzE0IDA3OjI2OjI2IHBhdWx1cyBFeHAgJAotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NSBMYXJzIEZlbm5lYmVyZwotICoKLSAqIENvcHlyaWdodCAxOTkyIExpdmluZ3N0b24gRW50ZXJwcmlzZXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgMTk5MiwxOTkzLCAxOTk0LDE5OTUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4KLSAqIGFuZCBNZXJpdCBOZXR3b3JrLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLSAqCi0gKiBTZWUgdGhlIGZpbGUgQ09QWVJJR0hUIGZvciB0aGUgcmVzcGVjdGl2ZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4KLSAqIElmIHRoZSBmaWxlIGlzIG1pc3NpbmcgY29udGFjdCBtZSBhdCBsZkBlbGVtZW50YWwubmV0Ci0gKiBhbmQgSSdsbCBzZW5kIHlvdSBhIGNvcHkuCi0gKgotICovCi0KLSNpbmNsdWRlIDxpbmNsdWRlcy5oPgotI2luY2x1ZGUgPHJhZGl1c2NsaWVudC5oPgotCi1zdGF0aWMgdm9pZCByY19leHRyYWN0X3ZlbmRvcl9zcGVjaWZpY19hdHRyaWJ1dGVzKGludCBhdHRybGVuLAotCQkJCQkJICB1bnNpZ25lZCBjaGFyICpwdHIsCi0JCQkJCQkgIFZBTFVFX1BBSVIgKip2cCk7Ci0vKgotICogRnVuY3Rpb246IHJjX2F2cGFpcl9hZGQKLSAqCi0gKiBQdXJwb3NlOiBhZGQgYW4gYXR0cmlidXRlLXZhbHVlIHBhaXIgdG8gdGhlIGdpdmVuIGxpc3QuCi0gKgotICogUmV0dXJuczogcG9pbnRlciB0byBhZGRlZCBhL3YgcGFpciB1cG9uIHN1Y2Nlc3MsIE5VTEwgcG9pbnRlciB1cG9uIGZhaWx1cmUuCi0gKgotICogUmVtYXJrczogQWx3YXlzIGFwcGVuZHMgdGhlIG5ldyBwYWlyIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuCi0gKgotICovCi0KLVZBTFVFX1BBSVIgKnJjX2F2cGFpcl9hZGQgKFZBTFVFX1BBSVIgKipsaXN0LCBpbnQgYXR0cmlkLCB2b2lkICpwdmFsLCBpbnQgbGVuLAotCQkJICAgaW50IHZlbmRvcmNvZGUpCi17Ci0JVkFMVUVfUEFJUiAgICAgKnZwOwotCi0JdnAgPSByY19hdnBhaXJfbmV3IChhdHRyaWQsIHB2YWwsIGxlbiwgdmVuZG9yY29kZSk7Ci0KLQlpZiAodnAgIT0gKFZBTFVFX1BBSVIgKikgTlVMTCkKLQl7Ci0JCXJjX2F2cGFpcl9pbnNlcnQgKGxpc3QsIChWQUxVRV9QQUlSICopIE5VTEwsIHZwKTsKLQl9Ci0KLQlyZXR1cm4gdnA7Ci0KLX0KLQotLyoKLSAqIEZ1bmN0aW9uOiByY19hdnBhaXJfYXNzaWduCi0gKgotICogUHVycG9zZTogYXNzaWduIHRoZSBnaXZlbiB2YWx1ZSB0byBhbiBhdHRyaWJ1dGUtdmFsdWUgcGFpci4KLSAqCi0gKiBSZXR1cm5zOiAgMCBvbiBzdWNjZXNzLAotICoJICAgIC0xIG9uIGZhaWx1cmUuCi0gKgotICovCi0KLWludCByY19hdnBhaXJfYXNzaWduIChWQUxVRV9QQUlSICp2cCwgdm9pZCAqcHZhbCwgaW50IGxlbikKLXsKLQlpbnQJcmVzdWx0ID0gLTE7Ci0KLQlzd2l0Y2ggKHZwLT50eXBlKQotCXsKLQkJY2FzZSBQV19UWVBFX1NUUklORzoKLQotCQkJaWYgKCgobGVuID09IDApICYmIChzdHJsZW4gKChjaGFyICopIHB2YWwpKSA+IEFVVEhfU1RSSU5HX0xFTikKLQkJCSAgICB8fCAobGVuID4gQVVUSF9TVFJJTkdfTEVOKSkgewotCQkJCWVycm9yKCJyY19hdnBhaXJfYXNzaWduOiBiYWQgYXR0cmlidXRlIGxlbmd0aCIpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCSAgICB9Ci0KLQkJCWlmIChsZW4gPiAwKSB7Ci0JCQkJbWVtY3B5KHZwLT5zdHJ2YWx1ZSwgKGNoYXIgKilwdmFsLCBsZW4pOwotCQkJCXZwLT5zdHJ2YWx1ZVtsZW5dID0gJ1wwJzsKLQkJCQl2cC0+bHZhbHVlID0gbGVuOwotCQkJfSBlbHNlIHsKLQkJCXN0cm5jcHkgKHZwLT5zdHJ2YWx1ZSwgKGNoYXIgKikgcHZhbCwgQVVUSF9TVFJJTkdfTEVOKTsKLQkJCXZwLT5sdmFsdWUgPSBzdHJsZW4oKGNoYXIgKikgcHZhbCk7Ci0JCQl9Ci0KLQkJCXJlc3VsdCA9IDA7Ci0JCQlicmVhazsKLQotCQljYXNlIFBXX1RZUEVfREFURToKLQkJY2FzZSBQV19UWVBFX0lOVEVHRVI6Ci0JCWNhc2UgUFdfVFlQRV9JUEFERFI6Ci0KLQkJCXZwLT5sdmFsdWUgPSAqIChVSU5UNCAqKSBwdmFsOwotCi0JCQlyZXN1bHQgPSAwOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWVycm9yKCJyY19hdnBhaXJfYXNzaWduOiB1bmtub3duIGF0dHJpYnV0ZSAlZCIsIHZwLT50eXBlKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uOiByY19hdnBhaXJfbmV3Ci0gKgotICogUHVycG9zZTogbWFrZSBhIG5ldyBhdHRyaWJ1dGUtdmFsdWUgcGFpciB3aXRoIGdpdmVuIHBhcmFtZXRlcnMuCi0gKgotICogUmV0dXJuczogcG9pbnRlciB0byBnZW5lcmF0ZWQgYS92IHBhaXIgd2hlbiBzdWNjZXNzZnVsLCBOVUxMIHdoZW4gZmFpbHVyZS4KLSAqCi0gKi8KLQotVkFMVUVfUEFJUiAqcmNfYXZwYWlyX25ldyAoaW50IGF0dHJpZCwgdm9pZCAqcHZhbCwgaW50IGxlbiwgaW50IHZlbmRvcmNvZGUpCi17Ci0JVkFMVUVfUEFJUiAgICAgKnZwID0gKFZBTFVFX1BBSVIgKikgTlVMTDsKLQlESUNUX0FUVFIgICAgICAqcGRhOwotCi0JaWYgKChwZGEgPSByY19kaWN0X2dldGF0dHIgKGF0dHJpZCwgdmVuZG9yY29kZSkpID09IChESUNUX0FUVFIgKikgTlVMTCkKLQl7Ci0JCWVycm9yKCJyY19hdnBhaXJfbmV3OiB1bmtub3duIGF0dHJpYnV0ZSAlZCIsIGF0dHJpZCk7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmICgodnAgPSAoVkFMVUVfUEFJUiAqKSBtYWxsb2MgKHNpemVvZiAoVkFMVUVfUEFJUikpKQotCQkJCQkJCSE9IChWQUxVRV9QQUlSICopIE5VTEwpCi0JCXsKLQkJCXN0cm5jcHkgKHZwLT5uYW1lLCBwZGEtPm5hbWUsIHNpemVvZiAodnAtPm5hbWUpKTsKLQkJCXZwLT5hdHRyaWJ1dGUgPSBhdHRyaWQ7Ci0JCQl2cC0+dmVuZG9yY29kZSA9IHZlbmRvcmNvZGU7Ci0JCQl2cC0+bmV4dCA9IChWQUxVRV9QQUlSICopIE5VTEw7Ci0JCQl2cC0+dHlwZSA9IHBkYS0+dHlwZTsKLQkJCWlmIChyY19hdnBhaXJfYXNzaWduICh2cCwgcHZhbCwgbGVuKSA9PSAwKQotCQkJewotCQkJCXJldHVybiB2cDsKLQkJCX0KLQkJCWZyZWUgKHZwKTsKLQkJCXZwID0gKFZBTFVFX1BBSVIgKikgTlVMTDsKLQkJfQotCQllbHNlCi0JCQlub3ZtKCJyY19hdnBhaXJfbmV3Iik7Ci0JfQotCXJldHVybiB2cDsKLX0KLQotLyoKLSAqCi0gKiBGdW5jdGlvbjogcmNfYXZwYWlyX2dlbgotICoKLSAqIFB1cnBvc2U6IHRha2VzIGF0dHJpYnV0ZS92YWx1ZSBwYWlycyBmcm9tIGJ1ZmZlciBhbmQgYnVpbGRzIGEKLSAqCSAgICB2YWx1ZV9wYWlyIGxpc3QgdXNpbmcgYWxsb2NhdGVkIG1lbW9yeS4KLSAqCi0gKiBSZXR1cm5zOiB2YWx1ZV9wYWlyIGxpc3Qgb3IgTlVMTCBvbiBmYWlsdXJlCi0gKi8KLQotVkFMVUVfUEFJUiAqcmNfYXZwYWlyX2dlbiAoQVVUSF9IRFIgKmF1dGgpCi17Ci0JaW50ICAgICAgICAgICAgIGxlbmd0aDsKLQlpbnQgICAgICAgICAgICAgeF9sZW47Ci0JaW50ICAgICAgICAgICAgIGF0dHJpYnV0ZTsKLQlpbnQgICAgICAgICAgICAgYXR0cmxlbjsKLQlVSU5UNCAgICAgICAgICAgbHZhbHVlOwotCXVuc2lnbmVkIGNoYXIgICAgICAgICAqeF9wdHI7Ci0JdW5zaWduZWQgY2hhciAgICAgICAgICpwdHI7Ci0JRElDVF9BVFRSICAgICAgKmF0dHI7Ci0JVkFMVUVfUEFJUiAgICAgKnZwOwotCVZBTFVFX1BBSVIgICAgICpwYWlyOwotCXVuc2lnbmVkIGNoYXIgICBoZXhbM107CQkvKiBGb3IgaGV4IHN0cmluZyBjb252ZXJzaW9uLiAqLwotCWNoYXIgICAgICAgICAgICBidWZmZXJbNTEyXTsKLQotCS8qCi0JICogRXh0cmFjdCBhdHRyaWJ1dGUtdmFsdWUgcGFpcnMKLQkgKi8KLQlwdHIgPSBhdXRoLT5kYXRhOwotCWxlbmd0aCA9IG50b2hzICgodW5zaWduZWQgc2hvcnQpIGF1dGgtPmxlbmd0aCkgLSBBVVRIX0hEUl9MRU47Ci0JdnAgPSAoVkFMVUVfUEFJUiAqKSBOVUxMOwotCi0Jd2hpbGUgKGxlbmd0aCA+IDApCi0JewotCQlhdHRyaWJ1dGUgPSAqcHRyKys7Ci0JCWF0dHJsZW4gPSAqcHRyKys7Ci0JCWF0dHJsZW4gLT0gMjsKLQkJaWYgKGF0dHJsZW4gPCAwKQotCQl7Ci0JCQllcnJvcigicmNfYXZwYWlyX2dlbjogcmVjZWl2ZWQgYXR0cmlidXRlIHdpdGggaW52YWxpZCBsZW5ndGgiKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogSGFuZGxlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWFsbHkgKi8KLQkJaWYgKGF0dHJpYnV0ZSA9PSBQV19WRU5ET1JfU1BFQ0lGSUMpIHsKLQkJICAgIHJjX2V4dHJhY3RfdmVuZG9yX3NwZWNpZmljX2F0dHJpYnV0ZXMoYXR0cmxlbiwgcHRyLCAmdnApOwotCQkgICAgcHRyICs9IGF0dHJsZW47Ci0JCSAgICBsZW5ndGggLT0gKGF0dHJsZW4gKyAyKTsKLQkJICAgIGNvbnRpbnVlOwotCQl9Ci0JCWlmICgoYXR0ciA9IHJjX2RpY3RfZ2V0YXR0ciAoYXR0cmlidXRlLCBWRU5ET1JfTk9ORSkpID09IChESUNUX0FUVFIgKikgTlVMTCkKLQkJewotCQkJKmJ1ZmZlcj0gJ1wwJzsJLyogSW5pdGlhbCBsZW5ndGguICovCi0JCQlmb3IgKHhfcHRyID0gcHRyLCB4X2xlbiA9IGF0dHJsZW4gOwotCQkJCXhfbGVuID4gMCA7Ci0JCQkJeF9sZW4tLSwgeF9wdHIrKykKLQkJCXsKLQkJCQlzcHJpbnRmIChoZXgsICIlMi4yWCIsICp4X3B0cik7Ci0JCQkJc3RyY2F0IChidWZmZXIsIGhleCk7Ci0JCQl9Ci0JCQl3YXJuKCJyY19hdnBhaXJfZ2VuOiByZWNlaXZlZCB1bmtub3duIGF0dHJpYnV0ZSAlZCBvZiBsZW5ndGggJWQ6IDB4JXMiLAotCQkJCWF0dHJpYnV0ZSwgYXR0cmxlbiwgYnVmZmVyKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmICgocGFpciA9Ci0JCQkJKFZBTFVFX1BBSVIgKikgbWFsbG9jIChzaXplb2YgKFZBTFVFX1BBSVIpKSkgPT0KLQkJCQkJKFZBTFVFX1BBSVIgKikgTlVMTCkKLQkJCXsKLQkJCQlub3ZtKCJyY19hdnBhaXJfZ2VuIik7Ci0JCQkJcmNfYXZwYWlyX2ZyZWUodnApOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJc3RyY3B5IChwYWlyLT5uYW1lLCBhdHRyLT5uYW1lKTsKLQkJCXBhaXItPmF0dHJpYnV0ZSA9IGF0dHItPnZhbHVlOwotCQkJcGFpci0+dmVuZG9yY29kZSA9IFZFTkRPUl9OT05FOwotCQkJcGFpci0+dHlwZSA9IGF0dHItPnR5cGU7Ci0JCQlwYWlyLT5uZXh0ID0gKFZBTFVFX1BBSVIgKikgTlVMTDsKLQotCQkJc3dpdGNoIChhdHRyLT50eXBlKQotCQkJewotCi0JCQkgICAgY2FzZSBQV19UWVBFX1NUUklORzoKLQkJCQltZW1jcHkgKHBhaXItPnN0cnZhbHVlLCAoY2hhciAqKSBwdHIsIChzaXplX3QpIGF0dHJsZW4pOwotCQkJCXBhaXItPnN0cnZhbHVlW2F0dHJsZW5dID0gJ1wwJzsKLQkJCQlwYWlyLT5sdmFsdWUgPSBhdHRybGVuOwotCQkJCXJjX2F2cGFpcl9pbnNlcnQgKCZ2cCwgKFZBTFVFX1BBSVIgKikgTlVMTCwgcGFpcik7Ci0JCQkJYnJlYWs7Ci0KLQkJCSAgICBjYXNlIFBXX1RZUEVfSU5URUdFUjoKLQkJCSAgICBjYXNlIFBXX1RZUEVfSVBBRERSOgotCQkJCW1lbWNweSAoKGNoYXIgKikgJmx2YWx1ZSwgKGNoYXIgKikgcHRyLAotCQkJCQlzaXplb2YgKFVJTlQ0KSk7Ci0JCQkJcGFpci0+bHZhbHVlID0gbnRvaGwgKGx2YWx1ZSk7Ci0JCQkJcmNfYXZwYWlyX2luc2VydCAoJnZwLCAoVkFMVUVfUEFJUiAqKSBOVUxMLCBwYWlyKTsKLQkJCQlicmVhazsKLQotCQkJICAgIGRlZmF1bHQ6Ci0JCQkJd2FybigicmNfYXZwYWlyX2dlbjogJXMgaGFzIHVua25vd24gdHlwZSIsIGF0dHItPm5hbWUpOwotCQkJCWZyZWUgKHBhaXIpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCX0KLQkJcHRyICs9IGF0dHJsZW47Ci0JCWxlbmd0aCAtPSBhdHRybGVuICsgMjsKLQl9Ci0JcmV0dXJuICh2cCk7Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbjogcmNfZXh0cmFjdF92ZW5kb3Jfc3BlY2lmaWNfYXR0cmlidXRlcwotICoKLSAqIFB1cnBvc2U6IEV4dHJhY3RzIHZlbmRvci1zcGVjaWZpYyBhdHRyaWJ1dGVzLCBhc3N1bWluZyB0aGV5IGFyZSBpbgotICogICAgICAgICAgdGhlICJTSE9VTEQiIGZvcm1hdCByZWNvbW1lbmRlZCBieSBSQ0YgMjEzOC4KLSAqCi0gKiBSZXR1cm5zOiBmb3VuZCB2YWx1ZV9wYWlyCi0gKgotICovCi1zdGF0aWMgdm9pZCByY19leHRyYWN0X3ZlbmRvcl9zcGVjaWZpY19hdHRyaWJ1dGVzKGludCBhdHRybGVuLAotCQkJCQkJICB1bnNpZ25lZCBjaGFyICpwdHIsCi0JCQkJCQkgIFZBTFVFX1BBSVIgKip2cCkKLXsKLSAgICBpbnQgdmVuZG9yX2lkOwotICAgIGludCB2dHlwZTsKLSAgICBpbnQgdmxlbjsKLSAgICBVSU5UNCBsdmFsdWU7Ci0gICAgRElDVF9BVFRSICphdHRyOwotICAgIFZBTFVFX1BBSVIgKnBhaXI7Ci0KLSAgICAvKiBwdHIgaXMgc2l0dGluZyBhdCB2ZW5kb3ItSUQgKi8KLSAgICBpZiAoYXR0cmxlbiA8IDgpIHsKLQkvKiBOb3RoaW5nIHRvIHNlZSBoZXJlLi4uICovCi0JcmV0dXJuOwotICAgIH0KLQotICAgIC8qIEhpZ2gtb3JkZXIgb2N0ZXQgb2YgVmVuZG9yLUlkIG11c3QgYmUgemVybyAoUkZDMjEzOCkgKi8KLSAgICBpZiAoKnB0cikgewotCXJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBFeHRyYWN0IHZlbmRvcl9pZCAqLwotICAgIHZlbmRvcl9pZCA9IChpbnQpICgKLQkoKHVuc2lnbmVkIGludCkgcHRyWzFdKSAqIDI1NiAqIDI1NiArCi0JKCh1bnNpZ25lZCBpbnQpIHB0clsyXSkgKiAyNTYgKwotCSgodW5zaWduZWQgaW50KSBwdHJbM10pKTsKLSAgICAvKiBCdW1wIHB0ciB1cCB0byBjb250ZW50cyAqLwotICAgIHB0ciArPSA0OwotCi0gICAgLyogU2V0IGF0dHJsZW4gdG8gbGVuZ3RoIG9mIGRhdGEgKi8KLSAgICBhdHRybGVuIC09IDQ7Ci0gICAgZm9yICg7IGF0dHJsZW47IGF0dHJsZW4gLT0gdmxlbisyLCBwdHIgKz0gdmxlbikgewotCXZ0eXBlID0gKnB0cisrOwotCXZsZW4gPSAqcHRyKys7Ci0JdmxlbiAtPSAyOwotCWlmICh2bGVuIDwgMCB8fCB2bGVuID4gYXR0cmxlbiAtIDIpIHsKLQkgICAgLyogRG8gbm90IGxvZyBhbiBlcnJvci4gIFdlIGFyZSBzdXBwb3NlZCB0byBiZSBhYmxlIHRvIGNvcGUgd2l0aAotCSAgICAgICBhcmJpdHJhcnkgdmVuZG9yLXNwZWNpZmljIGd1bmsgKi8KLQkgICAgcmV0dXJuOwotCX0KLQkvKiBMb29rcyBwbGF1c2libGUuLi4gKi8KLQlpZiAoKGF0dHIgPSByY19kaWN0X2dldGF0dHIodnR5cGUsIHZlbmRvcl9pZCkpID09IE5VTEwpIHsKLQkgICAgY29udGludWU7Ci0JfQotCi0JLyogVE9ETzogQ2hlY2sgdGhhdCBsZW5ndGggbWF0Y2hlcyBkYXRhIHNpemUhISEhISAqLwotCXBhaXIgPSAoVkFMVUVfUEFJUiAqKSBtYWxsb2Moc2l6ZW9mKFZBTFVFX1BBSVIpKTsKLQlpZiAoIXBhaXIpIHsKLQkgICAgbm92bSgicmNfYXZwYWlyX2dlbiIpOwotCSAgICByZXR1cm47Ci0JfQotCXN0cmNweShwYWlyLT5uYW1lLCBhdHRyLT5uYW1lKTsKLQlwYWlyLT5hdHRyaWJ1dGUgPSBhdHRyLT52YWx1ZTsKLQlwYWlyLT52ZW5kb3Jjb2RlID0gdmVuZG9yX2lkOwotCXBhaXItPnR5cGUgPSBhdHRyLT50eXBlOwotCXBhaXItPm5leHQgPSBOVUxMOwotCXN3aXRjaCAoYXR0ci0+dHlwZSkgewotCWNhc2UgUFdfVFlQRV9TVFJJTkc6Ci0JICAgIG1lbWNweSAocGFpci0+c3RydmFsdWUsIChjaGFyICopIHB0ciwgKHNpemVfdCkgdmxlbik7Ci0JICAgIHBhaXItPnN0cnZhbHVlW3ZsZW5dID0gJ1wwJzsKLQkgICAgcGFpci0+bHZhbHVlID0gdmxlbjsKLQkgICAgcmNfYXZwYWlyX2luc2VydCAodnAsIChWQUxVRV9QQUlSICopIE5VTEwsIHBhaXIpOwotCSAgICBicmVhazsKLQotCWNhc2UgUFdfVFlQRV9JTlRFR0VSOgotCWNhc2UgUFdfVFlQRV9JUEFERFI6Ci0JICAgIG1lbWNweSAoKGNoYXIgKikgJmx2YWx1ZSwgKGNoYXIgKikgcHRyLAotCQkgICAgc2l6ZW9mIChVSU5UNCkpOwotCSAgICBwYWlyLT5sdmFsdWUgPSBudG9obCAobHZhbHVlKTsKLQkgICAgcmNfYXZwYWlyX2luc2VydCAodnAsIChWQUxVRV9QQUlSICopIE5VTEwsIHBhaXIpOwotCSAgICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICAgIHdhcm4oInJjX2F2cGFpcl9nZW46ICVzIGhhcyB1bmtub3duIHR5cGUiLCBhdHRyLT5uYW1lKTsKLQkgICAgZnJlZSAocGFpcik7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbjogcmNfYXZwYWlyX2dldAotICoKLSAqIFB1cnBvc2U6IEZpbmQgdGhlIGZpcnN0IGF0dHJpYnV0ZSB2YWx1ZS1wYWlyICh3aGljaCBtYXRjaGVzIHRoZSBnaXZlbgotICogICAgICAgICAgYXR0cmlidXRlKSBmcm9tIHRoZSBzcGVjaWZpZWQgdmFsdWUtcGFpciBsaXN0LgotICoKLSAqIFJldHVybnM6IGZvdW5kIHZhbHVlX3BhaXIKLSAqCi0gKi8KLQotVkFMVUVfUEFJUiAqcmNfYXZwYWlyX2dldCAoVkFMVUVfUEFJUiAqdnAsIFVJTlQ0IGF0dHIpCi17Ci0JZm9yICg7IHZwICE9IChWQUxVRV9QQUlSICopIE5VTEwgJiYgdnAtPmF0dHJpYnV0ZSAhPSBhdHRyOyB2cCA9IHZwLT5uZXh0KQotCXsKLQkJY29udGludWU7Ci0JfQotCXJldHVybiAodnApOwotfQotCi0vKgotICogRnVuY3Rpb246IHJjX2F2cGFpcl9jb3B5Ci0gKgotICogUHVycG9zZTogUmV0dXJuIGEgY29weSBvZiB0aGUgZXhpc3RpbmcgbGlzdCAicCIgYWxhIHN0cmR1cCgpLgotICoKLSAqLwotVkFMVUVfUEFJUiAqcmNfYXZwYWlyX2NvcHkoVkFMVUVfUEFJUiAqcCkKLXsKLQlWQUxVRV9QQUlSICp2cCwgKmZwID0gTlVMTCwgKmxwID0gTlVMTDsKLQotCXdoaWxlIChwKSB7Ci0JCXZwID0gbWFsbG9jKHNpemVvZihWQUxVRV9QQUlSKSk7Ci0JCWlmICghdnApIHsKLQkJICAgIG5vdm0oInJjX2F2cGFpcl9jb3B5Iik7Ci0JCSAgICByZXR1cm4gTlVMTDsgLyogbGVha3MgYSBsaXR0bGUgYnV0IHNvIHdoYXQgKi8KLQkJfQotCQkqdnAgPSAqcDsKLQkJaWYgKCFmcCkKLQkJCWZwID0gdnA7Ci0JCWlmIChscCkKLQkJCWxwLT5uZXh0ID0gdnA7Ci0JCWxwID0gdnA7Ci0JCXAgPSBwLT5uZXh0OwotCX0KLQotCXJldHVybiBmcDsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uOiByY19hdnBhaXJfaW5zZXJ0Ci0gKgotICogUHVycG9zZTogR2l2ZW4gdGhlIGFkZHJlc3Mgb2YgYW4gZXhpc3RpbmcgbGlzdCAiYSIgYW5kIGEgcG9pbnRlcgotICoJICAgIHRvIGFuIGVudHJ5ICJwIiBpbiB0aGF0IGxpc3QsIGFkZCB0aGUgbGlzdCAiYiIgdG8KLSAqCSAgICB0aGUgImEiIGxpc3QgYWZ0ZXIgdGhlICJwIiBlbnRyeS4gIElmICJwIiBpcyBOVUxMLCBhZGQKLSAqCSAgICB0aGUgbGlzdCAiYiIgdG8gdGhlIGVuZCBvZiAiYSIuCi0gKgotICovCi0KLXZvaWQgcmNfYXZwYWlyX2luc2VydCAoVkFMVUVfUEFJUiAqKmEsIFZBTFVFX1BBSVIgKnAsIFZBTFVFX1BBSVIgKmIpCi17Ci0JVkFMVUVfUEFJUiAgICAgKnRoaXNfbm9kZSA9IE5VTEw7Ci0JVkFMVUVfUEFJUiAgICAgKnZwOwotCi0JaWYgKCphID09IChWQUxVRV9QQUlSICopIE5VTEwpCi0JewotCQkqYSA9IGI7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoIWIpCi0JCXJldHVybjsKLQotCXZwID0gKmE7Ci0KLQlpZiAoIHAgPT0gKFZBTFVFX1BBSVIgKikgTlVMTCkgLyogcnVuIHRvIGVuZCBvZiAiYSIgbGlzdCAqLwotCXsKLQkJd2hpbGUgKHZwICE9IChWQUxVRV9QQUlSICopIE5VTEwpCi0JCXsKLQkJCXRoaXNfbm9kZSA9IHZwOwotCQkJdnAgPSB2cC0+bmV4dDsKLQkJfQotCX0KLQllbHNlIC8qIGxvb2sgZm9yIHRoZSAicCIgZW50cnkgaW4gdGhlICJhIiBsaXN0IChvciBydW4gdG8gZW5kKSAqLwotCXsKLQkJdGhpc19ub2RlID0gKmE7Ci0JCXdoaWxlICh0aGlzX25vZGUgIT0gKFZBTFVFX1BBSVIgKikgTlVMTCkKLQkJewotCQkJaWYgKHRoaXNfbm9kZSA9PSBwKQotCQkJewotCQkJCWJyZWFrOwotCQkJfQotCQkJdGhpc19ub2RlID0gdGhpc19ub2RlLT5uZXh0OwotCQl9Ci0JfQotCi0JLyogYWRkICJiIiBhdCB0aGlzX25vZGUgKi8KLQl2cCA9IHRoaXNfbm9kZS0+bmV4dDsKLQl0aGlzX25vZGUtPm5leHQgPSBiOwotCi0JLyogcnVuIHRvIGVuZCBvZiAiYiIgYW5kIGNvbm5lY3QgdGhlIHJlc3Qgb2YgImEiICovCi0Jd2hpbGUgKGItPm5leHQpCi0JCWIgPSBiLT5uZXh0OwotCWItPm5leHQgPSB2cDsKLQotCXJldHVybjsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uOiByY19hdnBhaXJfZnJlZQotICoKLSAqIFB1cnBvc2U6IGZyZWVzIGFsbCB2YWx1ZV9wYWlycyBpbiB0aGUgbGlzdAotICoKLSAqLwotCi12b2lkIHJjX2F2cGFpcl9mcmVlIChWQUxVRV9QQUlSICpwYWlyKQotewotCVZBTFVFX1BBSVIgICAgICpuZXh0OwotCi0Jd2hpbGUgKHBhaXIgIT0gKFZBTFVFX1BBSVIgKikgTlVMTCkKLQl7Ci0JCW5leHQgPSBwYWlyLT5uZXh0OwotCQlmcmVlIChwYWlyKTsKLQkJcGFpciA9IG5leHQ7Ci0JfQotfQotCi0vKgotICogRnVuY3Rpb246IHJjX2ZpZWxkY3B5Ci0gKgotICogUHVycG9zZTogQ29weSBhIGRhdGEgZmllbGQgZnJvbSB0aGUgYnVmZmVyLiAgQWR2YW5jZSB0aGUgYnVmZmVyCi0gKiAgICAgICAgICBwYXN0IHRoZSBkYXRhIGZpZWxkLgotICoKLSAqLwotCi1zdGF0aWMgdm9pZCByY19maWVsZGNweSAoY2hhciAqc3RyaW5nLCBjaGFyICoqdXB0cikKLXsKLQljaGFyICAgICAgICAgICAqcHRyOwotCi0JcHRyID0gKnVwdHI7Ci0JaWYgKCpwdHIgPT0gJyInKQotCXsKLQkJcHRyKys7Ci0JCXdoaWxlICgqcHRyICE9ICciJyAmJiAqcHRyICE9ICdcMCcgJiYgKnB0ciAhPSAnXG4nKQotCQl7Ci0JCQkqc3RyaW5nKysgPSAqcHRyKys7Ci0JCX0KLQkJKnN0cmluZyA9ICdcMCc7Ci0JCWlmICgqcHRyID09ICciJykKLQkJewotCQkJcHRyKys7Ci0JCX0KLQkJKnVwdHIgPSBwdHI7Ci0JCXJldHVybjsKLQl9Ci0KLQl3aGlsZSAoKnB0ciAhPSAnICcgJiYgKnB0ciAhPSAnXHQnICYmICpwdHIgIT0gJ1wwJyAmJiAqcHRyICE9ICdcbicgJiYKLQkJCSpwdHIgIT0gJz0nICYmICpwdHIgIT0gJywnKQotCXsKLQkJKnN0cmluZysrID0gKnB0cisrOwotCX0KLQkqc3RyaW5nID0gJ1wwJzsKLQkqdXB0ciA9IHB0cjsKLQlyZXR1cm47Ci19Ci0KLQotLyoKLSAqIEZ1bmN0aW9uOiByY19hdnBhaXJfcGFyc2UKLSAqCi0gKiBQdXJwb3NlOiBwYXJzZXMgdGhlIGJ1ZmZlciB0byBleHRyYWN0IHRoZSBhdHRyaWJ1dGUtdmFsdWUgcGFpcnMuCi0gKgotICogUmV0dXJuczogMCA9IHN1Y2Nlc3NmdWwgcGFyc2Ugb2YgYXR0cmlidXRlLXZhbHVlIHBhaXIsCi0gKgkgICAtMSA9IHN5bnRheCAob3Igb3RoZXIpIGVycm9yIGRldGVjdGVkLgotICoKLSAqLwotCi0jZGVmaW5lIFBBUlNFX01PREVfTkFNRQkJMAotI2RlZmluZSBQQVJTRV9NT0RFX0VRVUFMCTEKLSNkZWZpbmUgUEFSU0VfTU9ERV9WQUxVRQkyCi0jZGVmaW5lIFBBUlNFX01PREVfSU5WQUxJRAkzCi0KLWludCByY19hdnBhaXJfcGFyc2UgKGNoYXIgKmJ1ZmZlciwgVkFMVUVfUEFJUiAqKmZpcnN0X3BhaXIpCi17Ci0JaW50ICAgICAgICAgICAgIG1vZGU7Ci0JY2hhciAgICAgICAgICAgIGF0dHJzdHJbQVVUSF9JRF9MRU5dOwotCWNoYXIgICAgICAgICAgICB2YWxzdHJbQVVUSF9JRF9MRU5dOwotCURJQ1RfQVRUUiAgICAgICphdHRyID0gTlVMTDsKLQlESUNUX1ZBTFVFICAgICAqZHZhbDsKLQlWQUxVRV9QQUlSICAgICAqcGFpcjsKLQlWQUxVRV9QQUlSICAgICAqbGluazsKLQlzdHJ1Y3QgdG0gICAgICAqdG07Ci0JdGltZV90ICAgICAgICAgIHRpbWV2YWw7Ci0KLQltb2RlID0gUEFSU0VfTU9ERV9OQU1FOwotCXdoaWxlICgqYnVmZmVyICE9ICdcbicgJiYgKmJ1ZmZlciAhPSAnXDAnKQotCXsKLQkJaWYgKCpidWZmZXIgPT0gJyAnIHx8ICpidWZmZXIgPT0gJ1x0JykKLQkJewotCQkJYnVmZmVyKys7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXN3aXRjaCAobW9kZSkKLQkJewotCQkgICAgY2FzZSBQQVJTRV9NT0RFX05BTUU6CQkvKiBBdHRyaWJ1dGUgTmFtZSAqLwotCQkJcmNfZmllbGRjcHkgKGF0dHJzdHIsICZidWZmZXIpOwotCQkJaWYgKChhdHRyID0KLQkJCQlyY19kaWN0X2ZpbmRhdHRyIChhdHRyc3RyKSkgPT0gKERJQ1RfQVRUUiAqKSBOVUxMKQotCQkJewotCQkJCWVycm9yKCJyY19hdnBhaXJfcGFyc2U6IHVua25vd24gYXR0cmlidXRlIik7Ci0JCQkJaWYgKCpmaXJzdF9wYWlyKSB7Ci0JCQkJCXJjX2F2cGFpcl9mcmVlKCpmaXJzdF9wYWlyKTsKLQkJCQkJKmZpcnN0X3BhaXIgPSAoVkFMVUVfUEFJUiAqKSBOVUxMOwotCQkJCX0KLQkJCQlyZXR1cm4gKC0xKTsKLQkJCX0KLQkJCW1vZGUgPSBQQVJTRV9NT0RFX0VRVUFMOwotCQkJYnJlYWs7Ci0KLQkJICAgIGNhc2UgUEFSU0VfTU9ERV9FUVVBTDoJCS8qIEVxdWFsIHNpZ24gKi8KLQkJCWlmICgqYnVmZmVyID09ICc9JykKLQkJCXsKLQkJCQltb2RlID0gUEFSU0VfTU9ERV9WQUxVRTsKLQkJCQlidWZmZXIrKzsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQllcnJvcigicmNfYXZwYWlyX3BhcnNlOiBtaXNzaW5nIG9yIG1pc3BsYWNlZCBlcXVhbCBzaWduIik7Ci0JCQkJaWYgKCpmaXJzdF9wYWlyKSB7Ci0JCQkJCXJjX2F2cGFpcl9mcmVlKCpmaXJzdF9wYWlyKTsKLQkJCQkJKmZpcnN0X3BhaXIgPSAoVkFMVUVfUEFJUiAqKSBOVUxMOwotCQkJCX0KLQkJCQlyZXR1cm4gKC0xKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCSAgICBjYXNlIFBBUlNFX01PREVfVkFMVUU6CQkvKiBWYWx1ZSAqLwotCQkJcmNfZmllbGRjcHkgKHZhbHN0ciwgJmJ1ZmZlcik7Ci0KLQkJCWlmICgocGFpciA9Ci0JCQkJKFZBTFVFX1BBSVIgKikgbWFsbG9jIChzaXplb2YgKFZBTFVFX1BBSVIpKSkKLQkJCQkJCQk9PSAoVkFMVUVfUEFJUiAqKSBOVUxMKQotCQkJewotCQkJCW5vdm0oInJjX2F2cGFpcl9wYXJzZSIpOwotCQkJCWlmICgqZmlyc3RfcGFpcikgewotCQkJCQlyY19hdnBhaXJfZnJlZSgqZmlyc3RfcGFpcik7Ci0JCQkJCSpmaXJzdF9wYWlyID0gKFZBTFVFX1BBSVIgKikgTlVMTDsKLQkJCQl9Ci0JCQkJcmV0dXJuICgtMSk7Ci0JCQl9Ci0JCQlzdHJjcHkgKHBhaXItPm5hbWUsIGF0dHItPm5hbWUpOwotCQkJcGFpci0+YXR0cmlidXRlID0gYXR0ci0+dmFsdWU7Ci0JCQlwYWlyLT50eXBlID0gYXR0ci0+dHlwZTsKLQkJCXBhaXItPnZlbmRvcmNvZGUgPSBhdHRyLT52ZW5kb3Jjb2RlOwotCi0JCQlzd2l0Y2ggKHBhaXItPnR5cGUpCi0JCQl7Ci0KLQkJCSAgICBjYXNlIFBXX1RZUEVfU1RSSU5HOgotCQkJCXN0cmNweSAocGFpci0+c3RydmFsdWUsIHZhbHN0cik7Ci0JCQkJcGFpci0+bHZhbHVlID0gc3RybGVuKHZhbHN0cik7Ci0JCQkJYnJlYWs7Ci0KLQkJCSAgICBjYXNlIFBXX1RZUEVfSU5URUdFUjoKLQkJCQlpZiAoaXNkaWdpdCAoKnZhbHN0cikpCi0JCQkJewotCQkJCQlwYWlyLT5sdmFsdWUgPSBhdG9pICh2YWxzdHIpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlpZiAoKGR2YWwgPSByY19kaWN0X2ZpbmR2YWwgKHZhbHN0cikpCi0JCQkJCQkJPT0gKERJQ1RfVkFMVUUgKikgTlVMTCkKLQkJCQkJewotCQkJCQkJZXJyb3IoInJjX2F2cGFpcl9wYXJzZTogdW5rbm93biBhdHRyaWJ1dGUgdmFsdWU6ICVzIiwgdmFsc3RyKTsKLQkJCQkJCWlmICgqZmlyc3RfcGFpcikgewotCQkJCQkJCXJjX2F2cGFpcl9mcmVlKCpmaXJzdF9wYWlyKTsKLQkJCQkJCQkqZmlyc3RfcGFpciA9IChWQUxVRV9QQUlSICopIE5VTEw7Ci0JCQkJCQl9Ci0JCQkJCQlmcmVlIChwYWlyKTsKLQkJCQkJCXJldHVybiAoLTEpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcGFpci0+bHZhbHVlID0gZHZhbC0+dmFsdWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCSAgICBjYXNlIFBXX1RZUEVfSVBBRERSOgotCQkJCXBhaXItPmx2YWx1ZSA9IHJjX2dldF9pcGFkZHIodmFsc3RyKTsKLQkJCQlicmVhazsKLQotCQkJICAgIGNhc2UgUFdfVFlQRV9EQVRFOgotCQkJCXRpbWV2YWwgPSB0aW1lICgwKTsKLQkJCQl0bSA9IGxvY2FsdGltZSAoJnRpbWV2YWwpOwotCQkJCXRtLT50bV9ob3VyID0gMDsKLQkJCQl0bS0+dG1fbWluID0gMDsKLQkJCQl0bS0+dG1fc2VjID0gMDsKLQkJCQlyY19zdHIydG0gKHZhbHN0ciwgdG0pOwotI2lmZGVmIFRJTUVMT0NBTAotCQkJCXBhaXItPmx2YWx1ZSA9IChVSU5UNCkgdGltZWxvY2FsICh0bSk7Ci0jZWxzZQkvKiBUSU1FTE9DQUwgKi8KLQkJCQlwYWlyLT5sdmFsdWUgPSAoVUlOVDQpIG1rdGltZSAodG0pOwotI2VuZGlmCS8qIFRJTUVMT0NBTCAqLwotCQkJCWJyZWFrOwotCi0JCQkgICAgZGVmYXVsdDoKLQkJCQllcnJvcigicmNfYXZwYWlyX3BhcnNlOiB1bmtub3duIGF0dHJpYnV0ZSB0eXBlICVkIiwgcGFpci0+dHlwZSk7Ci0JCQkJaWYgKCpmaXJzdF9wYWlyKSB7Ci0JCQkJCXJjX2F2cGFpcl9mcmVlKCpmaXJzdF9wYWlyKTsKLQkJCQkJKmZpcnN0X3BhaXIgPSAoVkFMVUVfUEFJUiAqKSBOVUxMOwotCQkJCX0KLQkJCQlmcmVlIChwYWlyKTsKLQkJCQlyZXR1cm4gKC0xKTsKLQkJCX0KLQkJCXBhaXItPm5leHQgPSAoVkFMVUVfUEFJUiAqKSBOVUxMOwotCi0JCQlpZiAoKmZpcnN0X3BhaXIgPT0gKFZBTFVFX1BBSVIgKikgTlVMTCkKLQkJCXsKLQkJCQkqZmlyc3RfcGFpciA9IHBhaXI7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJbGluayA9ICpmaXJzdF9wYWlyOwotCQkJCXdoaWxlIChsaW5rLT5uZXh0ICE9IChWQUxVRV9QQUlSICopIE5VTEwpCi0JCQkJewotCQkJCQlsaW5rID0gbGluay0+bmV4dDsKLQkJCQl9Ci0JCQkJbGluay0+bmV4dCA9IHBhaXI7Ci0JCQl9Ci0KLQkJCW1vZGUgPSBQQVJTRV9NT0RFX05BTUU7Ci0JCQlicmVhazsKLQotCQkgICAgZGVmYXVsdDoKLQkJCW1vZGUgPSBQQVJTRV9NT0RFX05BTUU7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gKDApOwotfQotCi0vKgotICogRnVuY3Rpb246IHJjX2F2cGFpcl90b3N0cgotICoKLSAqIFB1cnBvc2U6IFRyYW5zbGF0ZSBhbiBhdl9wYWlyIGludG8gdHdvIHN0cmluZ3MKLSAqCi0gKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKLSAqCi0gKi8KLQotaW50IHJjX2F2cGFpcl90b3N0ciAoVkFMVUVfUEFJUiAqcGFpciwgY2hhciAqbmFtZSwgaW50IGxuLCBjaGFyICp2YWx1ZSwgaW50IGx2KQotewotCURJQ1RfVkFMVUUgICAgICpkdmFsOwotCWNoYXIgICAgICAgICAgICBidWZmZXJbMzJdOwotCXN0cnVjdCBpbl9hZGRyICBpbmFkOwotCXVuc2lnbmVkIGNoYXIgICAgICAgICAqcHRyOwotCi0JKm5hbWUgPSAqdmFsdWUgPSAnXDAnOwotCi0JaWYgKCFwYWlyIHx8IHBhaXItPm5hbWVbMF0gPT0gJ1wwJykgewotCQllcnJvcigicmNfYXZwYWlyX3Rvc3RyOiBwYWlyIGlzIE5VTEwgb3IgZW1wdHkiKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCi0Jc3RybmNweShuYW1lLCBwYWlyLT5uYW1lLCAoc2l6ZV90KSBsbik7Ci0KLQlzd2l0Y2ggKHBhaXItPnR5cGUpCi0JewotCSAgICBjYXNlIFBXX1RZUEVfU1RSSU5HOgotCQlsdi0tOwotCQlwdHIgPSAodW5zaWduZWQgY2hhciAqKSBwYWlyLT5zdHJ2YWx1ZTsKLQkJd2hpbGUgKCpwdHIgIT0gJ1wwJykKLQkJewotCQkJaWYgKCEoaXNwcmludCAoKnB0cikpKQotCQkJewotCQkJCXNwcmludGYgKGJ1ZmZlciwgIlxcJTAzbyIsICpwdHIpOwotCQkJCXN0cm5jYXQodmFsdWUsIGJ1ZmZlciwgKHNpemVfdCkgbHYpOwotCQkJCWx2IC09IDQ7Ci0JCQkJaWYgKGx2IDwgMCkgYnJlYWs7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJc3RybmNhdCh2YWx1ZSwgcHRyLCAxKTsKLQkJCQlsdi0tOwotCQkJCWlmIChsdiA8IDApIGJyZWFrOwotCQkJfQotCQkJcHRyKys7Ci0JCX0KLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSBQV19UWVBFX0lOVEVHRVI6Ci0JCWR2YWwgPSByY19kaWN0X2dldHZhbCAocGFpci0+bHZhbHVlLCBwYWlyLT5uYW1lKTsKLQkJaWYgKGR2YWwgIT0gKERJQ1RfVkFMVUUgKikgTlVMTCkKLQkJewotCQkJc3RybmNweSh2YWx1ZSwgZHZhbC0+bmFtZSwgKHNpemVfdCkgbHYtMSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzcHJpbnRmIChidWZmZXIsICIlbGQiLCBwYWlyLT5sdmFsdWUpOwotCQkJc3RybmNweSh2YWx1ZSwgYnVmZmVyLCAoc2l6ZV90KSBsdik7Ci0JCX0KLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSBQV19UWVBFX0lQQUREUjoKLQkJaW5hZC5zX2FkZHIgPSBodG9ubChwYWlyLT5sdmFsdWUpOwotCQlzdHJuY3B5ICh2YWx1ZSwgaW5ldF9udG9hIChpbmFkKSwgKHNpemVfdCkgbHYtMSk7Ci0JCWJyZWFrOwotCi0JICAgIGNhc2UgUFdfVFlQRV9EQVRFOgotCQlzdHJmdGltZSAoYnVmZmVyLCBzaXplb2YgKGJ1ZmZlciksICIlbS8lZC8leSAlSDolTTolUyIsCi0JCQkgIGdtdGltZSAoKHRpbWVfdCAqKSAmIHBhaXItPmx2YWx1ZSkpOwotCQlzdHJuY3B5KHZhbHVlLCBidWZmZXIsIGx2LTEpOwotCQlicmVhazsKLQotCSAgICBkZWZhdWx0OgotCQllcnJvcigicmNfYXZwYWlyX3Rvc3RyOiB1bmtub3duIGF0dHJpYnV0ZSB0eXBlICVkIiwgcGFpci0+dHlwZSk7Ci0JCXJldHVybiAoLTEpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uOiByY19hdnBhaXJfcmVhZGluCi0gKgotICogUHVycG9zZTogZ2V0IGEgc2VxdWVuY2Ugb2YgYXR0cmlidXRlIHZhbHVlIHBhaXJzIGZyb20gdGhlIGZpbGUgaW5wdXQKLSAqCSAgICBhbmQgbWFrZSB0aGVtIGludG8gYSBsaXN0IG9mIHZhbHVlX3BhaXJzCi0gKgotICovCi0KLVZBTFVFX1BBSVIgKnJjX2F2cGFpcl9yZWFkaW4oRklMRSAqaW5wdXQpCi17Ci0JVkFMVUVfUEFJUiAqdnAgPSBOVUxMOwotCWNoYXIgYnVmZmVyWzEwMjRdLCAqcTsKLQotCXdoaWxlIChmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBpbnB1dCkgIT0gTlVMTCkKLQl7Ci0JCXEgPSBidWZmZXI7Ci0KLQkJd2hpbGUoKnEgJiYgaXNzcGFjZSgqcSkpIHErKzsKLQotCQlpZiAoKCpxID09ICdcbicpIHx8ICgqcSA9PSAnIycpIHx8ICgqcSA9PSAnXDAnKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChyY19hdnBhaXJfcGFyc2UocSwgJnZwKSA8IDApIHsKLQkJCWVycm9yKCJyY19hdnBhaXJfcmVhZGluOiBtYWxmb3JtZWQgYXR0cmlidXRlOiAlcyIsIGJ1ZmZlcik7Ci0JCQlyY19hdnBhaXJfZnJlZSh2cCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQotCXJldHVybiB2cDsKLX0KZGlmZiAtLWdpdCBhL3BwcGQvcGx1Z2lucy9yYWRpdXMvYnVpbGRyZXEuYyBiL3BwcGQvcGx1Z2lucy9yYWRpdXMvYnVpbGRyZXEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU1YjA1Mi4uMDAwMDAwMAotLS0gYS9wcHBkL3BsdWdpbnMvcmFkaXVzL2J1aWxkcmVxLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDYgKzAsMCBAQAotLyoKLSAqICRJZDogYnVpbGRyZXEuYyx2IDEuMSAyMDA0LzExLzE0IDA3OjI2OjI2IHBhdWx1cyBFeHAgJAotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NSwxOTk3IExhcnMgRmVubmViZXJnCi0gKgotICogU2VlIHRoZSBmaWxlIENPUFlSSUdIVCBmb3IgdGhlIHJlc3BlY3RpdmUgdGVybXMgYW5kIGNvbmRpdGlvbnMuCi0gKiBJZiB0aGUgZmlsZSBpcyBtaXNzaW5nIGNvbnRhY3QgbWUgYXQgbGZAZWxlbWVudGFsLm5ldAotICogYW5kIEknbGwgc2VuZCB5b3UgYSBjb3B5LgotICoKLSAqLwotCi0jaW5jbHVkZSA8aW5jbHVkZXMuaD4KLSNpbmNsdWRlIDxyYWRpdXNjbGllbnQuaD4KLQotdW5zaWduZWQgY2hhciByY19nZXRfc2VxbmJyKHZvaWQpOwotCi0vKgotICogRnVuY3Rpb246IHJjX2dldF9uYXNfaWQKLSAqCi0gKiBQdXJwb3NlOiBmaWxscyBpbiBOQVMtSWRlbnRpZmllciBvciBOQVMtSVAtQWRkcmVzcyBpbiByZXF1ZXN0Ci0gKgotICovCi0KLWludCByY19nZXRfbmFzX2lkKFZBTFVFX1BBSVIgKipzZW5kcGFpcnMpCi17Ci0JVUlOVDQJCWNsaWVudF9pZDsKLQljaGFyICpuYXNpZDsKLQotCW5hc2lkID0gcmNfY29uZl9zdHIoIm5hc19pZGVudGlmaWVyIik7Ci0JaWYgKHN0cmxlbihuYXNpZCkpIHsKLQkJLyoKLQkJICogRmlsbCBpbiBOQVMtSWRlbnRpZmllcgotCQkgKi8KLQkJaWYgKHJjX2F2cGFpcl9hZGQoc2VuZHBhaXJzLCBQV19OQVNfSURFTlRJRklFUiwgbmFzaWQsIDAsCi0JCQkJICBWRU5ET1JfTk9ORSkgPT0gTlVMTCkKLQkJCXJldHVybiAoRVJST1JfUkMpOwotCi0JCXJldHVybiAoT0tfUkMpOwotCSAgCi0JfSBlbHNlIHsKLQkJLyoKLQkJICogRmlsbCBpbiBOQVMtSVAtQWRkcmVzcwotCQkgKi8KLQkJaWYgKChjbGllbnRfaWQgPSByY19vd25faXBhZGRyZXNzKCkpID09IDApCi0JCQlyZXR1cm4gKEVSUk9SX1JDKTsKLQotCQlpZiAocmNfYXZwYWlyX2FkZChzZW5kcGFpcnMsIFBXX05BU19JUF9BRERSRVNTLCAmY2xpZW50X2lkLAotCQkJCSAgMCwgVkVORE9SX05PTkUpID09IE5VTEwpCi0JCQlyZXR1cm4gKEVSUk9SX1JDKTsKLQl9Ci0KLQlyZXR1cm4gKE9LX1JDKTsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uOiByY19idWlsZHJlcQotICoKLSAqIFB1cnBvc2U6IGJ1aWxkcyBhIHNrZWxldG9uIFJBRElVUyByZXF1ZXN0IHVzaW5nIGluZm9ybWF0aW9uIGZyb20gdGhlCi0gKgkgICAgY29uZmlnIGZpbGUuCi0gKgotICovCi0KLXZvaWQgcmNfYnVpbGRyZXEoU0VORF9EQVRBICpkYXRhLCBpbnQgY29kZSwgY2hhciAqc2VydmVyLCB1bnNpZ25lZCBzaG9ydCBwb3J0LAotCQkgaW50IHRpbWVvdXQsIGludCByZXRyaWVzKQotewotCWRhdGEtPnNlcnZlciA9IHNlcnZlcjsKLQlkYXRhLT5zdmNfcG9ydCA9IHBvcnQ7Ci0JZGF0YS0+c2VxX25iciA9IHJjX2dldF9zZXFuYnIoKTsKLQlkYXRhLT50aW1lb3V0ID0gdGltZW91dDsKLQlkYXRhLT5yZXRyaWVzID0gcmV0cmllczsKLQlkYXRhLT5jb2RlID0gY29kZTsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uOiByY19ndWVzc19zZXFuYnIKLSAqCi0gKiBQdXJwb3NlOiByZXR1cm4gYSByYW5kb20gc2VxdWVuY2UgbnVtYmVyCi0gKgotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHJjX2d1ZXNzX3NlcW5icih2b2lkKQotewotCXJldHVybiAodW5zaWduZWQgY2hhcikobWFnaWMoKSAmIFVDSEFSX01BWCk7Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbjogcmNfZ2V0X3NlcW5icgotICoKLSAqIFB1cnBvc2U6IGdlbmVyYXRlIGEgc2VxdWVuY2UgbnVtYmVyCi0gKgotICovCi0KLXVuc2lnbmVkIGNoYXIgcmNfZ2V0X3NlcW5icih2b2lkKQotewotCUZJTEUgKnNmOwotCWludCB0cmllcyA9IDE7Ci0JaW50IHNlcV9uYnIsIHBvczsKLQljaGFyICpzZXFmaWxlID0gcmNfY29uZl9zdHIoInNlcWZpbGUiKTsKLQotCWlmICgoc2YgPSBmb3BlbihzZXFmaWxlLCAiYSsiKSkgPT0gTlVMTCkKLQl7Ci0JCWVycm9yKCJyY19nZXRfc2VxbmJyOiBjb3VsZG4ndCBvcGVuIHNlcXVlbmNlIGZpbGUgJXM6ICVzIiwgc2VxZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJLyogd2VsbCwgc28gZ3Vlc3MgYSBzZXF1ZW5jZSBudW1iZXIgKi8KLQkJcmV0dXJuIHJjX2d1ZXNzX3NlcW5icigpOwotCX0KLQotCXdoaWxlIChkb19sb2NrX2V4Y2x1c2l2ZShmaWxlbm8oc2YpKSE9IDApCi0JewotCQlpZiAoZXJybm8gIT0gRVdPVUxEQkxPQ0spIHsKLQkJCWVycm9yKCJyY19nZXRfc2VxbmJyOiBmbG9jayBmYWlsdXJlOiAlczogJXMiLCBzZXFmaWxlLCBzdHJlcnJvcihlcnJubykpOwotCQkJZmNsb3NlKHNmKTsKLQkJCXJldHVybiByY19ndWVzc19zZXFuYnIoKTsKLQkJfQotCQl0cmllcysrOwotCQlpZiAodHJpZXMgPD0gMTApCi0JCQlyY19tZGVsYXkoNTAwKTsKLQkJZWxzZQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKHRyaWVzID4gMTApIHsKLQkJZXJyb3IoInJjX2dldF9zZXFuYnI6IGNvdWxkbid0IGdldCBsb2NrIGFmdGVyICVkIHRyaWVzOiAlcyIsIHRyaWVzLTEsIHNlcWZpbGUpOwotCQlmY2xvc2Uoc2YpOwotCQlyZXR1cm4gcmNfZ3Vlc3Nfc2VxbmJyKCk7Ci0JfQotCi0JcG9zID0gZnRlbGwoc2YpOwotCXJld2luZChzZik7Ci0JaWYgKGZzY2FuZihzZiwgIiVkIiwgJnNlcV9uYnIpICE9IDEpIHsKLQkJaWYgKHBvcyAhPSBmdGVsbChzZikpIHsKLQkJCS8qIGZpbGUgd2FzIG5vdCBlbXB0eSAqLwotCQkJZXJyb3IoInJjX2dldF9zZXFuYnI6IGZzY2FuZiBmYWlsdXJlOiAlcyIsIHNlcWZpbGUpOwotCQl9Ci0JCXNlcV9uYnIgPSByY19ndWVzc19zZXFuYnIoKTsKLQl9Ci0KLQlyZXdpbmQoc2YpOwotCWZ0cnVuY2F0ZShmaWxlbm8oc2YpLDApOwotCWZwcmludGYoc2YsIiVkXG4iLCAoc2VxX25icisxKSAmIFVDSEFSX01BWCk7Ci0KLQlmZmx1c2goc2YpOyAvKiBmZmx1c2ggYmVjYXVzZSBhIHByb2Nlc3MgbWF5IHJlYWQgaXQgYmV0d2VlbiB0aGUgZG9fdW5sb2NrIGFuZCBmY2xvc2UgKi8KLQotCWlmIChkb191bmxvY2soZmlsZW5vKHNmKSkgIT0gMCkKLQkJZXJyb3IoInJjX2dldF9zZXFuYnI6IGNvdWxkbid0IHJlbGVhc2UgbG9jayBvbiAlczogJXMiLCBzZXFmaWxlLCBzdHJlcnJvcihlcnJubykpOwotCi0JZmNsb3NlKHNmKTsKLQotCXJldHVybiAodW5zaWduZWQgY2hhcilzZXFfbmJyOwotfQotCi0vKgotICogRnVuY3Rpb246IHJjX2F1dGgKLSAqCi0gKiBQdXJwb3NlOiBCdWlsZHMgYW4gYXV0aGVudGljYXRpb24gcmVxdWVzdCBmb3IgcG9ydCBpZCBjbGllbnRfcG9ydAotICoJICAgIHdpdGggdGhlIHZhbHVlX3BhaXJzIHNlbmQgYW5kIHN1Ym1pdHMgaXQgdG8gYSBzZXJ2ZXIKLSAqCi0gKiBSZXR1cm5zOiByZWNlaXZlZCB2YWx1ZV9wYWlycyBpbiByZWNlaXZlZCwgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyIGluIG1zZwotICoJICAgIGFuZCAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUgYXMgcmV0dXJuIHZhbHVlCi0gKgotICovCi0KLWludCByY19hdXRoKFVJTlQ0IGNsaWVudF9wb3J0LCBWQUxVRV9QQUlSICpzZW5kLCBWQUxVRV9QQUlSICoqcmVjZWl2ZWQsCi0JICAgIGNoYXIgKm1zZywgUkVRVUVTVF9JTkZPICppbmZvKQotewotICAgIFNFUlZFUiAqYXV0aHNlcnZlciA9IHJjX2NvbmZfc3J2KCJhdXRoc2VydmVyIik7Ci0KLSAgICBpZiAoIWF1dGhzZXJ2ZXIpIHsKLQlyZXR1cm4gKEVSUk9SX1JDKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJjX2F1dGhfdXNpbmdfc2VydmVyKGF1dGhzZXJ2ZXIsIGNsaWVudF9wb3J0LCBzZW5kLCByZWNlaXZlZCwKLQkJCQltc2csIGluZm8pOwotfQotCi0vKgotICogRnVuY3Rpb246IHJjX2F1dGhfdXNpbmdfc2VydmVyCi0gKgotICogUHVycG9zZTogQnVpbGRzIGFuIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgZm9yIHBvcnQgaWQgY2xpZW50X3BvcnQKLSAqCSAgICB3aXRoIHRoZSB2YWx1ZV9wYWlycyBzZW5kIGFuZCBzdWJtaXRzIGl0IHRvIGEgc2VydmVyLiAgWW91Ci0gKiAgICAgICAgICBleHBsaWNpdGx5IHN1cHBseSBhIHNlcnZlciBsaXN0LgotICoKLSAqIFJldHVybnM6IHJlY2VpdmVkIHZhbHVlX3BhaXJzIGluIHJlY2VpdmVkLCBtZXNzYWdlcyBmcm9tIHRoZSBzZXJ2ZXIgaW4gbXNnCi0gKgkgICAgYW5kIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZSBhcyByZXR1cm4gdmFsdWUKLSAqCi0gKi8KLQotaW50IHJjX2F1dGhfdXNpbmdfc2VydmVyKFNFUlZFUiAqYXV0aHNlcnZlciwKLQkJCSBVSU5UNCBjbGllbnRfcG9ydCwKLQkJCSBWQUxVRV9QQUlSICpzZW5kLAotCQkJIFZBTFVFX1BBSVIgKipyZWNlaXZlZCwKLQkJCSBjaGFyICptc2csIFJFUVVFU1RfSU5GTyAqaW5mbykKLXsKLQlTRU5EX0RBVEEgICAgICAgZGF0YTsKLQlpbnQJCXJlc3VsdDsKLQlpbnQJCWk7Ci0JaW50CQl0aW1lb3V0ID0gcmNfY29uZl9pbnQoInJhZGl1c190aW1lb3V0Iik7Ci0JaW50CQlyZXRyaWVzID0gcmNfY29uZl9pbnQoInJhZGl1c19yZXRyaWVzIik7Ci0KLQlkYXRhLnNlbmRfcGFpcnMgPSBzZW5kOwotCWRhdGEucmVjZWl2ZV9wYWlycyA9IE5VTEw7Ci0KLQkvKgotCSAqIEZpbGwgaW4gTkFTLUlQLUFkZHJlc3Mgb3IgTkFTLUlkZW50aWZpZXIKLQkgKi8KLQotCWlmIChyY19nZXRfbmFzX2lkKCYoZGF0YS5zZW5kX3BhaXJzKSkgPT0gRVJST1JfUkMpCi0JICAgIHJldHVybiAoRVJST1JfUkMpOwotCi0JLyoKLQkgKiBGaWxsIGluIE5BUy1Qb3J0Ci0JICovCi0KLQlpZiAocmNfYXZwYWlyX2FkZCgmKGRhdGEuc2VuZF9wYWlycyksIFBXX05BU19QT1JULCAmY2xpZW50X3BvcnQsIDAsIFZFTkRPUl9OT05FKSA9PSBOVUxMKQotCQlyZXR1cm4gKEVSUk9SX1JDKTsKLQotCXJlc3VsdCA9IEVSUk9SX1JDOwotCWZvcihpPTA7IChpPGF1dGhzZXJ2ZXItPm1heCkgJiYgKHJlc3VsdCAhPSBPS19SQykgJiYgKHJlc3VsdCAhPSBCQURSRVNQX1JDKQotCQk7IGkrKykKLQl7Ci0JCWlmIChkYXRhLnJlY2VpdmVfcGFpcnMgIT0gTlVMTCkgewotCQkJcmNfYXZwYWlyX2ZyZWUoZGF0YS5yZWNlaXZlX3BhaXJzKTsKLQkJCWRhdGEucmVjZWl2ZV9wYWlycyA9IE5VTEw7Ci0JCX0KLQkJcmNfYnVpbGRyZXEoJmRhdGEsIFBXX0FDQ0VTU19SRVFVRVNULCBhdXRoc2VydmVyLT5uYW1lW2ldLAotCQkJICAgIGF1dGhzZXJ2ZXItPnBvcnRbaV0sIHRpbWVvdXQsIHJldHJpZXMpOwotCi0JCXJlc3VsdCA9IHJjX3NlbmRfc2VydmVyICgmZGF0YSwgbXNnLCBpbmZvKTsKLQl9Ci0KLQkqcmVjZWl2ZWQgPSBkYXRhLnJlY2VpdmVfcGFpcnM7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKgotICogRnVuY3Rpb246IHJjX2F1dGhfcHJveHkKLSAqCi0gKiBQdXJwb3NlOiBCdWlsZHMgYW4gYXV0aGVudGljYXRpb24gcmVxdWVzdAotICoJICAgIHdpdGggdGhlIHZhbHVlX3BhaXJzIHNlbmQgYW5kIHN1Ym1pdHMgaXQgdG8gYSBzZXJ2ZXIuCi0gKgkgICAgV29ya3MgZm9yIGEgcHJveHk7IGRvZXMgbm90IGFkZCBJUCBhZGRyZXNzLCBhbmQgZG9lcwotICoJICAgIGRvZXMgbm90IHJlbHkgb24gY29uZmlnIGZpbGUuCi0gKgotICogUmV0dXJuczogcmVjZWl2ZWQgdmFsdWVfcGFpcnMgaW4gcmVjZWl2ZWQsIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlciBpbiBtc2cKLSAqCSAgICBhbmQgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlIGFzIHJldHVybiB2YWx1ZQotICoKLSAqLwotCi1pbnQgcmNfYXV0aF9wcm94eShWQUxVRV9QQUlSICpzZW5kLCBWQUxVRV9QQUlSICoqcmVjZWl2ZWQsIGNoYXIgKm1zZykKLXsKLQlTRU5EX0RBVEEgICAgICAgZGF0YTsKLQlpbnQJCXJlc3VsdDsKLQlpbnQJCWk7Ci0JU0VSVkVSCQkqYXV0aHNlcnZlciA9IHJjX2NvbmZfc3J2KCJhdXRoc2VydmVyIik7Ci0JaW50CQl0aW1lb3V0ID0gcmNfY29uZl9pbnQoInJhZGl1c190aW1lb3V0Iik7Ci0JaW50CQlyZXRyaWVzID0gcmNfY29uZl9pbnQoInJhZGl1c19yZXRyaWVzIik7Ci0KLQlkYXRhLnNlbmRfcGFpcnMgPSBzZW5kOwotCWRhdGEucmVjZWl2ZV9wYWlycyA9IE5VTEw7Ci0KLQlyZXN1bHQgPSBFUlJPUl9SQzsKLQlmb3IoaT0wOyAoaTxhdXRoc2VydmVyLT5tYXgpICYmIChyZXN1bHQgIT0gT0tfUkMpICYmIChyZXN1bHQgIT0gQkFEUkVTUF9SQykKLQkJOyBpKyspCi0JewotCQlpZiAoZGF0YS5yZWNlaXZlX3BhaXJzICE9IE5VTEwpIHsKLQkJCXJjX2F2cGFpcl9mcmVlKGRhdGEucmVjZWl2ZV9wYWlycyk7Ci0JCQlkYXRhLnJlY2VpdmVfcGFpcnMgPSBOVUxMOwotCQl9Ci0JCXJjX2J1aWxkcmVxKCZkYXRhLCBQV19BQ0NFU1NfUkVRVUVTVCwgYXV0aHNlcnZlci0+bmFtZVtpXSwKLQkJCSAgICBhdXRoc2VydmVyLT5wb3J0W2ldLCB0aW1lb3V0LCByZXRyaWVzKTsKLQotCQlyZXN1bHQgPSByY19zZW5kX3NlcnZlciAoJmRhdGEsIG1zZywgTlVMTCk7Ci0JfQotCi0JKnJlY2VpdmVkID0gZGF0YS5yZWNlaXZlX3BhaXJzOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKgotICogRnVuY3Rpb246IHJjX2FjY3RfdXNpbmdfc2VydmVyCi0gKgotICogUHVycG9zZTogQnVpbGRzIGFuIGFjY291bnRpbmcgcmVxdWVzdCBmb3IgcG9ydCBpZCBjbGllbnRfcG9ydAotICoJICAgIHdpdGggdGhlIHZhbHVlX3BhaXJzIHNlbmQuICBZb3UgZXhwbGljaXRseSBzdXBwbHkgc2VydmVyIGxpc3QuCi0gKgotICogUmVtYXJrczogTkFTLUlkZW50aWZpZXIvTkFTLUlQLUFkZHJlc3MsIE5BUy1Qb3J0IGFuZCBBY2N0LURlbGF5LVRpbWUgZ2V0Ci0gKgkgICAgZmlsbGVkIGluIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSByZXN0IGhhcyB0byBiZSBzdXBwbGllZC4KLSAqLwotCi1pbnQgcmNfYWNjdF91c2luZ19zZXJ2ZXIoU0VSVkVSICphY2N0c2VydmVyLAotCQkJIFVJTlQ0IGNsaWVudF9wb3J0LAotCQkJIFZBTFVFX1BBSVIgKnNlbmQpCi17Ci0JU0VORF9EQVRBICAgICAgIGRhdGE7Ci0JVkFMVUVfUEFJUgkqYWR0X3ZwOwotCWludAkJcmVzdWx0OwotCXRpbWVfdAkJc3RhcnRfdGltZSwgZHRpbWU7Ci0JY2hhcgkJbXNnWzQwOTZdOwotCWludAkJaTsKLQlpbnQJCXRpbWVvdXQgPSByY19jb25mX2ludCgicmFkaXVzX3RpbWVvdXQiKTsKLQlpbnQJCXJldHJpZXMgPSByY19jb25mX2ludCgicmFkaXVzX3JldHJpZXMiKTsKLQotCWRhdGEuc2VuZF9wYWlycyA9IHNlbmQ7Ci0JZGF0YS5yZWNlaXZlX3BhaXJzID0gTlVMTDsKLQotCS8qCi0JICogRmlsbCBpbiBOQVMtSVAtQWRkcmVzcyBvciBOQVMtSWRlbnRpZmllcgotCSAqLwotCi0JaWYgKHJjX2dldF9uYXNfaWQoJihkYXRhLnNlbmRfcGFpcnMpKSA9PSBFUlJPUl9SQykKLQkgICAgcmV0dXJuIChFUlJPUl9SQyk7Ci0KLQkvKgotCSAqIEZpbGwgaW4gTkFTLVBvcnQKLQkgKi8KLQotCWlmIChyY19hdnBhaXJfYWRkKCYoZGF0YS5zZW5kX3BhaXJzKSwgUFdfTkFTX1BPUlQsICZjbGllbnRfcG9ydCwgMCwgVkVORE9SX05PTkUpID09IE5VTEwpCi0JCXJldHVybiAoRVJST1JfUkMpOwotCi0JLyoKLQkgKiBGaWxsIGluIEFjY3QtRGVsYXktVGltZQotCSAqLwotCi0JZHRpbWUgPSAwOwotCWlmICgoYWR0X3ZwID0gcmNfYXZwYWlyX2FkZCgmKGRhdGEuc2VuZF9wYWlycyksIFBXX0FDQ1RfREVMQVlfVElNRSwgJmR0aW1lLCAwLCBWRU5ET1JfTk9ORSkpID09IE5VTEwpCi0JCXJldHVybiAoRVJST1JfUkMpOwotCi0Jc3RhcnRfdGltZSA9IHRpbWUoTlVMTCk7Ci0JcmVzdWx0ID0gRVJST1JfUkM7Ci0JZm9yKGk9MDsgKGk8YWNjdHNlcnZlci0+bWF4KSAmJiAocmVzdWx0ICE9IE9LX1JDKSAmJiAocmVzdWx0ICE9IEJBRFJFU1BfUkMpCi0JCTsgaSsrKQotCXsKLQkJaWYgKGRhdGEucmVjZWl2ZV9wYWlycyAhPSBOVUxMKSB7Ci0JCQlyY19hdnBhaXJfZnJlZShkYXRhLnJlY2VpdmVfcGFpcnMpOwotCQkJZGF0YS5yZWNlaXZlX3BhaXJzID0gTlVMTDsKLQkJfQotCQlyY19idWlsZHJlcSgmZGF0YSwgUFdfQUNDT1VOVElOR19SRVFVRVNULCBhY2N0c2VydmVyLT5uYW1lW2ldLAotCQkJICAgIGFjY3RzZXJ2ZXItPnBvcnRbaV0sIHRpbWVvdXQsIHJldHJpZXMpOwotCi0JCWR0aW1lID0gdGltZShOVUxMKSAtIHN0YXJ0X3RpbWU7Ci0JCXJjX2F2cGFpcl9hc3NpZ24oYWR0X3ZwLCAmZHRpbWUsIDApOwotCi0JCXJlc3VsdCA9IHJjX3NlbmRfc2VydmVyICgmZGF0YSwgbXNnLCBOVUxMKTsKLQl9Ci0KLQlyY19hdnBhaXJfZnJlZShkYXRhLnJlY2VpdmVfcGFpcnMpOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uOiByY19hY2N0Ci0gKgotICogUHVycG9zZTogQnVpbGRzIGFuIGFjY291bnRpbmcgcmVxdWVzdCBmb3IgcG9ydCBpZCBjbGllbnRfcG9ydAotICoJICAgIHdpdGggdGhlIHZhbHVlX3BhaXJzIHNlbmQKLSAqCi0gKiBSZW1hcmtzOiBOQVMtSWRlbnRpZmllci9OQVMtSVAtQWRkcmVzcywgTkFTLVBvcnQgYW5kIEFjY3QtRGVsYXktVGltZSBnZXQKLSAqCSAgICBmaWxsZWQgaW4gYnkgdGhpcyBmdW5jdGlvbiwgdGhlIHJlc3QgaGFzIHRvIGJlIHN1cHBsaWVkLgotICovCi0KLWludCByY19hY2N0KFVJTlQ0IGNsaWVudF9wb3J0LCBWQUxVRV9QQUlSICpzZW5kKQotewotICAgIFNFUlZFUiAqYWNjdHNlcnZlciA9IHJjX2NvbmZfc3J2KCJhY2N0c2VydmVyIik7Ci0gICAgaWYgKCFhY2N0c2VydmVyKSByZXR1cm4gKEVSUk9SX1JDKTsKLQotICAgIHJldHVybiByY19hY2N0X3VzaW5nX3NlcnZlcihhY2N0c2VydmVyLCBjbGllbnRfcG9ydCwgc2VuZCk7Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbjogcmNfYWNjdF9wcm94eQotICoKLSAqIFB1cnBvc2U6IEJ1aWxkcyBhbiBhY2NvdW50aW5nIHJlcXVlc3Qgd2l0aCB0aGUgdmFsdWVfcGFpcnMgc2VuZAotICoKLSAqLwotCi1pbnQgcmNfYWNjdF9wcm94eShWQUxVRV9QQUlSICpzZW5kKQotewotCVNFTkRfREFUQSAgICAgICBkYXRhOwotCWludAkJcmVzdWx0OwotCWNoYXIJCW1zZ1s0MDk2XTsKLQlpbnQJCWk7Ci0JU0VSVkVSCQkqYWNjdHNlcnZlciA9IHJjX2NvbmZfc3J2KCJhdXRoc2VydmVyIik7Ci0JaW50CQl0aW1lb3V0ID0gcmNfY29uZl9pbnQoInJhZGl1c190aW1lb3V0Iik7Ci0JaW50CQlyZXRyaWVzID0gcmNfY29uZl9pbnQoInJhZGl1c19yZXRyaWVzIik7Ci0KLQlkYXRhLnNlbmRfcGFpcnMgPSBzZW5kOwotCWRhdGEucmVjZWl2ZV9wYWlycyA9IE5VTEw7Ci0KLQlyZXN1bHQgPSBFUlJPUl9SQzsKLQlmb3IoaT0wOyAoaTxhY2N0c2VydmVyLT5tYXgpICYmIChyZXN1bHQgIT0gT0tfUkMpICYmIChyZXN1bHQgIT0gQkFEUkVTUF9SQykKLQkJOyBpKyspCi0JewotCQlpZiAoZGF0YS5yZWNlaXZlX3BhaXJzICE9IE5VTEwpIHsKLQkJCXJjX2F2cGFpcl9mcmVlKGRhdGEucmVjZWl2ZV9wYWlycyk7Ci0JCQlkYXRhLnJlY2VpdmVfcGFpcnMgPSBOVUxMOwotCQl9Ci0JCXJjX2J1aWxkcmVxKCZkYXRhLCBQV19BQ0NPVU5USU5HX1JFUVVFU1QsIGFjY3RzZXJ2ZXItPm5hbWVbaV0sCi0JCQkgICAgYWNjdHNlcnZlci0+cG9ydFtpXSwgdGltZW91dCwgcmV0cmllcyk7Ci0KLQkJcmVzdWx0ID0gcmNfc2VuZF9zZXJ2ZXIgKCZkYXRhLCBtc2csIE5VTEwpOwotCX0KLQotCXJjX2F2cGFpcl9mcmVlKGRhdGEucmVjZWl2ZV9wYWlycyk7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKgotICogRnVuY3Rpb246IHJjX2NoZWNrCi0gKgotICogUHVycG9zZTogYXNrIHRoZSBzZXJ2ZXIgaG9zdG5hbWUgb24gdGhlIHNwZWNpZmllZCBwb3J0IGZvciBhCi0gKgkgICAgc3RhdHVzIG1lc3NhZ2UKLSAqCi0gKi8KLQotaW50IHJjX2NoZWNrKGNoYXIgKmhvc3QsIHVuc2lnbmVkIHNob3J0IHBvcnQsIGNoYXIgKm1zZykKLXsKLQlTRU5EX0RBVEEgICAgICAgZGF0YTsKLQlpbnQJCXJlc3VsdDsKLQlVSU5UNAkJc2VydmljZV90eXBlOwotCWludAkJdGltZW91dCA9IHJjX2NvbmZfaW50KCJyYWRpdXNfdGltZW91dCIpOwotCWludAkJcmV0cmllcyA9IHJjX2NvbmZfaW50KCJyYWRpdXNfcmV0cmllcyIpOwotCi0JZGF0YS5zZW5kX3BhaXJzID0gZGF0YS5yZWNlaXZlX3BhaXJzID0gTlVMTDsKLQotCS8qCi0JICogRmlsbCBpbiBOQVMtSVAtQWRkcmVzcyBvciBOQVMtSWRlbnRpZmllciwKLSAgICAgICAgICogYWx0aG91Z2ggaXQgaXNuJ3QgbmVjY2Vzc2FyeQotCSAqLwotCi0JaWYgKHJjX2dldF9uYXNfaWQoJihkYXRhLnNlbmRfcGFpcnMpKSA9PSBFUlJPUl9SQykKLQkgICAgcmV0dXJuIChFUlJPUl9SQyk7Ci0KLQkvKgotCSAqIEZpbGwgaW4gU2VydmljZS1UeXBlCi0JICovCi0KLQlzZXJ2aWNlX3R5cGUgPSBQV19BRE1JTklTVFJBVElWRTsKLQlyY19hdnBhaXJfYWRkKCYoZGF0YS5zZW5kX3BhaXJzKSwgUFdfU0VSVklDRV9UWVBFLCAmc2VydmljZV90eXBlLCAwLCBWRU5ET1JfTk9ORSk7Ci0KLQlyY19idWlsZHJlcSgmZGF0YSwgUFdfU1RBVFVTX1NFUlZFUiwgaG9zdCwgcG9ydCwgdGltZW91dCwgcmV0cmllcyk7Ci0JcmVzdWx0ID0gcmNfc2VuZF9zZXJ2ZXIgKCZkYXRhLCBtc2csIE5VTEwpOwotCi0JcmNfYXZwYWlyX2ZyZWUoZGF0YS5yZWNlaXZlX3BhaXJzKTsKLQotCXJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS9wcHBkL3BsdWdpbnMvcmFkaXVzL2NsaWVudGlkLmMgYi9wcHBkL3BsdWdpbnMvcmFkaXVzL2NsaWVudGlkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTU3OWMuLjAwMDAwMDAKLS0tIGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9jbGllbnRpZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qCi0gKiAkSWQ6IGNsaWVudGlkLmMsdiAxLjEgMjAwNC8xMS8xNCAwNzoyNjoyNiBwYXVsdXMgRXhwICQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUsMTk5NiwxOTk3IExhcnMgRmVubmViZXJnCi0gKgotICogU2VlIHRoZSBmaWxlIENPUFlSSUdIVCBmb3IgdGhlIHJlc3BlY3RpdmUgdGVybXMgYW5kIGNvbmRpdGlvbnMuCi0gKiBJZiB0aGUgZmlsZSBpcyBtaXNzaW5nIGNvbnRhY3QgbWUgYXQgbGZAZWxlbWVudGFsLm5ldAotICogYW5kIEknbGwgc2VuZCB5b3UgYSBjb3B5LgotICoKLSAqLwotCi0jaW5jbHVkZSA8aW5jbHVkZXMuaD4KLSNpbmNsdWRlIDxyYWRpdXNjbGllbnQuaD4KLQotc3RydWN0IG1hcDJpZF9zIHsKLQljaGFyICpuYW1lOwotCVVJTlQ0IGlkOwotCi0Jc3RydWN0IG1hcDJpZF9zICpuZXh0OwotfTsKLQotc3RhdGljIHN0cnVjdCBtYXAyaWRfcyAqbWFwMmlkX2xpc3QgPSBOVUxMOwotCi0vKgotICogRnVuY3Rpb246IHJjX3JlYWRfbWFwZmlsZQotICoKLSAqIFB1cnBvc2U6IFJlYWQgaW4gdGhlIHR0eW5hbWUgdG8gcG9ydCBpZCBtYXAgZmlsZQotICoKLSAqIEFyZ3VtZW50czogdGhlIGZpbGUgbmFtZSBvZiB0aGUgbWFwIGZpbGUKLSAqCi0gKiBSZXR1cm5zOiB6ZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGludGVnZXIgb24gZmFpbHVyZQotICovCi0KLWludCByY19yZWFkX21hcGZpbGUoY2hhciAqZmlsZW5hbWUpCi17Ci0JY2hhciBidWZmZXJbMTAyNF07Ci0JRklMRSAqbWFwZmQ7Ci0JY2hhciAqYywgKm5hbWUsICppZCwgKnE7Ci0Jc3RydWN0IG1hcDJpZF9zICpwOwotCWludCBsbnIgPSAwOwotCi0JaWYgKChtYXBmZCA9IGZvcGVuKGZpbGVuYW1lLCJyIikpID09IE5VTEwpCi0JewotCQllcnJvcigicmNfcmVhZF9tYXBmaWxlOiBjYW4ndCByZWFkICVzOiAlcyIsIGZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0KLSNkZWZpbmUgU0tJUChwKSB3aGlsZSgqcCAmJiBpc3NwYWNlKCpwKSkgcCsrOwotCi0Jd2hpbGUgKGZnZXRzKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIG1hcGZkKSAhPSBOVUxMKQotCXsKLQkJbG5yKys7Ci0KLQkJcSA9IGJ1ZmZlcjsKLQotCQlTS0lQKHEpOwotCi0JCWlmICgoKnEgPT0gJ1xuJykgfHwgKCpxID09ICcjJykgfHwgKCpxID09ICdcMCcpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKCggYyA9IHN0cmNocihxLCAnICcpKSB8fCAoYyA9IHN0cmNocihxLCdcdCcpKSkgewotCi0JCQkqYyA9ICdcMCc7IGMrKzsKLQkJCVNLSVAoYyk7Ci0KLQkJCW5hbWUgPSBxOwotCQkJaWQgPSBjOwotCi0JCQlpZiAoKHAgPSAoc3RydWN0IG1hcDJpZF9zICopbWFsbG9jKHNpemVvZigqcCkpKSA9PSBOVUxMKSB7Ci0JCQkJbm92bSgicmNfcmVhZF9tYXBmaWxlIik7Ci0JCQkJcmV0dXJuICgtMSk7Ci0JCQl9Ci0KLQkJCXAtPm5hbWUgPSBzdHJkdXAobmFtZSk7Ci0JCQlwLT5pZCA9IGF0b2koaWQpOwotCQkJcC0+bmV4dCA9IG1hcDJpZF9saXN0OwotCQkJbWFwMmlkX2xpc3QgPSBwOwotCi0JCX0gZWxzZSB7Ci0KLQkJCWVycm9yKCJyY19yZWFkX21hcGZpbGU6IG1hbGZvcm1lZCBsaW5lIGluICVzLCBsaW5lICVkIiwgZmlsZW5hbWUsIGxucik7Ci0JCQlyZXR1cm4gKC0xKTsKLQotCQl9Ci0JfQotCi0jdW5kZWYgU0tJUAotCi0JZmNsb3NlKG1hcGZkKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogRnVuY3Rpb246IHJjX21hcDJpZAotICoKLSAqIFB1cnBvc2U6IE1hcCB0dHluYW1lIHRvIHBvcnQgaWQKLSAqCi0gKiBBcmd1bWVudHM6IGZ1bGwgcGF0aG5hbWUgb2YgdGhlIHR0eQotICoKLSAqIFJldHVybnM6IHBvcnQgaWQsIHplcm8gaWYgbm8gZW50cnkgZm91bmQKLSAqLwotCi1VSU5UNCByY19tYXAyaWQoY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgbWFwMmlkX3MgKnA7Ci0JY2hhciB0dHluYW1lW1BBVEhfTUFYXTsKLQotCSp0dHluYW1lID0gJ1wwJzsKLQlpZiAoKm5hbWUgIT0gJy8nKQotCQlzdHJjcHkodHR5bmFtZSwgIi9kZXYvIik7Ci0KLQlzdHJuY2F0KHR0eW5hbWUsIG5hbWUsIHNpemVvZih0dHluYW1lKSk7Ci0KLQlmb3IocCA9IG1hcDJpZF9saXN0OyBwOyBwID0gcC0+bmV4dCkKLQkJaWYgKCFzdHJjbXAodHR5bmFtZSwgcC0+bmFtZSkpIHJldHVybiBwLT5pZDsKLQotCXdhcm4oInJjX21hcDJpZDogY2FuJ3QgZmluZCB0dHkgJXMgaW4gbWFwIGRhdGFiYXNlIiwgdHR5bmFtZSk7Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3BwcGQvcGx1Z2lucy9yYWRpdXMvY29uZmlnLmMgYi9wcHBkL3BsdWdpbnMvcmFkaXVzL2NvbmZpZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjllNWU4Li4wMDAwMDAwCi0tLSBhL3BwcGQvcGx1Z2lucy9yYWRpdXMvY29uZmlnLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDQgKzAsMCBAQAotLyoKLSAqICRJZDogY29uZmlnLmMsdiAxLjEgMjAwNC8xMS8xNCAwNzoyNjoyNiBwYXVsdXMgRXhwICQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUsMTk5NiwxOTk3IExhcnMgRmVubmViZXJnCi0gKgotICogQ29weXJpZ2h0IDE5OTIgTGl2aW5nc3RvbiBFbnRlcnByaXNlcywgSW5jLgotICoKLSAqIENvcHlyaWdodCAxOTkyLDE5OTMsIDE5OTQsMTk5NSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbgotICogYW5kIE1lcml0IE5ldHdvcmssIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAotICoKLSAqIFNlZSB0aGUgZmlsZSBDT1BZUklHSFQgZm9yIHRoZSByZXNwZWN0aXZlIHRlcm1zIGFuZCBjb25kaXRpb25zLgotICogSWYgdGhlIGZpbGUgaXMgbWlzc2luZyBjb250YWN0IG1lIGF0IGxmQGVsZW1lbnRhbC5uZXQKLSAqIGFuZCBJJ2xsIHNlbmQgeW91IGEgY29weS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGluY2x1ZGVzLmg+Ci0jaW5jbHVkZSA8cmFkaXVzY2xpZW50Lmg+Ci0jaW5jbHVkZSA8b3B0aW9ucy5oPgotCi1zdGF0aWMgaW50IHRlc3RfY29uZmlnKGNoYXIgKik7Ci0KLS8qCi0gKiBGdW5jdGlvbjogZmluZF9vcHRpb24KLSAqCi0gKiBQdXJwb3NlOiBmaW5kIGFuIG9wdGlvbiBpbiB0aGUgb3B0aW9uIGxpc3QKLSAqCi0gKiBSZXR1cm5zOiBwb2ludGVyIHRvIG9wdGlvbiBvbiBzdWNjZXNzLCBOVUxMIG90aGVyd2lzZQotICovCi0KLXN0YXRpYyBPUFRJT04gKmZpbmRfb3B0aW9uKGNoYXIgKm9wdG5hbWUsIHVuc2lnbmVkIGludCB0eXBlKQotewotCWludCBpOwotCi0JLyogdGhlcmUncmUgc28gZmV3IG9wdGlvbnMgdGhhdCBhIGJpbmFyeSBzZWFyY2ggc2VlbXMgbm90IG5lY2Vzc2FyeSAqLwotCWZvciAoaSA9IDA7IGkgPCBudW1fb3B0aW9uczsgaSsrKSB7Ci0JCWlmICghc3RyY21wKGNvbmZpZ19vcHRpb25zW2ldLm5hbWUsIG9wdG5hbWUpICYmCi0JCSAgICAoY29uZmlnX29wdGlvbnNbaV0udHlwZSAmIHR5cGUpKQotCQkJcmV0dXJuICZjb25maWdfb3B0aW9uc1tpXTsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uOiBzZXRfb3B0aW9uXy4uLgotICoKLSAqIFB1cnBvc2U6IHNldCBhIHNwZWNpZmljIG9wdGlvbiBkb2luZyB0eXBlIGNvbnZlcnNpb25zCi0gKgotICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCi0gKi8KLQotc3RhdGljIGludCBzZXRfb3B0aW9uX3N0cihjaGFyICpmaWxlbmFtZSwgaW50IGxpbmUsIE9QVElPTiAqb3B0aW9uLCBjaGFyICpwKQotewotCWlmIChwKQotCQlvcHRpb24tPnZhbCA9ICh2b2lkICopIHN0cmR1cChwKTsKLQllbHNlCi0JCW9wdGlvbi0+dmFsID0gTlVMTDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNldF9vcHRpb25faW50KGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZSwgT1BUSU9OICpvcHRpb24sIGNoYXIgKnApCi17Ci0JaW50ICppcHRyOwotCi0JaWYgKHAgPT0gTlVMTCkgewotCQllcnJvcigiJXM6IGxpbmUgJWQ6IGJvZ3VzIG9wdGlvbiB2YWx1ZSIsIGZpbGVuYW1lLCBsaW5lKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCi0JaWYgKChpcHRyID0gKGludCAqKSBtYWxsb2Moc2l6ZW9mKGlwdHIpKSkgPT0gTlVMTCkgewotCQlub3ZtKCJyZWFkX2NvbmZpZyIpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0KLQkqaXB0ciA9IGF0b2kocCk7Ci0Jb3B0aW9uLT52YWwgPSAodm9pZCAqKSBpcHRyOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0X29wdGlvbl9zcnYoY2hhciAqZmlsZW5hbWUsIGludCBsaW5lLCBPUFRJT04gKm9wdGlvbiwgY2hhciAqcCkKLXsKLQlTRVJWRVIgKnNlcnY7Ci0JY2hhciAqcTsKLQlzdHJ1Y3Qgc2VydmVudCAqc3ZwOwotCWludCBpOwotCi0JaWYgKHAgPT0gTlVMTCkgewotCQllcnJvcigiJXM6IGxpbmUgJWQ6IGJvZ3VzIG9wdGlvbiB2YWx1ZSIsIGZpbGVuYW1lLCBsaW5lKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCi0Jc2VydiA9IChTRVJWRVIgKikgb3B0aW9uLT52YWw7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2Vydi0+bWF4OyBpKyspIHsKLQkJZnJlZShzZXJ2LT5uYW1lW2ldKTsKLQl9Ci0Jc2Vydi0+bWF4ID0gMDsKLQotCXdoaWxlICgocCA9IHN0cnRvayhwLCAiLCBcdCIpKSAhPSBOVUxMKSB7Ci0KLQkJaWYgKChxID0gc3RyY2hyKHAsJzonKSkgIT0gTlVMTCkgewotCQkJKnEgPSAnXDAnOwotCQkJcSsrOwotCQkJc2Vydi0+cG9ydFtzZXJ2LT5tYXhdID0gYXRvaShxKTsKLQkJfSBlbHNlIHsKLQkJCWlmICghc3RyY21wKG9wdGlvbi0+bmFtZSwiYXV0aHNlcnZlciIpKQotCQkJCWlmICgoc3ZwID0gZ2V0c2VydmJ5bmFtZSAoInJhZGl1cyIsICJ1ZHAiKSkgPT0gTlVMTCkKLQkJCQkJc2Vydi0+cG9ydFtzZXJ2LT5tYXhdID0gUFdfQVVUSF9VRFBfUE9SVDsKLQkJCQllbHNlCi0JCQkJCXNlcnYtPnBvcnRbc2Vydi0+bWF4XSA9IG50b2hzICgodW5zaWduZWQgaW50KSBzdnAtPnNfcG9ydCk7Ci0JCQllbHNlIGlmICghc3RyY21wKG9wdGlvbi0+bmFtZSwgImFjY3RzZXJ2ZXIiKSkKLQkJCQlpZiAoKHN2cCA9IGdldHNlcnZieW5hbWUgKCJyYWRhY2N0IiwgInVkcCIpKSA9PSBOVUxMKQotCQkJCQlzZXJ2LT5wb3J0W3NlcnYtPm1heF0gPSBQV19BQ0NUX1VEUF9QT1JUOwotCQkJCWVsc2UKLQkJCQkJc2Vydi0+cG9ydFtzZXJ2LT5tYXhdID0gbnRvaHMgKCh1bnNpZ25lZCBpbnQpIHN2cC0+c19wb3J0KTsKLQkJCWVsc2UgewotCQkJCWVycm9yKCIlczogbGluZSAlZDogbm8gZGVmYXVsdCBwb3J0IGZvciAlcyIsIGZpbGVuYW1lLCBsaW5lLCBvcHRpb24tPm5hbWUpOwotCQkJCXJldHVybiAoLTEpOwotCQkJfQotCQl9Ci0KLQkJc2Vydi0+bmFtZVtzZXJ2LT5tYXgrK10gPSBzdHJkdXAocCk7Ci0KLQkJcCA9IE5VTEw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0X29wdGlvbl9hdW8oY2hhciAqZmlsZW5hbWUsIGludCBsaW5lLCBPUFRJT04gKm9wdGlvbiwgY2hhciAqcCkKLXsKLQlpbnQgKmlwdHI7Ci0KLQlpZiAocCA9PSBOVUxMKSB7Ci0JCXdhcm4oIiVzOiBsaW5lICVkOiBib2d1cyBvcHRpb24gdmFsdWUiLCBmaWxlbmFtZSwgbGluZSk7Ci0JCXJldHVybiAoLTEpOwotCX0KLQotCWlmICgoaXB0ciA9IChpbnQgKikgbWFsbG9jKHNpemVvZihpcHRyKSkpID09IE5VTEwpIHsKLQkJCW5vdm0oInJlYWRfY29uZmlnIik7Ci0JCQlyZXR1cm4gKC0xKTsKLQl9Ci0KLQkqaXB0ciA9IDA7Ci0JcCA9IHN0cnRvayhwLCAiLCBcdCIpOwotCi0JaWYgKCFzdHJuY21wKHAsICJsb2NhbCIsIDUpKQotCQkJKmlwdHIgPSBBVVRIX0xPQ0FMX0ZTVDsKLQllbHNlIGlmICghc3RybmNtcChwLCAicmFkaXVzIiwgNikpCi0JCQkqaXB0ciA9IEFVVEhfUkFESVVTX0ZTVDsKLQllbHNlIHsKLQkJZXJyb3IoIiVzOiBhdXRoX29yZGVyOiB1bmtub3duIGtleXdvcmQ6ICVzIiwgZmlsZW5hbWUsIHApOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0KLQlwID0gc3RydG9rKE5VTEwsICIsIFx0Iik7Ci0KLQlpZiAocCAmJiAoKnAgIT0gJ1wwJykpIHsKLQkJaWYgKCgqaXB0ciAmIEFVVEhfUkFESVVTX0ZTVCkgJiYgIXN0cmNtcChwLCAibG9jYWwiKSkKLQkJCSppcHRyID0gKCppcHRyKSB8IEFVVEhfTE9DQUxfU05EOwotCQllbHNlIGlmICgoKmlwdHIgJiBBVVRIX0xPQ0FMX0ZTVCkgJiYgIXN0cmNtcChwLCAicmFkaXVzIikpCi0JCQkqaXB0ciA9ICgqaXB0cikgfCBBVVRIX1JBRElVU19TTkQ7Ci0JCWVsc2UgewotCQkJZXJyb3IoIiVzOiBhdXRoX29yZGVyOiB1bmtub3duIG9yIHVuZXhwZWN0ZWQga2V5d29yZDogJXMiLCBmaWxlbmFtZSwgcCk7Ci0JCQlyZXR1cm4gKC0xKTsKLQkJfQotCX0KLQotCW9wdGlvbi0+dmFsID0gKHZvaWQgKikgaXB0cjsKLQotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiBGdW5jdGlvbjogcmNfcmVhZF9jb25maWcKLSAqCi0gKiBQdXJwb3NlOiByZWFkIHRoZSBnbG9iYWwgY29uZmlnIGZpbGUKLSAqCi0gKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIHdoZW4gZmFpbHVyZQotICovCi0KLWludCByY19yZWFkX2NvbmZpZyhjaGFyICpmaWxlbmFtZSkKLXsKLQlGSUxFICpjb25maWdmZDsKLQljaGFyIGJ1ZmZlcls1MTJdLCAqcDsKLQlPUFRJT04gKm9wdGlvbjsKLQlpbnQgbGluZSwgcG9zOwotCi0JaWYgKChjb25maWdmZCA9IGZvcGVuKGZpbGVuYW1lLCJyIikpID09IE5VTEwpCi0JewotCQllcnJvcigicmNfcmVhZF9jb25maWc6IGNhbid0IG9wZW4gJXM6ICVtIiwgZmlsZW5hbWUpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0KLQlsaW5lID0gMDsKLQl3aGlsZSAoKGZnZXRzKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGNvbmZpZ2ZkKSAhPSBOVUxMKSkKLQl7Ci0JCWxpbmUrKzsKLQkJcCA9IGJ1ZmZlcjsKLQotCQlpZiAoKCpwID09ICdcbicpIHx8ICgqcCA9PSAnIycpIHx8ICgqcCA9PSAnXDAnKSkKLQkJCWNvbnRpbnVlOwotCi0JCXBbc3RybGVuKHApLTFdID0gJ1wwJzsKLQotCi0JCWlmICgocG9zID0gc3RyY3NwbihwLCAiXHQgIikpID09IDApIHsKLQkJCWVycm9yKCIlczogbGluZSAlZDogYm9ndXMgZm9ybWF0OiAlcyIsIGZpbGVuYW1lLCBsaW5lLCBwKTsKLQkJCXJldHVybiAoLTEpOwotCQl9Ci0KLQkJcFtwb3NdID0gJ1wwJzsKLQotCQlpZiAoKG9wdGlvbiA9IGZpbmRfb3B0aW9uKHAsIE9UX0FOWSkpID09IE5VTEwpIHsKLQkJCXdhcm4oIiVzOiBsaW5lICVkOiB1bnJlY29nbml6ZWQga2V5d29yZDogJXMiLCBmaWxlbmFtZSwgbGluZSwgcCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChvcHRpb24tPnN0YXR1cyAhPSBTVF9VTkRFRikgewotCQkJZXJyb3IoIiVzOiBsaW5lICVkOiBkdXBsaWNhdGUgb3B0aW9uIGxpbmU6ICVzIiwgZmlsZW5hbWUsIGxpbmUsIHApOwotCQkJcmV0dXJuICgtMSk7Ci0JCX0KLQotCQlwICs9IHBvcysxOwotCQl3aGlsZSAoaXNzcGFjZSgqcCkpCi0JCQlwKys7Ci0KLQkJc3dpdGNoIChvcHRpb24tPnR5cGUpIHsKLQkJCWNhc2UgT1RfU1RSOgotCQkJCSBpZiAoc2V0X29wdGlvbl9zdHIoZmlsZW5hbWUsIGxpbmUsIG9wdGlvbiwgcCkgPCAwKQotCQkJCQlyZXR1cm4gKC0xKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgT1RfSU5UOgotCQkJCSBpZiAoc2V0X29wdGlvbl9pbnQoZmlsZW5hbWUsIGxpbmUsIG9wdGlvbiwgcCkgPCAwKQotCQkJCQlyZXR1cm4gKC0xKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgT1RfU1JWOgotCQkJCSBpZiAoc2V0X29wdGlvbl9zcnYoZmlsZW5hbWUsIGxpbmUsIG9wdGlvbiwgcCkgPCAwKQotCQkJCQlyZXR1cm4gKC0xKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgT1RfQVVPOgotCQkJCSBpZiAoc2V0X29wdGlvbl9hdW8oZmlsZW5hbWUsIGxpbmUsIG9wdGlvbiwgcCkgPCAwKQotCQkJCQlyZXR1cm4gKC0xKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJZmF0YWwoInJjX3JlYWRfY29uZmlnOiBpbXBvc3NpYmxlIGNhc2UgYnJhbmNoISIpOwotCQkJCWFib3J0KCk7Ci0JCX0KLQl9Ci0JZmNsb3NlKGNvbmZpZ2ZkKTsKLQotCXJldHVybiB0ZXN0X2NvbmZpZyhmaWxlbmFtZSk7Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbjogcmNfY29uZl9zdHIsIHJjX2NvbmZfaW50LCByY19jb25mX3NyYwotICoKLSAqIFB1cnBvc2U6IGdldCB0aGUgdmFsdWUgb2YgYSBjb25maWcgb3B0aW9uCi0gKgotICogUmV0dXJuczogY29uZmlnIG9wdGlvbiB2YWx1ZQotICovCi0KLWNoYXIgKnJjX2NvbmZfc3RyKGNoYXIgKm9wdG5hbWUpCi17Ci0JT1BUSU9OICpvcHRpb247Ci0KLQlvcHRpb24gPSBmaW5kX29wdGlvbihvcHRuYW1lLCBPVF9TVFIpOwotCi0JaWYgKG9wdGlvbiA9PSBOVUxMKQotCQlmYXRhbCgicmNfY29uZl9zdHI6IHVua293biBjb25maWcgb3B0aW9uIHJlcXVlc3RlZDogJXMiLCBvcHRuYW1lKTsKLQkJcmV0dXJuIChjaGFyICopb3B0aW9uLT52YWw7Ci19Ci0KLWludCByY19jb25mX2ludChjaGFyICpvcHRuYW1lKQotewotCU9QVElPTiAqb3B0aW9uOwotCi0Jb3B0aW9uID0gZmluZF9vcHRpb24ob3B0bmFtZSwgT1RfSU5UfE9UX0FVTyk7Ci0KLQlpZiAob3B0aW9uID09IE5VTEwpCi0JCWZhdGFsKCJyY19jb25mX2ludDogdW5rb3duIGNvbmZpZyBvcHRpb24gcmVxdWVzdGVkOiAlcyIsIG9wdG5hbWUpOwotCXJldHVybiAqKChpbnQgKilvcHRpb24tPnZhbCk7Ci19Ci0KLVNFUlZFUiAqcmNfY29uZl9zcnYoY2hhciAqb3B0bmFtZSkKLXsKLQlPUFRJT04gKm9wdGlvbjsKLQotCW9wdGlvbiA9IGZpbmRfb3B0aW9uKG9wdG5hbWUsIE9UX1NSVik7Ci0KLQlpZiAob3B0aW9uID09IE5VTEwpCi0JCWZhdGFsKCJyY19jb25mX3NydjogdW5rb3duIGNvbmZpZyBvcHRpb24gcmVxdWVzdGVkOiAlcyIsIG9wdG5hbWUpOwotCXJldHVybiAoU0VSVkVSICopb3B0aW9uLT52YWw7Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbjogdGVzdF9jb25maWcKLSAqCi0gKiBQdXJwb3NlOiB0ZXN0IHRoZSBjb25maWd1cmF0aW9uIHRoZSB1c2VyIHN1cHBsaWVkCi0gKgotICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtMSB3aGVuIGZhaWx1cmUKLSAqLwotCi1zdGF0aWMgaW50IHRlc3RfY29uZmlnKGNoYXIgKmZpbGVuYW1lKQotewotI2lmIDAKLQlzdHJ1Y3Qgc3RhdCBzdDsKLQljaGFyCSAgICAqZmlsZTsKLSNlbmRpZgotCi0JaWYgKCEocmNfY29uZl9zcnYoImF1dGhzZXJ2ZXIiKS0+bWF4KSkKLQl7Ci0JCWVycm9yKCIlczogbm8gYXV0aHNlcnZlciBzcGVjaWZpZWQiLCBmaWxlbmFtZSk7Ci0JCXJldHVybiAoLTEpOwotCX0KLQlpZiAoIShyY19jb25mX3NydigiYWNjdHNlcnZlciIpLT5tYXgpKQotCXsKLQkJZXJyb3IoIiVzOiBubyBhY2N0c2VydmVyIHNwZWNpZmllZCIsIGZpbGVuYW1lKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCWlmICghcmNfY29uZl9zdHIoInNlcnZlcnMiKSkKLQl7Ci0JCWVycm9yKCIlczogbm8gc2VydmVycyBmaWxlIHNwZWNpZmllZCIsIGZpbGVuYW1lKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCWlmICghcmNfY29uZl9zdHIoImRpY3Rpb25hcnkiKSkKLQl7Ci0JCWVycm9yKCIlczogbm8gZGljdGlvbmFyeSBzcGVjaWZpZWQiLCBmaWxlbmFtZSk7Ci0JCXJldHVybiAoLTEpOwotCX0KLQotCWlmIChyY19jb25mX2ludCgicmFkaXVzX3RpbWVvdXQiKSA8PSAwKQotCXsKLQkJZXJyb3IoIiVzOiByYWRpdXNfdGltZW91dCA8PSAwIGlzIGlsbGVnYWwiLCBmaWxlbmFtZSk7Ci0JCXJldHVybiAoLTEpOwotCX0KLQlpZiAocmNfY29uZl9pbnQoInJhZGl1c19yZXRyaWVzIikgPD0gMCkKLQl7Ci0JCWVycm9yKCIlczogcmFkaXVzX3JldHJpZXMgPD0gMCBpcyBpbGxlZ2FsIiwgZmlsZW5hbWUpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0KLSNpZiAwCi0JZmlsZSA9IHJjX2NvbmZfc3RyKCJsb2dpbl9sb2NhbCIpOwotCWlmIChzdGF0KGZpbGUsICZzdCkgPT0gMCkKLQl7Ci0JCWlmICghU19JU1JFRyhzdC5zdF9tb2RlKSkgewotCQkJZXJyb3IoIiVzOiBub3QgYSByZWd1bGFyIGZpbGU6ICVzIiwgZmlsZW5hbWUsIGZpbGUpOwotCQkJcmV0dXJuICgtMSk7Ci0JCX0KLQl9IGVsc2UgewotCQllcnJvcigiJXM6IGZpbGUgbm90IGZvdW5kOiAlcyIsIGZpbGVuYW1lLCBmaWxlKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCWZpbGUgPSByY19jb25mX3N0cigibG9naW5fcmFkaXVzIik7Ci0JaWYgKHN0YXQoZmlsZSwgJnN0KSA9PSAwKQotCXsKLQkJaWYgKCFTX0lTUkVHKHN0LnN0X21vZGUpKSB7Ci0JCQllcnJvcigiJXM6IG5vdCBhIHJlZ3VsYXIgZmlsZTogJXMiLCBmaWxlbmFtZSwgZmlsZSk7Ci0JCQlyZXR1cm4gKC0xKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWVycm9yKCIlczogZmlsZSBub3QgZm91bmQ6ICVzIiwgZmlsZW5hbWUsIGZpbGUpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0jZW5kaWYKLQotCWlmIChyY19jb25mX2ludCgibG9naW5fdHJpZXMiKSA8PSAwKQotCXsKLQkJZXJyb3IoIiVzOiBsb2dpbl90cmllcyA8PSAwIGlzIGlsbGVnYWwiLCBmaWxlbmFtZSk7Ci0JCXJldHVybiAoLTEpOwotCX0KLQlpZiAocmNfY29uZl9zdHIoInNlcWZpbGUiKSA9PSBOVUxMKQotCXsKLQkJZXJyb3IoIiVzOiBzZXFmaWxlIG5vdCBzcGVjaWZpZWQiLCBmaWxlbmFtZSk7Ci0JCXJldHVybiAoLTEpOwotCX0KLQlpZiAocmNfY29uZl9pbnQoImxvZ2luX3RpbWVvdXQiKSA8PSAwKQotCXsKLQkJZXJyb3IoIiVzOiBsb2dpbl90aW1lb3V0IDw9IDAgaXMgaWxsZWdhbCIsIGZpbGVuYW1lKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCWlmIChyY19jb25mX3N0cigibWFwZmlsZSIpID09IE5VTEwpCi0JewotCQllcnJvcigiJXM6IG1hcGZpbGUgbm90IHNwZWNpZmllZCIsIGZpbGVuYW1lKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCWlmIChyY19jb25mX3N0cigibm9sb2dpbiIpID09IE5VTEwpCi0JewotCQllcnJvcigiJXM6IG5vbG9naW4gbm90IHNwZWNpZmllZCIsIGZpbGVuYW1lKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbjogcmNfZmluZF9tYXRjaAotICoKLSAqIFB1cnBvc2U6IHNlZSBpZiBpcF9hZGRyIGlzIG9uZSBvZiB0aGUgaXAgYWRkcmVzc2VzIG9mIGhvc3RuYW1lCi0gKgotICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtMSB3aGVuIGZhaWx1cmUKLSAqCi0gKi8KLQotc3RhdGljIGludCBmaW5kX21hdGNoIChVSU5UNCAqaXBfYWRkciwgY2hhciAqaG9zdG5hbWUpCi17Ci0JVUlOVDQgICAgICAgICAgIGFkZHI7Ci0JY2hhciAgICAgICAgICAqKnBhZGRyOwotCXN0cnVjdCBob3N0ZW50ICpocDsKLQotCWlmIChyY19nb29kX2lwYWRkciAoaG9zdG5hbWUpID09IDApCi0JewotCQlpZiAoKmlwX2FkZHIgPT0gbnRvaGwoaW5ldF9hZGRyIChob3N0bmFtZSkpKQotCQl7Ci0JCQlyZXR1cm4gKDApOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmICgoaHAgPSBnZXRob3N0YnluYW1lIChob3N0bmFtZSkpID09IChzdHJ1Y3QgaG9zdGVudCAqKSBOVUxMKQotCQl7Ci0JCQlyZXR1cm4gKC0xKTsKLQkJfQotCQlmb3IgKHBhZGRyID0gaHAtPmhfYWRkcl9saXN0OyAqcGFkZHI7IHBhZGRyKyspCi0JCXsKLQkJCWFkZHIgPSAqKiAoVUlOVDQgKiopIHBhZGRyOwotCQkJaWYgKG50b2hsKGFkZHIpID09ICppcF9hZGRyKQotCQkJewotCQkJCXJldHVybiAoMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuICgtMSk7Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbjogcmNfZmluZF9zZXJ2ZXIKLSAqCi0gKiBQdXJwb3NlOiBzZWFyY2ggYSBzZXJ2ZXIgaW4gdGhlIHNlcnZlcnMgZmlsZQotICoKLSAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQotICoKLSAqLwotCi1pbnQgcmNfZmluZF9zZXJ2ZXIgKGNoYXIgKnNlcnZlcl9uYW1lLCBVSU5UNCAqaXBfYWRkciwgY2hhciAqc2VjcmV0KQotewotCVVJTlQ0CW15aXBhZGRyID0gMDsKLQlpbnQgICAgICAgICAgICAgbGVuOwotCWludCAgICAgICAgICAgICByZXN1bHQ7Ci0JRklMRSAgICAgICAgICAgKmNsaWVudGZkOwotCWNoYXIgICAgICAgICAgICpoOwotCWNoYXIgICAgICAgICAgICpzOwotCWNoYXIgICAgICAgICAgICpob3N0MjsKLQljaGFyICAgICAgICAgICAgYnVmZmVyWzEyOF07Ci0JY2hhciAgICAgICAgICAgIGhvc3RubVtBVVRIX0lEX0xFTiArIDFdOwotCi0JLyogR2V0IHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBhdXRoZW50aWNhdGlvbiBzZXJ2ZXIgKi8KLQlpZiAoKCppcF9hZGRyID0gcmNfZ2V0X2lwYWRkciAoc2VydmVyX25hbWUpKSA9PSAoVUlOVDQpIDApCi0JCXJldHVybiAoLTEpOwotCi0JaWYgKChjbGllbnRmZCA9IGZvcGVuIChyY19jb25mX3N0cigic2VydmVycyIpLCAiciIpKSA9PSAoRklMRSAqKSBOVUxMKQotCXsKLQkJZXJyb3IoInJjX2ZpbmRfc2VydmVyOiBjb3VsZG4ndCBvcGVuIGZpbGU6ICVtOiAlcyIsIHJjX2NvbmZfc3RyKCJzZXJ2ZXJzIikpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0KLQlteWlwYWRkciA9IHJjX293bl9pcGFkZHJlc3MoKTsKLQotCXJlc3VsdCA9IDA7Ci0Jd2hpbGUgKGZnZXRzIChidWZmZXIsIHNpemVvZiAoYnVmZmVyKSwgY2xpZW50ZmQpICE9IChjaGFyICopIE5VTEwpCi0JewotCQlpZiAoKmJ1ZmZlciA9PSAnIycpCi0JCQljb250aW51ZTsKLQotCQlpZiAoKGggPSBzdHJ0b2sgKGJ1ZmZlciwgIiBcdFxuIikpID09IE5VTEwpIC8qIGZpcnN0IGhvc3RuYW1lICovCi0JCQljb250aW51ZTsKLQotCQltZW1zZXQgKGhvc3RubSwgJ1wwJywgQVVUSF9JRF9MRU4pOwotCQlsZW4gPSBzdHJsZW4gKGgpOwotCQlpZiAobGVuID4gQVVUSF9JRF9MRU4pCi0JCXsKLQkJCWxlbiA9IEFVVEhfSURfTEVOOwotCQl9Ci0JCXN0cm5jcHkgKGhvc3RubSwgaCwgKHNpemVfdCkgbGVuKTsKLQkJaG9zdG5tW0FVVEhfSURfTEVOXSA9ICdcMCc7Ci0KLQkJaWYgKChzID0gc3RydG9rIChOVUxMLCAiIFx0XG4iKSkgPT0gTlVMTCkgLyogYW5kIHNlY3JldCBmaWVsZCAqLwotCQkJY29udGludWU7Ci0KLQkJbWVtc2V0IChzZWNyZXQsICdcMCcsIE1BWF9TRUNSRVRfTEVOR1RIKTsKLQkJbGVuID0gc3RybGVuIChzKTsKLQkJaWYgKGxlbiA+IE1BWF9TRUNSRVRfTEVOR1RIKQotCQl7Ci0JCQlsZW4gPSBNQVhfU0VDUkVUX0xFTkdUSDsKLQkJfQotCQlzdHJuY3B5IChzZWNyZXQsIHMsIChzaXplX3QpIGxlbik7Ci0JCXNlY3JldFtNQVhfU0VDUkVUX0xFTkdUSF0gPSAnXDAnOwotCi0JCWlmICghc3RyY2hyIChob3N0bm0sICcvJykpIC8qIElmIHNpbmdsZSBuYW1lIGZvcm0gKi8KLQkJewotCQkJaWYgKGZpbmRfbWF0Y2ggKGlwX2FkZHIsIGhvc3RubSkgPT0gMCkKLQkJCXsKLQkJCQlyZXN1bHQrKzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQllbHNlIC8qIDxuYW1lMT4vPG5hbWUyPiAicGFpcmVkIiBmb3JtICovCi0JCXsKLQkJCXN0cnRvayAoaG9zdG5tLCAiLyIpOwotCQkJaWYgKGZpbmRfbWF0Y2ggKCZteWlwYWRkciwgaG9zdG5tKSA9PSAwKQotCQkJewkgICAgIC8qIElmIHdlJ3JlIHRoZSAxc3QgbmFtZSwgdGFyZ2V0IGlzIDJuZCAqLwotCQkJCWhvc3QyID0gc3RydG9rIChOVUxMLCAiICIpOwotCQkJCWlmIChmaW5kX21hdGNoIChpcF9hZGRyLCBob3N0MikgPT0gMCkKLQkJCQl7Ci0JCQkJCXJlc3VsdCsrOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCS8qIElmIHdlIHdlcmUgMm5kIG5hbWUsIHRhcmdldCBpcyAxc3QgbmFtZSAqLwotCQkJewotCQkJCWlmIChmaW5kX21hdGNoIChpcF9hZGRyLCBob3N0bm0pID09IDApCi0JCQkJewotCQkJCQlyZXN1bHQrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWZjbG9zZSAoY2xpZW50ZmQpOwotCWlmIChyZXN1bHQgPT0gMCkKLQl7Ci0JCW1lbXNldCAoYnVmZmVyLCAnXDAnLCBzaXplb2YgKGJ1ZmZlcikpOwotCQltZW1zZXQgKHNlY3JldCwgJ1wwJywgc2l6ZW9mIChzZWNyZXQpKTsKLQkJZXJyb3IoInJjX2ZpbmRfc2VydmVyOiBjb3VsZG4ndCBmaW5kIFJBRElVUyBzZXJ2ZXIgJXMgaW4gJXMiLAotCQkgICAgICBzZXJ2ZXJfbmFtZSwgcmNfY29uZl9zdHIoInNlcnZlcnMiKSk7Ci0JCXJldHVybiAoLTEpOwotCX0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3BwcGQvcGx1Z2lucy9yYWRpdXMvZGljdC5jIGIvcHBwZC9wbHVnaW5zL3JhZGl1cy9kaWN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYjNlNzAuLjAwMDAwMDAKLS0tIGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9kaWN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTAgKzAsMCBAQAotLyoKLSAqICRJZDogZGljdC5jLHYgMS4xIDIwMDQvMTEvMTQgMDc6MjY6MjYgcGF1bHVzIEV4cCAkCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJvYXJpbmcgUGVuZ3VpbiBTb2Z0d2FyZSBJbmMuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYsMTk5NyBMYXJzIEZlbm5lYmVyZwotICoKLSAqIENvcHlyaWdodCAxOTkyIExpdmluZ3N0b24gRW50ZXJwcmlzZXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgMTk5MiwxOTkzLCAxOTk0LDE5OTUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4KLSAqIGFuZCBNZXJpdCBOZXR3b3JrLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLSAqCi0gKiBTZWUgdGhlIGZpbGUgQ09QWVJJR0hUIGZvciB0aGUgcmVzcGVjdGl2ZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4KLSAqIElmIHRoZSBmaWxlIGlzIG1pc3NpbmcgY29udGFjdCBtZSBhdCBsZkBlbGVtZW50YWwubmV0Ci0gKiBhbmQgSSdsbCBzZW5kIHlvdSBhIGNvcHkuCi0gKgotICovCi0KLSNpbmNsdWRlIDxpbmNsdWRlcy5oPgotI2luY2x1ZGUgPHJhZGl1c2NsaWVudC5oPgotCi1zdGF0aWMgRElDVF9BVFRSICpkaWN0aW9uYXJ5X2F0dHJpYnV0ZXMgPSBOVUxMOwotc3RhdGljIERJQ1RfVkFMVUUgKmRpY3Rpb25hcnlfdmFsdWVzID0gTlVMTDsKLXN0YXRpYyBWRU5ET1JfRElDVCAqdmVuZG9yX2RpY3Rpb25hcmllcyA9IE5VTEw7Ci0KLS8qCi0gKiBGdW5jdGlvbjogcmNfcmVhZF9kaWN0aW9uYXJ5Ci0gKgotICogUHVycG9zZTogSW5pdGlhbGl6ZSB0aGUgZGljdGlvbmFyeS4gIFJlYWQgYWxsIEFUVFJJQlVURVMgaW50bwotICoJICAgIHRoZSBkaWN0aW9uYXJ5X2F0dHJpYnV0ZXMgbGlzdC4gIFJlYWQgYWxsIFZBTFVFUyBpbnRvCi0gKgkgICAgdGhlIGRpY3Rpb25hcnlfdmFsdWVzIGxpc3QuICBDb25zdHJ1Y3QgVkVORE9SIGRpY3Rpb25hcmllcwotICogICAgICAgICAgYXMgcmVxdWlyZWQuCi0gKgotICovCi0KLWludCByY19yZWFkX2RpY3Rpb25hcnkgKGNoYXIgKmZpbGVuYW1lKQotewotCUZJTEUgICAgICAgICAgICpkaWN0ZmQ7Ci0JY2hhciAgICAgICAgICAgIGR1bW15c3RyW0FVVEhfSURfTEVOXTsKLQljaGFyICAgICAgICAgICAgbmFtZXN0cltBVVRIX0lEX0xFTl07Ci0JY2hhciAgICAgICAgICAgIHZhbHN0cltBVVRIX0lEX0xFTl07Ci0JY2hhciAgICAgICAgICAgIGF0dHJzdHJbQVVUSF9JRF9MRU5dOwotCWNoYXIgICAgICAgICAgICB0eXBlc3RyW0FVVEhfSURfTEVOXTsKLQljaGFyICAgICAgICAgICAgdmVuZG9yc3RyW0FVVEhfSURfTEVOXTsKLQlpbnQgICAgICAgICAgICAgbGluZV9ubzsKLQlESUNUX0FUVFIgICAgICAqYXR0cjsKLQlESUNUX1ZBTFVFICAgICAqZHZhbDsKLQlWRU5ET1JfRElDVCAgICAqdmRpY3Q7Ci0JY2hhciAgICAgICAgICAgIGJ1ZmZlclsyNTZdOwotCWludCAgICAgICAgICAgICB2YWx1ZTsKLQlpbnQgICAgICAgICAgICAgdHlwZTsKLQlpbnQgICAgICAgICAgICAgbjsKLQlpbnQgICAgICAgICAgICAgcmV0Y29kZTsKLQlpZiAoKGRpY3RmZCA9IGZvcGVuIChmaWxlbmFtZSwgInIiKSkgPT0gKEZJTEUgKikgTlVMTCkKLQl7Ci0JCWVycm9yKCAicmNfcmVhZF9kaWN0aW9uYXJ5OiBjb3VsZG4ndCBvcGVuIGRpY3Rpb25hcnkgJXM6ICVzIiwKLQkJCQlmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotCi0JbGluZV9ubyA9IDA7Ci0JcmV0Y29kZSA9IDA7Ci0Jd2hpbGUgKGZnZXRzIChidWZmZXIsIHNpemVvZiAoYnVmZmVyKSwgZGljdGZkKSAhPSAoY2hhciAqKSBOVUxMKQotCXsKLQkJbGluZV9ubysrOwotCi0JCS8qIFNraXAgZW1wdHkgc3BhY2UgKi8KLQkJaWYgKCpidWZmZXIgPT0gJyMnIHx8ICpidWZmZXIgPT0gJ1wwJyB8fCAqYnVmZmVyID09ICdcbicpCi0JCXsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKHN0cm5jbXAgKGJ1ZmZlciwgIlZFTkRPUiIsIDYpID09IDApIHsKLQkJICAgIC8qIFJlYWQgdGhlIFZFTkRPUiBsaW5lICovCi0JCSAgICBpZiAoc3NjYW5mKGJ1ZmZlciwgIiVzJXMlZCIsIGR1bW15c3RyLCBuYW1lc3RyLCAmdmFsdWUpICE9IDMpIHsKLQkJCWVycm9yKCJyY19yZWFkX2RpY3Rpb25hcnk6IGludmFsaWQgdmVuZG9yIG9uIGxpbmUgJWQgb2YgZGljdGlvbmFyeSAlcyIsCi0JCQkgICAgICBsaW5lX25vLCBmaWxlbmFtZSk7Ci0JCQlyZXRjb2RlID0gLTE7Ci0JCQlicmVhazsKLQkJICAgIH0KLQkJICAgIC8qIFZhbGlkYXRlIGVudHJ5ICovCi0JCSAgICBpZiAoc3RybGVuIChuYW1lc3RyKSA+IE5BTUVfTEVOR1RIKSB7Ci0JCQllcnJvcigicmNfcmVhZF9kaWN0aW9uYXJ5OiBpbnZhbGlkIG5hbWUgbGVuZ3RoIG9uIGxpbmUgJWQgb2YgZGljdGlvbmFyeSAlcyIsCi0JCQkgICAgICBsaW5lX25vLCBmaWxlbmFtZSk7Ci0JCQlyZXRjb2RlID0gLTE7Ci0JCQlicmVhazsKLQkJICAgIH0KLQkJICAgIC8qIENyZWF0ZSBuZXcgdmVuZG9yIGVudHJ5ICovCi0JCSAgICB2ZGljdCA9IChWRU5ET1JfRElDVCAqKSBtYWxsb2MgKHNpemVvZiAoVkVORE9SX0RJQ1QpKTsKLQkJICAgIGlmICghdmRpY3QpIHsKLQkJCW5vdm0oInJjX3JlYWRfZGljdGlvbmFyeSIpOwotCQkJcmV0Y29kZSA9IC0xOwotCQkJYnJlYWs7Ci0JCSAgICB9Ci0JCSAgICBzdHJjcHkodmRpY3QtPnZlbmRvcm5hbWUsIG5hbWVzdHIpOwotCQkgICAgdmRpY3QtPnZlbmRvcmNvZGUgPSB2YWx1ZTsKLQkJICAgIHZkaWN0LT5hdHRyaWJ1dGVzID0gTlVMTDsKLQkJICAgIHZkaWN0LT5uZXh0ID0gdmVuZG9yX2RpY3Rpb25hcmllczsKLQkJICAgIHZlbmRvcl9kaWN0aW9uYXJpZXMgPSB2ZGljdDsKLQkJfQotCQllbHNlIGlmIChzdHJuY21wIChidWZmZXIsICJBVFRSSUJVVEUiLCA5KSA9PSAwKQotCQl7Ci0KLQkJCS8qIFJlYWQgdGhlIEFUVFJJQlVURSBsaW5lLiAgSXQgaXMgb25lIG9mOgotCQkJICogQVRUUklCVVRFIGF0dHJfbmFtZSBhdHRyX3ZhbCB0eXBlICAgICAgICAgT1IKLQkJCSAqIEFUVFJJQlVURSBhdHRyX25hbWUgYXR0cl92YWwgdHlwZSB2ZW5kb3IgICovCi0JCQl2ZW5kb3JzdHJbMF0gPSAwOwotCQkJbiA9IHNzY2FuZihidWZmZXIsICIlcyVzJXMlcyVzIiwgZHVtbXlzdHIsIG5hbWVzdHIsIHZhbHN0ciwgdHlwZXN0ciwgdmVuZG9yc3RyKTsKLQkJCWlmIChuICE9IDQgJiYgbiAhPSA1KQotCQkJewotCQkJCWVycm9yKCJyY19yZWFkX2RpY3Rpb25hcnk6IGludmFsaWQgYXR0cmlidXRlIG9uIGxpbmUgJWQgb2YgZGljdGlvbmFyeSAlcyIsCi0JCQkJICAgICAgbGluZV9ubywgZmlsZW5hbWUpOwotCQkJCXJldGNvZGUgPSAtMTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIFZhbGlkYXRlIGFsbCBlbnRyaWVzCi0JCQkgKi8KLQkJCWlmIChzdHJsZW4gKG5hbWVzdHIpID4gTkFNRV9MRU5HVEgpCi0JCQl7Ci0JCQkJZXJyb3IoInJjX3JlYWRfZGljdGlvbmFyeTogaW52YWxpZCBuYW1lIGxlbmd0aCBvbiBsaW5lICVkIG9mIGRpY3Rpb25hcnkgJXMiLAotCQkJCSAgICAgIGxpbmVfbm8sIGZpbGVuYW1lKTsKLQkJCQlyZXRjb2RlID0gLTE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChzdHJsZW4gKHZlbmRvcnN0cikgPiBOQU1FX0xFTkdUSCkKLQkJCXsKLQkJCQllcnJvcigicmNfcmVhZF9kaWN0aW9uYXJ5OiBpbnZhbGlkIG5hbWUgbGVuZ3RoIG9uIGxpbmUgJWQgb2YgZGljdGlvbmFyeSAlcyIsCi0JCQkJICAgICAgbGluZV9ubywgZmlsZW5hbWUpOwotCQkJCXJldGNvZGUgPSAtMTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKCFpc2RpZ2l0ICgqdmFsc3RyKSkKLQkJCXsKLQkJCQllcnJvcigicmNfcmVhZF9kaWN0aW9uYXJ5OiBpbnZhbGlkIHZhbHVlIG9uIGxpbmUgJWQgb2YgZGljdGlvbmFyeSAlcyIsCi0JCQkJICAgICAgbGluZV9ubywgZmlsZW5hbWUpOwotCQkJCXJldGNvZGUgPSAtMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXZhbHVlID0gYXRvaSAodmFsc3RyKTsKLQotCQkJaWYgKHN0cmNtcCAodHlwZXN0ciwgInN0cmluZyIpID09IDApCi0JCQl7Ci0JCQkJdHlwZSA9IFBXX1RZUEVfU1RSSU5HOwotCQkJfQotCQkJZWxzZSBpZiAoc3RyY21wICh0eXBlc3RyLCAiaW50ZWdlciIpID09IDApCi0JCQl7Ci0JCQkJdHlwZSA9IFBXX1RZUEVfSU5URUdFUjsKLQkJCX0KLQkJCWVsc2UgaWYgKHN0cmNtcCAodHlwZXN0ciwgImlwYWRkciIpID09IDApCi0JCQl7Ci0JCQkJdHlwZSA9IFBXX1RZUEVfSVBBRERSOwotCQkJfQotCQkJZWxzZSBpZiAoc3RyY21wICh0eXBlc3RyLCAiZGF0ZSIpID09IDApCi0JCQl7Ci0JCQkJdHlwZSA9IFBXX1RZUEVfREFURTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQllcnJvcigicmNfcmVhZF9kaWN0aW9uYXJ5OiBpbnZhbGlkIHR5cGUgb24gbGluZSAlZCBvZiBkaWN0aW9uYXJ5ICVzIiwKLQkJCQkgICAgICBsaW5lX25vLCBmaWxlbmFtZSk7Ci0JCQkJcmV0Y29kZSA9IC0xOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiBTZWFyY2ggZm9yIHZlbmRvciBpZiBzdXBwbGllZCAqLwotCQkJaWYgKCp2ZW5kb3JzdHIpIHsKLQkJCSAgICB2ZGljdCA9IHJjX2RpY3RfZmluZHZlbmRvcih2ZW5kb3JzdHIpOwotCQkJICAgIGlmICghdmRpY3QpIHsKLQkJCQkgICAgZXJyb3IoInJjX3JlYWRfZGljdGlvbmFyeTogdW5rbm93biB2ZW5kb3Igb24gbGluZSAlZCBvZiBkaWN0aW9uYXJ5ICVzIiwKLQkJCQkJICBsaW5lX25vLCBmaWxlbmFtZSk7Ci0JCQkJICAgIHJldGNvZGUgPSAtMTsKLQkJCQkgICAgYnJlYWs7Ci0JCQkgICAgfQotCQkJfSBlbHNlIHsKLQkJCSAgICB2ZGljdCA9IE5VTEw7Ci0JCQl9Ci0JCQkvKiBDcmVhdGUgYSBuZXcgYXR0cmlidXRlIGZvciB0aGUgbGlzdCAqLwotCQkJaWYgKChhdHRyID0KLQkJCQkoRElDVF9BVFRSICopIG1hbGxvYyAoc2l6ZW9mIChESUNUX0FUVFIpKSkKLQkJCQkJCQk9PSAoRElDVF9BVFRSICopIE5VTEwpCi0JCQl7Ci0JCQkJbm92bSgicmNfcmVhZF9kaWN0aW9uYXJ5Iik7Ci0JCQkJcmV0Y29kZSA9IC0xOwotCQkJCWJyZWFrOwotCQkJfQotCQkJc3RyY3B5IChhdHRyLT5uYW1lLCBuYW1lc3RyKTsKLQkJCWlmICh2ZGljdCkgewotCQkJICAgIGF0dHItPnZlbmRvcmNvZGUgPSB2ZGljdC0+dmVuZG9yY29kZTsKLQkJCX0gZWxzZSB7Ci0JCQkgICAgYXR0ci0+dmVuZG9yY29kZSA9IFZFTkRPUl9OT05FOwotCQkJfQotCQkJYXR0ci0+dmFsdWUgPSB2YWx1ZTsKLQkJCWF0dHItPnR5cGUgPSB0eXBlOwotCi0JCQkvKiBJbnNlcnQgaXQgaW50byB0aGUgbGlzdCAqLwotCQkJaWYgKHZkaWN0KSB7Ci0JCQkgICAgYXR0ci0+bmV4dCA9IHZkaWN0LT5hdHRyaWJ1dGVzOwotCQkJICAgIHZkaWN0LT5hdHRyaWJ1dGVzID0gYXR0cjsKLQkJCX0gZWxzZSB7Ci0JCQkgICAgYXR0ci0+bmV4dCA9IGRpY3Rpb25hcnlfYXR0cmlidXRlczsKLQkJCSAgICBkaWN0aW9uYXJ5X2F0dHJpYnV0ZXMgPSBhdHRyOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHN0cm5jbXAgKGJ1ZmZlciwgIlZBTFVFIiwgNSkgPT0gMCkKLQkJewotCQkJLyogUmVhZCB0aGUgVkFMVUUgbGluZSAqLwotCQkJaWYgKHNzY2FuZiAoYnVmZmVyLCAiJXMlcyVzJXMiLCBkdW1teXN0ciwgYXR0cnN0ciwKLQkJCQkgICAgbmFtZXN0ciwgdmFsc3RyKSAhPSA0KQotCQkJewotCQkJCWVycm9yKCJyY19yZWFkX2RpY3Rpb25hcnk6IGludmFsaWQgdmFsdWUgZW50cnkgb24gbGluZSAlZCBvZiBkaWN0aW9uYXJ5ICVzIiwKLQkJCQkgICAgICBsaW5lX25vLCBmaWxlbmFtZSk7Ci0JCQkJcmV0Y29kZSA9IC0xOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKgotCQkJICogVmFsaWRhdGUgYWxsIGVudHJpZXMKLQkJCSAqLwotCQkJaWYgKHN0cmxlbiAoYXR0cnN0cikgPiBOQU1FX0xFTkdUSCkKLQkJCXsKLQkJCQllcnJvcigicmNfcmVhZF9kaWN0aW9uYXJ5OiBpbnZhbGlkIGF0dHJpYnV0ZSBsZW5ndGggb24gbGluZSAlZCBvZiBkaWN0aW9uYXJ5ICVzIiwKLQkJCQkgICAgICBsaW5lX25vLCBmaWxlbmFtZSk7Ci0JCQkJcmV0Y29kZSA9IC0xOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoc3RybGVuIChuYW1lc3RyKSA+IE5BTUVfTEVOR1RIKQotCQkJewotCQkJCWVycm9yKCJyY19yZWFkX2RpY3Rpb25hcnk6IGludmFsaWQgbmFtZSBsZW5ndGggb24gbGluZSAlZCBvZiBkaWN0aW9uYXJ5ICVzIiwKLQkJCQkgICAgICBsaW5lX25vLCBmaWxlbmFtZSk7Ci0JCQkJcmV0Y29kZSA9IC0xOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoIWlzZGlnaXQgKCp2YWxzdHIpKQotCQkJewotCQkJCWVycm9yKCJyY19yZWFkX2RpY3Rpb25hcnk6IGludmFsaWQgdmFsdWUgb24gbGluZSAlZCBvZiBkaWN0aW9uYXJ5ICVzIiwKLQkJCQkgICAgICBsaW5lX25vLCBmaWxlbmFtZSk7Ci0JCQkJcmV0Y29kZSA9IC0xOwotCQkJCWJyZWFrOwotCQkJfQotCQkJdmFsdWUgPSBhdG9pICh2YWxzdHIpOwotCi0JCQkvKiBDcmVhdGUgYSBuZXcgVkFMVUUgZW50cnkgZm9yIHRoZSBsaXN0ICovCi0JCQlpZiAoKGR2YWwgPQotCQkJCShESUNUX1ZBTFVFICopIG1hbGxvYyAoc2l6ZW9mIChESUNUX1ZBTFVFKSkpCi0JCQkJCQkJPT0gKERJQ1RfVkFMVUUgKikgTlVMTCkKLQkJCXsKLQkJCQlub3ZtKCJyY19yZWFkX2RpY3Rpb25hcnkiKTsKLQkJCQlyZXRjb2RlID0gLTE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzdHJjcHkgKGR2YWwtPmF0dHJuYW1lLCBhdHRyc3RyKTsKLQkJCXN0cmNweSAoZHZhbC0+bmFtZSwgbmFtZXN0cik7Ci0JCQlkdmFsLT52YWx1ZSA9IHZhbHVlOwotCi0JCQkvKiBJbnNlcnQgaXQgaW50byB0aGUgbGlzdCAqLwotCQkJZHZhbC0+bmV4dCA9IGRpY3Rpb25hcnlfdmFsdWVzOwotCQkJZGljdGlvbmFyeV92YWx1ZXMgPSBkdmFsOwotCQl9Ci0JCWVsc2UgaWYgKHN0cm5jbXAgKGJ1ZmZlciwgIklOQ0xVREUiLCA3KSA9PSAwKQotCQl7Ci0JCQkvKiBSZWFkIHRoZSBJTkNMVURFIGxpbmUgKi8KLQkJCWlmIChzc2NhbmYgKGJ1ZmZlciwgIiVzJXMiLCBkdW1teXN0ciwgbmFtZXN0cikgIT0gMikKLQkJCXsKLQkJCQllcnJvcigicmNfcmVhZF9kaWN0aW9uYXJ5OiBpbnZhbGlkIGluY2x1ZGUgZW50cnkgb24gbGluZSAlZCBvZiBkaWN0aW9uYXJ5ICVzIiwKLQkJCQkgICAgICBsaW5lX25vLCBmaWxlbmFtZSk7Ci0JCQkJcmV0Y29kZSA9IC0xOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHJjX3JlYWRfZGljdGlvbmFyeShuYW1lc3RyKSA9PSAtMSkKLQkJCXsKLQkJCQlyZXRjb2RlID0gLTE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JZmNsb3NlIChkaWN0ZmQpOwotCXJldHVybiByZXRjb2RlOwotfQotCi0vKgotICogRnVuY3Rpb246IHJjX2RpY3RfZ2V0YXR0cgotICoKLSAqIFB1cnBvc2U6IFJldHVybiB0aGUgZnVsbCBhdHRyaWJ1dGUgc3RydWN0dXJlIGJhc2VkIG9uIHRoZQotICoJICAgIGF0dHJpYnV0ZSBpZCBudW1iZXIgYW5kIHZlbmRvciBjb2RlLiAgSWYgdmVuZG9yIGNvZGUgaXMgVkVORE9SX05PTkUsCi0gKiAgICAgICAgICBub24tdmVuZG9yLXNwZWNpZmljIGF0dHJpYnV0ZXMgYXJlIHVzZWQKLSAqCi0gKi8KLQotRElDVF9BVFRSICpyY19kaWN0X2dldGF0dHIgKGludCBhdHRyaWJ1dGUsIGludCB2ZW5kb3IpCi17Ci0JRElDVF9BVFRSICAgICAgKmF0dHI7Ci0JVkVORE9SX0RJQ1QgICAgKmRpY3Q7Ci0KLQlpZiAodmVuZG9yID09IFZFTkRPUl9OT05FKSB7Ci0JICAgIGF0dHIgPSBkaWN0aW9uYXJ5X2F0dHJpYnV0ZXM7Ci0JICAgIHdoaWxlIChhdHRyICE9IChESUNUX0FUVFIgKikgTlVMTCkgewotCQlpZiAoYXR0ci0+dmFsdWUgPT0gYXR0cmlidXRlKSB7Ci0JCSAgICByZXR1cm4gKGF0dHIpOwotCQl9Ci0JCWF0dHIgPSBhdHRyLT5uZXh0OwotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgZGljdCA9IHJjX2RpY3RfZ2V0dmVuZG9yKHZlbmRvcik7Ci0JICAgIGlmICghZGljdCkgewotCQlyZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgICBhdHRyID0gZGljdC0+YXR0cmlidXRlczsKLQkgICAgd2hpbGUgKGF0dHIpIHsKLQkJaWYgKGF0dHItPnZhbHVlID09IGF0dHJpYnV0ZSkgewotCQkgICAgcmV0dXJuIGF0dHI7Ci0JCX0KLQkJYXR0ciA9IGF0dHItPm5leHQ7Ci0JICAgIH0KLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbjogcmNfZGljdF9maW5kYXR0cgotICoKLSAqIFB1cnBvc2U6IFJldHVybiB0aGUgZnVsbCBhdHRyaWJ1dGUgc3RydWN0dXJlIGJhc2VkIG9uIHRoZQotICoJICAgIGF0dHJpYnV0ZSBuYW1lLgotICoKLSAqLwotCi1ESUNUX0FUVFIgKnJjX2RpY3RfZmluZGF0dHIgKGNoYXIgKmF0dHJuYW1lKQotewotCURJQ1RfQVRUUiAgICAgICphdHRyOwotCVZFTkRPUl9ESUNUICAgICpkaWN0OwotCi0JYXR0ciA9IGRpY3Rpb25hcnlfYXR0cmlidXRlczsKLQl3aGlsZSAoYXR0ciAhPSAoRElDVF9BVFRSICopIE5VTEwpCi0JewotCQlpZiAoc3RyY2FzZWNtcCAoYXR0ci0+bmFtZSwgYXR0cm5hbWUpID09IDApCi0JCXsKLQkJCXJldHVybiAoYXR0cik7Ci0JCX0KLQkJYXR0ciA9IGF0dHItPm5leHQ7Ci0JfQotCi0JLyogU2VhcmNoIHZlbmRvci1zcGVjaWZpYyBkaWN0aW9uYXJpZXMgKi8KLQlkaWN0ID0gdmVuZG9yX2RpY3Rpb25hcmllczsKLQl3aGlsZSAoZGljdCkgewotCSAgICBhdHRyID0gZGljdC0+YXR0cmlidXRlczsKLQkgICAgd2hpbGUgKGF0dHIpIHsKLQkJaWYgKHN0cmNhc2VjbXAgKGF0dHItPm5hbWUsIGF0dHJuYW1lKSA9PSAwKSB7Ci0JCSAgICByZXR1cm4gKGF0dHIpOwotCQl9Ci0JCWF0dHIgPSBhdHRyLT5uZXh0OwotCSAgICB9Ci0JICAgIGRpY3QgPSBkaWN0LT5uZXh0OwotCX0KLQlyZXR1cm4gKChESUNUX0FUVFIgKikgTlVMTCk7Ci19Ci0KLQotLyoKLSAqIEZ1bmN0aW9uOiByY19kaWN0X2ZpbmR2YWwKLSAqCi0gKiBQdXJwb3NlOiBSZXR1cm4gdGhlIGZ1bGwgdmFsdWUgc3RydWN0dXJlIGJhc2VkIG9uIHRoZQotICogICAgICAgICB2YWx1ZSBuYW1lLgotICoKLSAqLwotCi1ESUNUX1ZBTFVFICpyY19kaWN0X2ZpbmR2YWwgKGNoYXIgKnZhbG5hbWUpCi17Ci0JRElDVF9WQUxVRSAgICAgKnZhbDsKLQotCXZhbCA9IGRpY3Rpb25hcnlfdmFsdWVzOwotCXdoaWxlICh2YWwgIT0gKERJQ1RfVkFMVUUgKikgTlVMTCkKLQl7Ci0JCWlmIChzdHJjYXNlY21wICh2YWwtPm5hbWUsIHZhbG5hbWUpID09IDApCi0JCXsKLQkJCXJldHVybiAodmFsKTsKLQkJfQotCQl2YWwgPSB2YWwtPm5leHQ7Ci0JfQotCXJldHVybiAoKERJQ1RfVkFMVUUgKikgTlVMTCk7Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbjogZGljdF9nZXR2YWwKLSAqCi0gKiBQdXJwb3NlOiBSZXR1cm4gdGhlIGZ1bGwgdmFsdWUgc3RydWN0dXJlIGJhc2VkIG9uIHRoZQotICogICAgICAgICAgYWN0dWFsIHZhbHVlIGFuZCB0aGUgYXNzb2NpYXRlZCBhdHRyaWJ1dGUgbmFtZS4KLSAqCi0gKi8KLQotRElDVF9WQUxVRSAqIHJjX2RpY3RfZ2V0dmFsIChVSU5UNCB2YWx1ZSwgY2hhciAqYXR0cm5hbWUpCi17Ci0JRElDVF9WQUxVRSAgICAgKnZhbDsKLQotCXZhbCA9IGRpY3Rpb25hcnlfdmFsdWVzOwotCXdoaWxlICh2YWwgIT0gKERJQ1RfVkFMVUUgKikgTlVMTCkKLQl7Ci0JCWlmIChzdHJjbXAgKHZhbC0+YXR0cm5hbWUsIGF0dHJuYW1lKSA9PSAwICYmCi0JCQkJdmFsLT52YWx1ZSA9PSB2YWx1ZSkKLQkJewotCQkJcmV0dXJuICh2YWwpOwotCQl9Ci0JCXZhbCA9IHZhbC0+bmV4dDsKLQl9Ci0JcmV0dXJuICgoRElDVF9WQUxVRSAqKSBOVUxMKTsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uOiByY19kaWN0X2ZpbmR2ZW5kb3IKLSAqCi0gKiBQdXJwb3NlOiBSZXR1cm4gdGhlIHZlbmRvcidzIGRpY3Rpb25hcnkgZ2l2ZW4gdGhlIHZlbmRvciBuYW1lLgotICoKLSAqLwotVkVORE9SX0RJQ1QgKiByY19kaWN0X2ZpbmR2ZW5kb3IgKGNoYXIgKnZlbmRvcm5hbWUpCi17Ci0gICAgVkVORE9SX0RJQ1QgKmRpY3Q7Ci0KLSAgICBkaWN0ID0gdmVuZG9yX2RpY3Rpb25hcmllczsKLSAgICB3aGlsZSAoZGljdCkgewotCWlmICghc3RyY21wKHZlbmRvcm5hbWUsIGRpY3QtPnZlbmRvcm5hbWUpKSB7Ci0JICAgIHJldHVybiBkaWN0OwotCX0KLQlkaWN0ID0gZGljdC0+bmV4dDsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbjogcmNfZGljdF9nZXR2ZW5kb3IKLSAqCi0gKiBQdXJwb3NlOiBSZXR1cm4gdGhlIHZlbmRvcidzIGRpY3Rpb25hcnkgZ2l2ZW4gdGhlIHZlbmRvciBJRAotICoKLSAqLwotVkVORE9SX0RJQ1QgKiByY19kaWN0X2dldHZlbmRvciAoaW50IGlkKQotewotICAgIFZFTkRPUl9ESUNUICpkaWN0OwotCi0gICAgZGljdCA9IHZlbmRvcl9kaWN0aW9uYXJpZXM7Ci0gICAgd2hpbGUgKGRpY3QpIHsKLQlpZiAoaWQgPT0gZGljdC0+dmVuZG9yY29kZSkgewotCSAgICByZXR1cm4gZGljdDsKLQl9Ci0JZGljdCA9IGRpY3QtPm5leHQ7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9ldGMvZGljdGlvbmFyeSBiL3BwcGQvcGx1Z2lucy9yYWRpdXMvZXRjL2RpY3Rpb25hcnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZDA4NmEuLjAwMDAwMDAKLS0tIGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9ldGMvZGljdGlvbmFyeQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0jCi0jIFVwZGF0ZWQgOTcvMDYvMTMgdG8gbGl2aW5nc3Rvbi1yYWRpdXMtMi4wMSBtaXF1ZWxzQGNpc3Ryb24ubmwKLSMKLSMJVGhpcyBmaWxlIGNvbnRhaW5zIGRpY3Rpb25hcnkgdHJhbnNsYXRpb25zIGZvciBwYXJzaW5nCi0jCXJlcXVlc3RzIGFuZCBnZW5lcmF0aW5nIHJlc3BvbnNlcy4gIEFsbCB0cmFuc2FjdGlvbnMgYXJlCi0jCWNvbXBvc2VkIG9mIEF0dHJpYnV0ZS9WYWx1ZSBQYWlycy4gIFRoZSB2YWx1ZSBvZiBlYWNoIGF0dHJpYnV0ZQotIwlpcyBzcGVjaWZpZWQgYXMgb25lIG9mIDQgZGF0YSB0eXBlcy4gIFZhbGlkIGRhdGEgdHlwZXMgYXJlOgotIwotIwlzdHJpbmcgLSAwLTI1MyBvY3RldHMKLSMJaXBhZGRyIC0gNCBvY3RldHMgaW4gbmV0d29yayBieXRlIG9yZGVyCi0jCWludGVnZXIgLSAzMiBiaXQgdmFsdWUgaW4gYmlnIGVuZGlhbiBvcmRlciAoaGlnaCBieXRlIGZpcnN0KQotIwlkYXRlIC0gMzIgYml0IHZhbHVlIGluIGJpZyBlbmRpYW4gb3JkZXIgLSBzZWNvbmRzIHNpbmNlCi0jCQkJCQkwMDowMDowMCBHTVQsICBKYW4uICAxLCAgMTk3MAotIwotIwlFbnVtZXJhdGVkIHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZSB1c2VyIGZpbGUgd2l0aCBkaWN0aW9uYXJ5Ci0jCVZBTFVFIHRyYW5zbGF0aW9ucyBmb3IgZWFzeSBhZG1pbmlzdHJhdGlvbi4KLSMKLSMJRXhhbXBsZToKLSMKLSMJQVRUUklCVVRFCSAgVkFMVUUKLSMJLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0KLSMJRnJhbWVkLVByb3RvY29sID0gUFBQCi0jCTcJCT0gMQkoaW50ZWdlciBlbmNvZGluZykKLSMKLQotIyBUaGUgZGljdGlvbmFyeSBmb3JtYXQgbm93IHN1cHBvcnRzIHZlbmRvci1zcGVjaWZpYyBhdHRyaWJ1dGVzLgotIyBWZW5kb3JzIGFyZSBpbnRyb2R1Y2VkIGxpa2UgdGhpczoKLSMKLSMJVkVORE9SIHZlbmRvcl9uYW1lIHZlbmRvcl9udW1iZXIKLSMKLSMgRm9yIGV4YW1wbGU6Ci0jCi0jCVZFTkRPUiBSb2FyaW5nUGVuZ3VpbiAxMDA1NQotIwotIyBWZW5kb3Itc3BlY2lmaWMgYXR0cmlidXRlcyBoYXZlIGEgZmlmdGggZmllbGQgd2l0aCB0aGUgbmFtZSBvZiB0aGUKLSMgdmVuZG9yLiAgRm9yIGV4YW1wbGU6Ci0jCi0jICAgICAgIEFUVFJJQlVURSBSUC1VcHN0cmVhbS1TcGVlZC1MaW1pdCAxIGludGVnZXIgUm9hcmluZ1Blbmd1aW4KLSMKLSMgaW50cm9kdWNlcyBhIFJvYXJpbmcgUGVuZ3VpbiB2ZW5kb3Itc3BlY2lmaWMgYXR0cmliYnV0ZSB3aXRoIG5hbWUKLSMgUlAtVXBzdHJlYW0tU3BlZWQtTGltaXQsIG51bWJlciAxLCB0eXBlIGludGVnZXIgYW5kIHZlbmRvciBSb2FyaW5nUGVuZ3Vpbi4KLQotIwotIwlGb2xsb3dpbmcgYXJlIHRoZSBwcm9wZXIgbmV3IG5hbWVzLiBVc2UgdGhlc2UuCi0jCi1BVFRSSUJVVEUJVXNlci1OYW1lCQkxCXN0cmluZwotQVRUUklCVVRFCVBhc3N3b3JkCQkyCXN0cmluZwotQVRUUklCVVRFCUNIQVAtUGFzc3dvcmQJCTMJc3RyaW5nCi1BVFRSSUJVVEUJTkFTLUlQLUFkZHJlc3MJCTQJaXBhZGRyCi1BVFRSSUJVVEUJTkFTLVBvcnQtSWQJCTUJaW50ZWdlcgotQVRUUklCVVRFCVNlcnZpY2UtVHlwZQkJNglpbnRlZ2VyCi1BVFRSSUJVVEUJRnJhbWVkLVByb3RvY29sCQk3CWludGVnZXIKLUFUVFJJQlVURQlGcmFtZWQtSVAtQWRkcmVzcwk4CWlwYWRkcgotQVRUUklCVVRFCUZyYW1lZC1JUC1OZXRtYXNrCTkJaXBhZGRyCi1BVFRSSUJVVEUJRnJhbWVkLVJvdXRpbmcJCTEwCWludGVnZXIKLUFUVFJJQlVURQlGaWx0ZXItSWQJCTExCXN0cmluZwotQVRUUklCVVRFCUZyYW1lZC1NVFUJCTEyCWludGVnZXIKLUFUVFJJQlVURQlGcmFtZWQtQ29tcHJlc3Npb24JMTMJaW50ZWdlcgotQVRUUklCVVRFCUxvZ2luLUlQLUhvc3QJCTE0CWlwYWRkcgotQVRUUklCVVRFCUxvZ2luLVNlcnZpY2UJCTE1CWludGVnZXIKLUFUVFJJQlVURQlMb2dpbi1UQ1AtUG9ydAkJMTYJaW50ZWdlcgotQVRUUklCVVRFCVJlcGx5LU1lc3NhZ2UJCTE4CXN0cmluZwotQVRUUklCVVRFCUNhbGxiYWNrLU51bWJlcgkJMTkJc3RyaW5nCi1BVFRSSUJVVEUJQ2FsbGJhY2stSWQJCTIwCXN0cmluZwotQVRUUklCVVRFCUZyYW1lZC1Sb3V0ZQkJMjIJc3RyaW5nCi1BVFRSSUJVVEUJRnJhbWVkLUlQWC1OZXR3b3JrCTIzCWlwYWRkcgotQVRUUklCVVRFCVN0YXRlCQkJMjQJc3RyaW5nCi1BVFRSSUJVVEUJQ2xhc3MJCQkyNQlzdHJpbmcKLUFUVFJJQlVURQlTZXNzaW9uLVRpbWVvdXQJCTI3CWludGVnZXIKLUFUVFJJQlVURQlJZGxlLVRpbWVvdXQJCTI4CWludGVnZXIKLUFUVFJJQlVURQlUZXJtaW5hdGlvbi1BY3Rpb24JMjkJaW50ZWdlcgotQVRUUklCVVRFCUNhbGxlZC1TdGF0aW9uLUlkCTMwCXN0cmluZwotQVRUUklCVVRFCUNhbGxpbmctU3RhdGlvbi1JZAkzMQlzdHJpbmcKLUFUVFJJQlVURQlOQVMtSWRlbnRpZmllcgkJMzIJc3RyaW5nCi1BVFRSSUJVVEUJQWNjdC1TdGF0dXMtVHlwZQk0MAlpbnRlZ2VyCi1BVFRSSUJVVEUJQWNjdC1EZWxheS1UaW1lCQk0MQlpbnRlZ2VyCi1BVFRSSUJVVEUJQWNjdC1JbnB1dC1PY3RldHMJNDIJaW50ZWdlcgotQVRUUklCVVRFCUFjY3QtT3V0cHV0LU9jdGV0cwk0MwlpbnRlZ2VyCi1BVFRSSUJVVEUJQWNjdC1TZXNzaW9uLUlkCQk0NAlzdHJpbmcKLUFUVFJJQlVURQlBY2N0LUF1dGhlbnRpYwkJNDUJaW50ZWdlcgotQVRUUklCVVRFCUFjY3QtU2Vzc2lvbi1UaW1lCTQ2CWludGVnZXIKLUFUVFJJQlVURQlBY2N0LUlucHV0LVBhY2tldHMJNDcJaW50ZWdlcgotQVRUUklCVVRFCUFjY3QtT3V0cHV0LVBhY2tldHMJNDgJaW50ZWdlcgotQVRUUklCVVRFCUFjY3QtVGVybWluYXRlLUNhdXNlCTQ5CWludGVnZXIKLUFUVFJJQlVURSAgICAgICBDaGFwLUNoYWxsZW5nZSAgICAgICAgICA2MCAgICAgIHN0cmluZwotQVRUUklCVVRFCU5BUy1Qb3J0LVR5cGUJCTYxCWludGVnZXIKLUFUVFJJQlVURQlQb3J0LUxpbWl0CQk2MglpbnRlZ2VyCi1BVFRSSUJVVEUJQ29ubmVjdC1JbmZvCQk3NwlzdHJpbmcKLQotIyBSRkMgMjg2OQotQVRUUklCVVRFCUFjY3QtSW50ZXJpbS1JbnRlcnZhbAk4NQlpbnRlZ2VyCi0KLSMKLSMJRXhwZXJpbWVudGFsIE5vbiBQcm90b2NvbCBBdHRyaWJ1dGVzIHVzZWQgYnkgQ2lzdHJvbi1SYWRpdXNkCi0jCi1BVFRSSUJVVEUJSHVudGdyb3VwLU5hbWUJCTIyMQlzdHJpbmcKLUFUVFJJQlVURQlVc2VyLUNhdGVnb3J5CQkxMDI5CXN0cmluZwotQVRUUklCVVRFCUdyb3VwLU5hbWUJCTEwMzAJc3RyaW5nCi1BVFRSSUJVVEUJU2ltdWx0YW5lb3VzLVVzZQkxMDM0CWludGVnZXIKLUFUVFJJQlVURQlTdHJpcC1Vc2VyLU5hbWUJCTEwMzUJaW50ZWdlcgotQVRUUklCVVRFCUZhbGwtVGhyb3VnaAkJMTAzNglpbnRlZ2VyCi1BVFRSSUJVVEUJQWRkLVBvcnQtVG8tSVAtQWRkcmVzcwkxMDM3CWludGVnZXIKLUFUVFJJQlVURQlFeGVjLVByb2dyYW0JCTEwMzgJc3RyaW5nCi1BVFRSSUJVVEUJRXhlYy1Qcm9ncmFtLVdhaXQJMTAzOQlzdHJpbmcKLUFUVFJJQlVURQlIaW50CQkJMTA0MAlzdHJpbmcKLQotIwotIwlOb24tUHJvdG9jb2wgQXR0cmlidXRlcwotIwlUaGVzZSBhdHRyaWJ1dGVzIGFyZSB1c2VkIGludGVybmFsbHkgYnkgdGhlIHNlcnZlcgotIwotQVRUUklCVVRFCUV4cGlyYXRpb24JCSAgMjEJZGF0ZQotQVRUUklCVVRFCUF1dGgtVHlwZQkJMTAwMAlpbnRlZ2VyCi1BVFRSSUJVVEUJTWVudQkJCTEwMDEJc3RyaW5nCi1BVFRSSUJVVEUJVGVybWluYXRpb24tTWVudQkxMDAyCXN0cmluZwotQVRUUklCVVRFCVByZWZpeAkJCTEwMDMJc3RyaW5nCi1BVFRSSUJVVEUJU3VmZml4CQkJMTAwNAlzdHJpbmcKLUFUVFJJQlVURQlHcm91cAkJCTEwMDUJc3RyaW5nCi1BVFRSSUJVVEUJQ3J5cHQtUGFzc3dvcmQJCTEwMDYJc3RyaW5nCi1BVFRSSUJVVEUJQ29ubmVjdC1SYXRlCQkxMDA3CWludGVnZXIKLQotIwotIyAgICAgICBFeHBlcmltZW50YWwsIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGF0dHJpYnV0ZXMKLSMKLSMgTGltaXQgc2Vzc2lvbiB0cmFmZmljCi1BVFRSSUJVVEUJU2Vzc2lvbi1PY3RldHMtTGltaXQJMjI3CWludGVnZXIKLSMgV2hhdCB0byBhc3N1bWUgYXMgbGltaXQgLSAwIGluK291dCwgMSBpbiwgMiBvdXQsIDMgbWF4KGluLG91dCkKLUFUVFJJQlVURQlPY3RldHMtRGlyZWN0aW9uCTIyOAlpbnRlZ2VyCi0KLSMKLSMJSW50ZWdlciBUcmFuc2xhdGlvbnMKLSMKLQotIwlVc2VyIFR5cGVzCi0KLVZBTFVFCQlTZXJ2aWNlLVR5cGUJCUxvZ2luLVVzZXIJCTEKLVZBTFVFCQlTZXJ2aWNlLVR5cGUJCUZyYW1lZC1Vc2VyCQkyCi1WQUxVRQkJU2VydmljZS1UeXBlCQlDYWxsYmFjay1Mb2dpbi1Vc2VyCTMKLVZBTFVFCQlTZXJ2aWNlLVR5cGUJCUNhbGxiYWNrLUZyYW1lZC1Vc2VyCTQKLVZBTFVFCQlTZXJ2aWNlLVR5cGUJCU91dGJvdW5kLVVzZXIJCTUKLVZBTFVFCQlTZXJ2aWNlLVR5cGUJCUFkbWluaXN0cmF0aXZlLVVzZXIJNgotVkFMVUUJCVNlcnZpY2UtVHlwZQkJTkFTLVByb21wdC1Vc2VyCQk3Ci0KLSMJRnJhbWVkIFByb3RvY29scwotCi1WQUxVRQkJRnJhbWVkLVByb3RvY29sCQlQUFAJCQkxCi1WQUxVRQkJRnJhbWVkLVByb3RvY29sCQlTTElQCQkJMgotCi0jCUZyYW1lZCBSb3V0aW5nIFZhbHVlcwotCi1WQUxVRQkJRnJhbWVkLVJvdXRpbmcJCU5vbmUJCQkwCi1WQUxVRQkJRnJhbWVkLVJvdXRpbmcJCUJyb2FkY2FzdAkJMQotVkFMVUUJCUZyYW1lZC1Sb3V0aW5nCQlMaXN0ZW4JCQkyCi1WQUxVRQkJRnJhbWVkLVJvdXRpbmcJCUJyb2FkY2FzdC1MaXN0ZW4JMwotCi0jCUZyYW1lZCBDb21wcmVzc2lvbiBUeXBlcwotCi1WQUxVRQkJRnJhbWVkLUNvbXByZXNzaW9uCU5vbmUJCQkwCi1WQUxVRQkJRnJhbWVkLUNvbXByZXNzaW9uCVZhbi1KYWNvYnNvbi1UQ1AtSVAJMQotCi0jCUxvZ2luIFNlcnZpY2VzCi0KLVZBTFVFCQlMb2dpbi1TZXJ2aWNlCQlUZWxuZXQJCQkwCi1WQUxVRQkJTG9naW4tU2VydmljZQkJUmxvZ2luCQkJMQotVkFMVUUJCUxvZ2luLVNlcnZpY2UJCVRDUC1DbGVhcgkJMgotVkFMVUUJCUxvZ2luLVNlcnZpY2UJCVBvcnRNYXN0ZXIJCTMKLQotIwlTdGF0dXMgVHlwZXMKLQotVkFMVUUJCUFjY3QtU3RhdHVzLVR5cGUJU3RhcnQJCQkxCi1WQUxVRQkJQWNjdC1TdGF0dXMtVHlwZQlTdG9wCQkJMgotVkFMVUUJCUFjY3QtU3RhdHVzLVR5cGUJQWNjb3VudGluZy1PbgkJNwotVkFMVUUJCUFjY3QtU3RhdHVzLVR5cGUJQWNjb3VudGluZy1PZmYJCTgKLQotIwlBdXRoZW50aWNhdGlvbiBUeXBlcwotCi1WQUxVRQkJQWNjdC1BdXRoZW50aWMJCVJBRElVUwkJCTEKLVZBTFVFCQlBY2N0LUF1dGhlbnRpYwkJTG9jYWwJCQkyCi1WQUxVRQkJQWNjdC1BdXRoZW50aWMJCVBvd2VyTGluazEyOAkJMTAwCi0KLSMJVGVybWluYXRpb24gT3B0aW9ucwotCi1WQUxVRQkJVGVybWluYXRpb24tQWN0aW9uCURlZmF1bHQJCQkwCi1WQUxVRQkJVGVybWluYXRpb24tQWN0aW9uCVJBRElVUy1SZXF1ZXN0CQkxCi0KLSMJTkFTIFBvcnQgVHlwZXMsIGF2YWlsYWJsZSBpbiAzLjMuMSBhbmQgbGF0ZXIKLQotVkFMVUUJCU5BUy1Qb3J0LVR5cGUJCUFzeW5jCQkJMAotVkFMVUUJCU5BUy1Qb3J0LVR5cGUJCVN5bmMJCQkxCi1WQUxVRQkJTkFTLVBvcnQtVHlwZQkJSVNETgkJCTIKLVZBTFVFCQlOQVMtUG9ydC1UeXBlCQlJU0ROLVYxMjAJCTMKLVZBTFVFCQlOQVMtUG9ydC1UeXBlCQlJU0ROLVYxMTAJCTQKLQotIwlBY2N0IFRlcm1pbmF0ZSBDYXVzZXMsIGF2YWlsYWJsZSBpbiAzLjMuMiBhbmQgbGF0ZXIKLQotVkFMVUUgICAgICAgICAgIEFjY3QtVGVybWluYXRlLUNhdXNlICAgIFVzZXItUmVxdWVzdCAgICAgICAgICAgIDEKLVZBTFVFICAgICAgICAgICBBY2N0LVRlcm1pbmF0ZS1DYXVzZSAgICBMb3N0LUNhcnJpZXIgICAgICAgICAgICAyCi1WQUxVRSAgICAgICAgICAgQWNjdC1UZXJtaW5hdGUtQ2F1c2UgICAgTG9zdC1TZXJ2aWNlICAgICAgICAgICAgMwotVkFMVUUgICAgICAgICAgIEFjY3QtVGVybWluYXRlLUNhdXNlICAgIElkbGUtVGltZW91dCAgICAgICAgICAgIDQKLVZBTFVFICAgICAgICAgICBBY2N0LVRlcm1pbmF0ZS1DYXVzZSAgICBTZXNzaW9uLVRpbWVvdXQgICAgICAgICA1Ci1WQUxVRSAgICAgICAgICAgQWNjdC1UZXJtaW5hdGUtQ2F1c2UgICAgQWRtaW4tUmVzZXQgICAgICAgICAgICAgNgotVkFMVUUgICAgICAgICAgIEFjY3QtVGVybWluYXRlLUNhdXNlICAgIEFkbWluLVJlYm9vdCAgICAgICAgICAgIDcKLVZBTFVFICAgICAgICAgICBBY2N0LVRlcm1pbmF0ZS1DYXVzZSAgICBQb3J0LUVycm9yICAgICAgICAgICAgICA4Ci1WQUxVRSAgICAgICAgICAgQWNjdC1UZXJtaW5hdGUtQ2F1c2UgICAgTkFTLUVycm9yICAgICAgICAgICAgICAgOQotVkFMVUUgICAgICAgICAgIEFjY3QtVGVybWluYXRlLUNhdXNlICAgIE5BUy1SZXF1ZXN0ICAgICAgICAgICAgIDEwCi1WQUxVRSAgICAgICAgICAgQWNjdC1UZXJtaW5hdGUtQ2F1c2UgICAgTkFTLVJlYm9vdCAgICAgICAgICAgICAgMTEKLVZBTFVFICAgICAgICAgICBBY2N0LVRlcm1pbmF0ZS1DYXVzZSAgICBQb3J0LVVubmVlZGVkICAgICAgICAgICAxMgotVkFMVUUgICAgICAgICAgIEFjY3QtVGVybWluYXRlLUNhdXNlICAgIFBvcnQtUHJlZW1wdGVkICAgICAgICAgIDEzCi1WQUxVRSAgICAgICAgICAgQWNjdC1UZXJtaW5hdGUtQ2F1c2UgICAgUG9ydC1TdXNwZW5kZWQgICAgICAgICAgMTQKLVZBTFVFICAgICAgICAgICBBY2N0LVRlcm1pbmF0ZS1DYXVzZSAgICBTZXJ2aWNlLVVuYXZhaWxhYmxlICAgICAxNQotVkFMVUUgICAgICAgICAgIEFjY3QtVGVybWluYXRlLUNhdXNlICAgIENhbGxiYWNrICAgICAgICAgICAgICAgIDE2Ci1WQUxVRSAgICAgICAgICAgQWNjdC1UZXJtaW5hdGUtQ2F1c2UgICAgVXNlci1FcnJvciAgICAgICAgICAgICAgMTcKLVZBTFVFICAgICAgICAgICBBY2N0LVRlcm1pbmF0ZS1DYXVzZSAgICBIb3N0LVJlcXVlc3QgICAgICAgICAgICAxOAotCi0jCi0jCU5vbi1Qcm90b2NvbCBJbnRlZ2VyIFRyYW5zbGF0aW9ucwotIwotCi1WQUxVRQkJQXV0aC1UeXBlCQlMb2NhbAkJCTAKLVZBTFVFCQlBdXRoLVR5cGUJCVN5c3RlbQkJCTEKLVZBTFVFCQlBdXRoLVR5cGUJCVNlY3VySUQJCQkyCi1WQUxVRQkJQXV0aC1UeXBlCQlDcnlwdC1Mb2NhbAkJMwotVkFMVUUJCUF1dGgtVHlwZQkJUmVqZWN0CQkJNAotCi0jCi0jCUNpc3Ryb24gZXh0ZW5zaW9ucwotIwotVkFMVUUJCUF1dGgtVHlwZQkJUGFtCQkJMjUzCi1WQUxVRQkJQXV0aC1UeXBlCQlOb25lCQkJMjU0Ci0KLSMKLSMJRXhwZXJpbWVudGFsIE5vbi1Qcm90b2NvbCBJbnRlZ2VyIFRyYW5zbGF0aW9ucyBmb3IgQ2lzdHJvbi1SYWRpdXNkCi0jCi1WQUxVRQkJRmFsbC1UaHJvdWdoCQlObwkJCTAKLVZBTFVFCQlGYWxsLVRocm91Z2gJCVllcwkJCTEKLVZBTFVFCQlBZGQtUG9ydC1Uby1JUC1BZGRyZXNzCU5vCQkJMAotVkFMVUUJCUFkZC1Qb3J0LVRvLUlQLUFkZHJlc3MJWWVzCQkJMQotCi0jCi0jCUNvbmZpZ3VyYXRpb24gVmFsdWVzCi0jCXVuY29tbWVudCB0aGVzZSB0d28gbGluZXMgdG8gdHVybiBhY2NvdW50IGV4cGlyYXRpb24gb24KLSMKLQotI1ZBTFVFCQlTZXJ2ZXItQ29uZmlnCQlQYXNzd29yZC1FeHBpcmF0aW9uCTMwCi0jVkFMVUUJCVNlcnZlci1Db25maWcJCVBhc3N3b3JkLVdhcm5pbmcJNQotCi0jICAgICAgIE9jdGV0cy1EaXJlY3Rpb24KLVZBTFVFCQlPY3RldHMtRGlyZWN0aW9uICAgICAgICBTdW0JCQkwCi1WQUxVRQkJT2N0ZXRzLURpcmVjdGlvbiAgICAgICAgSW5wdXQJCQkxCi1WQUxVRQkJT2N0ZXRzLURpcmVjdGlvbiAgICAgICAgT3V0cHV0CQkJMgotVkFMVUUJCU9jdGV0cy1EaXJlY3Rpb24gICAgICAgIE1heE92ZXJhbAkJMwotVkFMVUUJCU9jdGV0cy1EaXJlY3Rpb24gICAgICAgIE1heFNlc3Npb24JCTQKLQotSU5DTFVERSAvZXRjL3JhZGl1c2NsaWVudC9kaWN0aW9uYXJ5Lm1pY3Jvc29mdApkaWZmIC0tZ2l0IGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9ldGMvZGljdGlvbmFyeS5hc2NlbmQgYi9wcHBkL3BsdWdpbnMvcmFkaXVzL2V0Yy9kaWN0aW9uYXJ5LmFzY2VuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlmOWJkYy4uMDAwMDAwMAotLS0gYS9wcHBkL3BsdWdpbnMvcmFkaXVzL2V0Yy9kaWN0aW9uYXJ5LmFzY2VuZAorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0jCi0jIEFzY2VuZCBkaWN0aW9uYXJ5LgotIwotIwotIyBWZXJzaW9uOgkxLjAwICAyMS1KdWwtMTk5NyAgSmVucyBHbGFzZXIgPGplbnNAcmVnaW8ubmV0PgotIwotCi0KLSMKLSMJQXNjZW5kIHNwZWNpZmljIGV4dGVuc2lvbnMKLSMJVXNlZCBieSBBU0NFTkQgTUFYL1BpcGVsaW5lIHByb2R1Y3RzCi0jCi1BVFRSSUJVVEUJQXNjZW5kLUZDUC1QYXJhbWV0ZXIJCTExOQlzdHJpbmcKLUFUVFJJQlVURQlBc2NlbmQtTW9kZW0tUG9ydE5vCQkxMjAJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1Nb2RlbS1TbG90Tm8JCTEyMQlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLU1vZGVtLVNoZWxmTm8JCTEyMglpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLUNhbGwtQXR0ZW1wdC1MaW1pdAkxMjMJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1DYWxsLUJsb2NrLUR1cmF0aW9uCTEyNAlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLU1heGltdW0tQ2FsbC1EdXJhdGlvbgkxMjUJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1UZW1wb3JhcnktUnRlcwkJMTI2CWludGVnZXIKLUFUVFJJQlVURSAgICAgICBUdW5uZWxpbmctUHJvdG9jb2wgICAgICAgICAgICAgIDEyNyAgICAgaW50ZWdlcgotQVRUUklCVVRFICAgICAgIEFzY2VuZC1TaGFyZWQtUHJvZmlsZS1FbmFibGUgICAgMTI4ICAgICBpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLVByaW1hcnktSG9tZS1BZ2VudAkxMjkJc3RyaW5nCi1BVFRSSUJVVEUJQXNjZW5kLVNlY29uZGFyeS1Ib21lLUFnZW50CTEzMAlzdHJpbmcKLUFUVFJJQlVURQlBc2NlbmQtRGlhbG91dC1BbGxvd2VkCQkxMzEJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1DbGllbnQtR2F0ZXdheQkJMTMyCWlwYWRkcgotQVRUUklCVVRFCUFzY2VuZC1CQUNQLUVuYWJsZQkJMTMzCWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtREhDUC1NYXhpbXVtLUxlYXNlcwkxMzQJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1DbGllbnQtUHJpbWFyeS1ETlMJMTM1CWlwYWRkcgotQVRUUklCVVRFCUFzY2VuZC1DbGllbnQtU2Vjb25kYXJ5LUROUwkxMzYJaXBhZGRyCi1BVFRSSUJVVEUJQXNjZW5kLUNsaWVudC1Bc3NpZ24tRE5TCTEzNwlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLVVzZXItQWNjdC1UeXBlCQkxMzgJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1Vc2VyLUFjY3QtSG9zdAkJMTM5CWlwYWRkcgotQVRUUklCVVRFCUFzY2VuZC1Vc2VyLUFjY3QtUG9ydAkJMTQwCWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtVXNlci1BY2N0LUtleQkJMTQxCXN0cmluZwotQVRUUklCVVRFCUFzY2VuZC1Vc2VyLUFjY3QtQmFzZQkJMTQyCWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtVXNlci1BY2N0LVRpbWUJCTE0MwlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLUFzc2lnbi1JUC1DbGllbnQJCTE0NAlpcGFkZHIKLUFUVFJJQlVURQlBc2NlbmQtQXNzaWduLUlQLVNlcnZlcgkJMTQ1CWlwYWRkcgotQVRUUklCVVRFCUFzY2VuZC1Bc3NpZ24tSVAtR2xvYmFsLVBvb2wJMTQ2CXN0cmluZwotQVRUUklCVVRFCUFzY2VuZC1ESENQLVJlcGx5CQkxNDcJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1ESENQLVBvb2wtTnVtYmVyCQkxNDgJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1FeHBlY3QtQ2FsbGJhY2sJCTE0OQlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLUV2ZW50LVR5cGUJCTE1MAlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLVNlc3Npb24tU3ZyLUtleQkJMTUxCXN0cmluZwotQVRUUklCVVRFCUFzY2VuZC1NdWx0aWNhc3QtUmF0ZS1MaW1pdAkxNTIJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1JRi1OZXRtYXNrCQkxNTMJaXBhZGRyCi1BVFRSSUJVVEUJQXNjZW5kLVJlbW90ZS1BZGRyCQkxNTQJaXBhZGRyCi1BVFRSSUJVVEUJQXNjZW5kLU11bHRpY2FzdC1DbGllbnQJCTE1NQlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLUZSLUNpcmN1aXQtTmFtZQkJMTU2CXN0cmluZwotQVRUUklCVVRFCUFzY2VuZC1GUi1MaW5rVXAJCTE1NwlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLUZSLU5haWxlZC1HcnAJCTE1OAlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLUZSLVR5cGUJCQkxNTkJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1GUi1MaW5rLU1ndAkJMTYwCWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtRlItTjM5MQkJCTE2MQlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLUZSLURDRS1OMzkyCQkxNjIJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1GUi1EVEUtTjM5MgkJMTYzCWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtRlItRENFLU4zOTMJCTE2NAlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLUZSLURURS1OMzkzCQkxNjUJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1GUi1UMzkxCQkJMTY2CWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtRlItVDM5MgkJCTE2NwlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLUJyaWRnZS1BZGRyZXNzICAJIAkxNjgJc3RyaW5nCi1BVFRSSUJVVEUgICAgICAgQXNjZW5kLVRTLUlkbGUtTGltaXQgICAgICAgICAgICAxNjkgICAgIGludGVnZXIKLUFUVFJJQlVURSAgICAgICBBc2NlbmQtVFMtSWRsZS1Nb2RlICAgICAgICAgICAgIDE3MCAgICAgaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1EQkEtTW9uaXRvcgkgCTE3MQlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLUJhc2UtQ2hhbm5lbC1Db3VudCAJMTcyCWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtTWluaW11bS1DaGFubmVscwkJMTczCWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtSVBYLVJvdXRlCQkxNzQJc3RyaW5nCi1BVFRSSUJVVEUJQXNjZW5kLUZUMS1DYWxsZXIJCTE3NQlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLUJhY2t1cAkJCTE3NglzdHJpbmcKLUFUVFJJQlVURQlBc2NlbmQtQ2FsbC1UeXBlCQkxNzcJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1Hcm91cAkJCTE3OAlzdHJpbmcKLUFUVFJJQlVURQlBc2NlbmQtRlItRExDSQkJCTE3OQlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLUZSLVByb2ZpbGUtTmFtZQkJMTgwCXN0cmluZwotQVRUUklCVVRFCUFzY2VuZC1BcmEtUFcJCQkxODEJc3RyaW5nCi1BVFRSSUJVVEUJQXNjZW5kLUlQWC1Ob2RlLUFkZHIJCTE4MglzdHJpbmcKLUFUVFJJQlVURQlBc2NlbmQtSG9tZS1BZ2VudC1JUC1BZGRyCTE4MwlpcGFkZHIKLUFUVFJJQlVURQlBc2NlbmQtSG9tZS1BZ2VudC1QYXNzd29yZAkxODQJc3RyaW5nCi1BVFRSSUJVVEUJQXNjZW5kLUhvbWUtTmV0d29yay1OYW1lCTE4NQlzdHJpbmcKLUFUVFJJQlVURQlBc2NlbmQtSG9tZS1BZ2VudC1VRFAtUG9ydAkxODYJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1NdWx0aWxpbmstSUQJCTE4NwlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLU51bS1Jbi1NdWx0aWxpbmsJCTE4OAlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLUZpcnN0LURlc3QJCTE4OQlpcGFkZHIKLUFUVFJJQlVURQlBc2NlbmQtUHJlLUlucHV0LU9jdGV0cwkJMTkwCWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtUHJlLU91dHB1dC1PY3RldHMJMTkxCWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtUHJlLUlucHV0LVBhY2tldHMJMTkyCWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtUHJlLU91dHB1dC1QYWNrZXRzCTE5MwlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLU1heGltdW0tVGltZQkJMTk0CWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtRGlzY29ubmVjdC1DYXVzZQkJMTk1CWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtQ29ubmVjdC1Qcm9ncmVzcwkJMTk2CWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtRGF0YS1SYXRlCQkxOTcJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1QcmVTZXNzaW9uLVRpbWUJCTE5OAlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLVRva2VuLUlkbGUJCTE5OQlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLVRva2VuLUltbWVkaWF0ZQkJMjAwCWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtUmVxdWlyZS1BdXRoCQkyMDEJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1OdW1iZXItU2Vzc2lvbnMJCTIwMglzdHJpbmcKLUFUVFJJQlVURQlBc2NlbmQtQXV0aGVuLUFsaWFzCQkyMDMJc3RyaW5nCi1BVFRSSUJVVEUJQXNjZW5kLVRva2VuLUV4cGlyeQkJMjA0CWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtTWVudS1TZWxlY3RvcgkJMjA1CXN0cmluZwotQVRUUklCVVRFCUFzY2VuZC1NZW51LUl0ZW0JCTIwNglzdHJpbmcKLUFUVFJJQlVURQlBc2NlbmQtUFctV2FybnRpbWUJCTIwNwlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLVBXLUxpZmV0aW1lCQkyMDgJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1JUC1EaXJlY3QJCTIwOQlpcGFkZHIKLUFUVFJJQlVURQlBc2NlbmQtUFBQLVZKLVNsb3QtQ29tcAkJMjEwCWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtUFBQLVZKLTExNzIJCTIxMQlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLVBQUC1Bc3luYy1NYXAJCTIxMglpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLVRoaXJkLVByb21wdAkJMjEzCXN0cmluZwotQVRUUklCVVRFCUFzY2VuZC1TZW5kLVNlY3JldAkJMjE0CXN0cmluZwotQVRUUklCVVRFCUFzY2VuZC1SZWNlaXZlLVNlY3JldAkJMjE1CXN0cmluZwotQVRUUklCVVRFCUFzY2VuZC1JUFgtUGVlci1Nb2RlCQkyMTYJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1JUC1Qb29sLURlZmluaXRpb24JMjE3CXN0cmluZwotQVRUUklCVVRFCUFzY2VuZC1Bc3NpZ24tSVAtUG9vbAkJMjE4CWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtRlItRGlyZWN0CQkyMTkJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1GUi1EaXJlY3QtUHJvZmlsZQkyMjAJc3RyaW5nCi1BVFRSSUJVVEUJQXNjZW5kLUZSLURpcmVjdC1ETENJCQkyMjEJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1IYW5kbGUtSVBYCQkyMjIJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1OZXR3YXJlLXRpbWVvdXQJCTIyMwlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLUlQWC1BbGlhcwkJMjI0CWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtTWV0cmljCQkJMjI1CWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtUFJJLU51bWJlci1UeXBlCQkyMjYJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1EaWFsLU51bWJlcgkJMjI3CXN0cmluZwotQVRUUklCVVRFCUFzY2VuZC1Sb3V0ZS1JUAkJCTIyOAlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLVJvdXRlLUlQWAkJMjI5CWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtQnJpZGdlCQkJMjMwCWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtU2VuZC1BdXRoCQkyMzEJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1TZW5kLVBhc3N3ZAkJMjMyCXN0cmluZwotQVRUUklCVVRFCUFzY2VuZC1MaW5rLUNvbXByZXNzaW9uCQkyMzMJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1UYXJnZXQtVXRpbAkJMjM0CWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtTWF4aW11bS1DaGFubmVscwkJMjM1CWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtSW5jLUNoYW5uZWwtQ291bnQJMjM2CWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtRGVjLUNoYW5uZWwtQ291bnQJMjM3CWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtU2Vjb25kcy1PZi1IaXN0b3J5CTIzOAlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLUhpc3RvcnktV2VpZ2gtVHlwZQkyMzkJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1BZGQtU2Vjb25kcwkJMjQwCWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtUmVtb3ZlLVNlY29uZHMJCTI0MQlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLUlkbGUtTGltaXQJCTI0NAlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLVByZWVtcHQtTGltaXQJCTI0NQlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLUNhbGxiYWNrCQkJMjQ2CWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtRGF0YS1TdmMJCQkyNDcJaW50ZWdlcgotQVRUUklCVVRFCUFzY2VuZC1Gb3JjZS01NgkJCTI0OAlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLUJpbGxpbmctTnVtYmVyCQkyNDkJc3RyaW5nCi1BVFRSSUJVVEUJQXNjZW5kLUNhbGwtQnktQ2FsbAkJMjUwCWludGVnZXIKLUFUVFJJQlVURQlBc2NlbmQtVHJhbnNpdC1OdW1iZXIJCTI1MQlzdHJpbmcKLUFUVFJJQlVURQlBc2NlbmQtSG9zdC1JbmZvCQkyNTIJc3RyaW5nCi1BVFRSSUJVVEUJQXNjZW5kLVBQUC1BZGRyZXNzCQkyNTMJaXBhZGRyCi1BVFRSSUJVVEUJQXNjZW5kLU1QUC1JZGxlLVBlcmNlbnQJCTI1NAlpbnRlZ2VyCi1BVFRSSUJVVEUJQXNjZW5kLVhtaXQtUmF0ZQkJMjU1CWludGVnZXIKLQotCi0KLSMgQXNjZW5kIHByb3RvY29scwotVkFMVUUJCVNlcnZpY2UtVHlwZQkJRGlhbG91dC1GcmFtZWQtVXNlcgk1Ci1WQUxVRQkJRnJhbWVkLVByb3RvY29sCQlBUkEJCQkyNTUKLVZBTFVFCQlGcmFtZWQtUHJvdG9jb2wJCU1QUAkJCTI1NgotVkFMVUUJCUZyYW1lZC1Qcm90b2NvbAkJRVVSQVcJCQkyNTcKLVZBTFVFCQlGcmFtZWQtUHJvdG9jb2wJCUVVVUkJCQkyNTgKLVZBTFVFCQlGcmFtZWQtUHJvdG9jb2wJCVgyNQkJCTI1OQotVkFMVUUJCUZyYW1lZC1Qcm90b2NvbAkJQ09NQgkJCTI2MAotVkFMVUUJCUZyYW1lZC1Qcm90b2NvbAkJRlIJCQkyNjEKLVZBTFVFCQlGcmFtZWQtUHJvdG9jb2wJCU1QCQkJMjYyCi1WQUxVRQkJRnJhbWVkLVByb3RvY29sCQlGUi1DSVIJCQkyNjMKLQotCi0jCi0jCUFzY2VuZCBzcGVjaWZpYyBleHRlbnNpb25zCi0jCVVzZWQgYnkgQVNDRU5EIE1BWC9QaXBlbGluZSBwcm9kdWN0cyAoc2VlIGFib3ZlKQotIwotCi1WQUxVRQkJQXNjZW5kLUZSLURpcmVjdAlGUi1EaXJlY3QtTm8JCTAKLVZBTFVFCQlBc2NlbmQtRlItRGlyZWN0CUZSLURpcmVjdC1ZZXMJCTEKLVZBTFVFCQlBc2NlbmQtSGFuZGxlLUlQWAlIYW5kbGUtSVBYLU5vbmUJCTAKLVZBTFVFCQlBc2NlbmQtSGFuZGxlLUlQWAlIYW5kbGUtSVBYLUNsaWVudAkxCi1WQUxVRQkJQXNjZW5kLUhhbmRsZS1JUFgJSGFuZGxlLUlQWC1TZXJ2ZXIJMgotVkFMVUUJCUFzY2VuZC1JUFgtUGVlci1Nb2RlCUlQWC1QZWVyLVJvdXRlcgkJMAotVkFMVUUJCUFzY2VuZC1JUFgtUGVlci1Nb2RlCUlQWC1QZWVyLURpYWxpbgkJMQotVkFMVUUJCUFzY2VuZC1DYWxsLVR5cGUJTmFpbGVkCQkJMQotVkFMVUUJCUFzY2VuZC1DYWxsLVR5cGUJTmFpbGVkL01wcAkJMgotVkFMVUUJCUFzY2VuZC1DYWxsLVR5cGUJUGVybS9Td2l0Y2hlZAkJMwotVkFMVUUJCUFzY2VuZC1GVDEtQ2FsbGVyCUZUMS1ObwkJCTAKLVZBTFVFCQlBc2NlbmQtRlQxLUNhbGxlcglGVDEtWWVzCQkJMQotVkFMVUUJCUFzY2VuZC1QUkktTnVtYmVyLVR5cGUJVW5rbm93bi1OdW1iZXIJCTAKLVZBTFVFCQlBc2NlbmQtUFJJLU51bWJlci1UeXBlCUludGwtTnVtYmVyCQkxCi1WQUxVRQkJQXNjZW5kLVBSSS1OdW1iZXItVHlwZQlOYXRpb25hbC1OdW1iZXIJCTIKLVZBTFVFCQlBc2NlbmQtUFJJLU51bWJlci1UeXBlCUxvY2FsLU51bWJlcgkJNAotVkFMVUUJCUFzY2VuZC1QUkktTnVtYmVyLVR5cGUJQWJicmV2LU51bWJlcgkJNQotVkFMVUUJCUFzY2VuZC1Sb3V0ZS1JUFgJUm91dGUtSVBYLU5vCQkwCi1WQUxVRQkJQXNjZW5kLVJvdXRlLUlQWAlSb3V0ZS1JUFgtWWVzCQkxCi1WQUxVRQkJQXNjZW5kLUJyaWRnZQkJQnJpZGdlLU5vCQkwCi1WQUxVRQkJQXNjZW5kLUJyaWRnZQkJQnJpZGdlLVllcwkJMQotVkFMVUUgIAkJQXNjZW5kLVRTLUlkbGUtTW9kZSAgICAgVFMtSWRsZS1Ob25lCQkwCi1WQUxVRQkgIAlBc2NlbmQtVFMtSWRsZS1Nb2RlICAgICBUUy1JZGxlLUlucHV0CQkxCi1WQUxVRSAgCQlBc2NlbmQtVFMtSWRsZS1Nb2RlICAgICBUUy1JZGxlLUlucHV0LU91dHB1dAkyCi1WQUxVRQkJQXNjZW5kLVNlbmQtQXV0aAlTZW5kLUF1dGgtTm9uZQkJMAotVkFMVUUJCUFzY2VuZC1TZW5kLUF1dGgJU2VuZC1BdXRoLVBBUAkJMQotVkFMVUUJCUFzY2VuZC1TZW5kLUF1dGgJU2VuZC1BdXRoLUNIQVAJCTIKLVZBTFVFCQlBc2NlbmQtU2VuZC1BdXRoCVNlbmQtQXV0aC1NUy1DSEFQCTMKLVZBTFVFCQlBc2NlbmQtTGluay1Db21wcmVzc2lvbglMaW5rLUNvbXAtTm9uZQkJMAotVkFMVUUJCUFzY2VuZC1MaW5rLUNvbXByZXNzaW9uCUxpbmstQ29tcC1TdGFjCQkxCi1WQUxVRQkJQXNjZW5kLUxpbmstQ29tcHJlc3Npb24JTGluay1Db21wLVN0YWMtRHJhZnQtOQkyCi1WQUxVRQkJQXNjZW5kLUxpbmstQ29tcHJlc3Npb24JTGluay1Db21wLU1TLVN0YWMJMwotVkFMVUUJCUFzY2VuZC1IaXN0b3J5LVdlaWdoLVR5cGUJSGlzdG9yeS1Db25zdGFudAkwCi1WQUxVRQkJQXNjZW5kLUhpc3RvcnktV2VpZ2gtVHlwZQlIaXN0b3J5LUxpbmVhcgkJMQotVkFMVUUJCUFzY2VuZC1IaXN0b3J5LVdlaWdoLVR5cGUJSGlzdG9yeS1RdWFkcmF0aWMJMgotVkFMVUUJCUFzY2VuZC1DYWxsYmFjawkJQ2FsbGJhY2stTm8JCTAKLVZBTFVFCQlBc2NlbmQtQ2FsbGJhY2sJCUNhbGxiYWNrLVllcwkJMQotVkFMVUUJCUFzY2VuZC1FeHBlY3QtQ2FsbGJhY2sJRXhwZWN0LUNhbGxiYWNrLU5vCTAKLVZBTFVFCQlBc2NlbmQtRXhwZWN0LUNhbGxiYWNrCUV4cGVjdC1DYWxsYmFjay1ZZXMJMQotVkFMVUUJCUFzY2VuZC1EYXRhLVN2YwkJU3dpdGNoZWQtVm9pY2UtQmVhcmVyCTAKLVZBTFVFCQlBc2NlbmQtRGF0YS1TdmMJCVN3aXRjaGVkLTU2S1IJCTEKLVZBTFVFCQlBc2NlbmQtRGF0YS1TdmMJCVN3aXRjaGVkLTY0SwkJMgotVkFMVUUJCUFzY2VuZC1EYXRhLVN2YwkJU3dpdGNoZWQtNjRLUgkJMwotVkFMVUUJCUFzY2VuZC1EYXRhLVN2YwkJU3dpdGNoZWQtNTZLCQk0Ci1WQUxVRQkJQXNjZW5kLURhdGEtU3ZjCQlTd2l0Y2hlZC0zODRLUgkJNQotVkFMVUUJCUFzY2VuZC1EYXRhLVN2YwkJU3dpdGNoZWQtMzg0SwkJNgotVkFMVUUJCUFzY2VuZC1EYXRhLVN2YwkJU3dpdGNoZWQtMTUzNksJCTcKLVZBTFVFCQlBc2NlbmQtRGF0YS1TdmMJCVN3aXRjaGVkLTE1MzZLUgkJOAotVkFMVUUJCUFzY2VuZC1EYXRhLVN2YwkJU3dpdGNoZWQtMTI4SwkJOQotVkFMVUUJCUFzY2VuZC1EYXRhLVN2YwkJU3dpdGNoZWQtMTkySwkJMTAKLVZBTFVFCQlBc2NlbmQtRGF0YS1TdmMJCVN3aXRjaGVkLTI1NksJCTExCi1WQUxVRQkJQXNjZW5kLURhdGEtU3ZjCQlTd2l0Y2hlZC0zMjBLCQkxMgotVkFMVUUJCUFzY2VuZC1EYXRhLVN2YwkJU3dpdGNoZWQtMzg0Sy1NUgkxMwotVkFMVUUJCUFzY2VuZC1EYXRhLVN2YwkJU3dpdGNoZWQtNDQ4SwkJMTQKLVZBTFVFCQlBc2NlbmQtRGF0YS1TdmMJCVN3aXRjaGVkLTUxMksJCTE1Ci1WQUxVRQkJQXNjZW5kLURhdGEtU3ZjCQlTd2l0Y2hlZC01NzZLCQkxNgotVkFMVUUJCUFzY2VuZC1EYXRhLVN2YwkJU3dpdGNoZWQtNjQwSwkJMTcKLVZBTFVFCQlBc2NlbmQtRGF0YS1TdmMJCVN3aXRjaGVkLTcwNEsJCTE4Ci1WQUxVRQkJQXNjZW5kLURhdGEtU3ZjCQlTd2l0Y2hlZC03NjhLCQkxOQotVkFMVUUJCUFzY2VuZC1EYXRhLVN2YwkJU3dpdGNoZWQtODMySwkJMjAKLVZBTFVFCQlBc2NlbmQtRGF0YS1TdmMJCVN3aXRjaGVkLTg5NksJCTIxCi1WQUxVRQkJQXNjZW5kLURhdGEtU3ZjCQlTd2l0Y2hlZC05NjBLCQkyMgotVkFMVUUJCUFzY2VuZC1EYXRhLVN2YwkJU3dpdGNoZWQtMTAyNEsJCTIzCi1WQUxVRQkJQXNjZW5kLURhdGEtU3ZjCQlTd2l0Y2hlZC0xMDg4SwkJMjQKLVZBTFVFCQlBc2NlbmQtRGF0YS1TdmMJCVN3aXRjaGVkLTExNTJLCQkyNQotVkFMVUUJCUFzY2VuZC1EYXRhLVN2YwkJU3dpdGNoZWQtMTIxNksJCTI2Ci1WQUxVRQkJQXNjZW5kLURhdGEtU3ZjCQlTd2l0Y2hlZC0xMjgwSwkJMjcKLVZBTFVFCQlBc2NlbmQtRGF0YS1TdmMJCVN3aXRjaGVkLTEzNDRLCQkyOAotVkFMVUUJCUFzY2VuZC1EYXRhLVN2YwkJU3dpdGNoZWQtMTQwOEsJCTI5Ci1WQUxVRQkJQXNjZW5kLURhdGEtU3ZjCQlTd2l0Y2hlZC0xNDcySwkJMzAKLVZBTFVFCQlBc2NlbmQtRGF0YS1TdmMJCVN3aXRjaGVkLTE2MDBLCQkzMQotVkFMVUUJCUFzY2VuZC1EYXRhLVN2YwkJU3dpdGNoZWQtMTY2NEsJCTMyCi1WQUxVRQkJQXNjZW5kLURhdGEtU3ZjCQlTd2l0Y2hlZC0xNzI4SwkJMzMKLVZBTFVFCQlBc2NlbmQtRGF0YS1TdmMJCVN3aXRjaGVkLTE3OTJLCQkzNAotVkFMVUUJCUFzY2VuZC1EYXRhLVN2YwkJU3dpdGNoZWQtMTg1NksJCTM1Ci1WQUxVRQkJQXNjZW5kLURhdGEtU3ZjCQlTd2l0Y2hlZC0xOTIwSwkJMzYKLVZBTFVFCQlBc2NlbmQtRGF0YS1TdmMJCVN3aXRjaGVkLWluaGVyaXRlZAkJMzcKLVZBTFVFCQlBc2NlbmQtRGF0YS1TdmMJCVN3aXRjaGVkLXJlc3RyaWN0ZWQtYmVhcmVyLXgzMCAgMzgKLVZBTFVFCQlBc2NlbmQtRGF0YS1TdmMJCVN3aXRjaGVkLWNsZWFyLWJlYXJlci12MTEwCTM5Ci1WQUxVRQkJQXNjZW5kLURhdGEtU3ZjCQlTd2l0Y2hlZC1yZXN0cmljdGVkLTY0LXgzMAk0MAotVkFMVUUJCUFzY2VuZC1EYXRhLVN2YwkJU3dpdGNoZWQtY2xlYXItNTYtdjExMAkJNDEKLVZBTFVFCQlBc2NlbmQtRGF0YS1TdmMJCVN3aXRjaGVkLW1vZGVtCQkJNDIKLVZBTFVFCQlBc2NlbmQtRGF0YS1TdmMJCVN3aXRjaGVkLWF0bW9kZW0JCTQzCi1WQUxVRQkJQXNjZW5kLURhdGEtU3ZjCQlOYWlsZWQtNTZLUgkJMQotVkFMVUUJCUFzY2VuZC1EYXRhLVN2YwkJTmFpbGVkLTY0SwkJMgotVkFMVUUJCUFzY2VuZC1Gb3JjZS01NgkJRm9yY2UtNTYtTm8JCTAKLVZBTFVFCQlBc2NlbmQtRm9yY2UtNTYJCUZvcmNlLTU2LVllcwkJMQotVkFMVUUJCUFzY2VuZC1QVy1MaWZldGltZQlMaWZldGltZS1Jbi1EYXlzCTAKLVZBTFVFCQlBc2NlbmQtUFctV2FybnRpbWUJRGF5cy1PZi1XYXJuaW5nCQkwCi1WQUxVRQkJQXNjZW5kLVBQUC1WSi0xMTcyCVBQUC1WSi0xMTcyCQkxCi1WQUxVRQkJQXNjZW5kLVBQUC1WSi1TbG90LUNvbXAJVkotU2xvdC1Db21wLU5vCQkxCi1WQUxVRQkJQXNjZW5kLVJlcXVpcmUtQXV0aAlOb3QtUmVxdWlyZS1BdXRoCTAKLVZBTFVFCQlBc2NlbmQtUmVxdWlyZS1BdXRoCVJlcXVpcmUtQXV0aAkJMQotVkFMVUUJCUFzY2VuZC1Ub2tlbi1JbW1lZGlhdGUJVG9rLUltbS1ObwkJMAotVkFMVUUJCUFzY2VuZC1Ub2tlbi1JbW1lZGlhdGUJVG9rLUltbS1ZZXMJCTEKLVZBTFVFCQlBc2NlbmQtREJBLU1vbml0b3IJCURCQS1UcmFuc21pdAkJMAotVkFMVUUgCQlBc2NlbmQtREJBLU1vbml0b3IJREJBLVRyYW5zbWl0LVJlY3YJMQotVkFMVUUJCUFzY2VuZC1EQkEtTW9uaXRvcglEQkEtTm9uZQkJMgotVkFMVUUJCUFzY2VuZC1GUi1UeXBlCQlBc2NlbmQtRlItRFRFCQkwCi1WQUxVRQkJQXNjZW5kLUZSLVR5cGUJCUFzY2VuZC1GUi1EQ0UJCTEKLVZBTFVFCQlBc2NlbmQtRlItVHlwZQkJQXNjZW5kLUZSLU5OSQkJMgotVkFMVUUJCUFzY2VuZC1GUi1MaW5rLU1ndAlBc2NlbmQtRlItTm8tTGluay1NZ3QJMAotVkFMVUUJCUFzY2VuZC1GUi1MaW5rLU1ndAlBc2NlbmQtRlItVDEtNjE3RAkxCi1WQUxVRQkJQXNjZW5kLUZSLUxpbmstTWd0CUFzY2VuZC1GUi1RLTkzM0EJMgotVkFMVUUJCUFzY2VuZC1GUi1MaW5rVXAJQXNjZW5kLUxpbmtVcC1EZWZhdWx0CTAKLVZBTFVFCQlBc2NlbmQtRlItTGlua1VwCUFzY2VuZC1MaW5rVXAtQWx3YXlzVXAJMQotVkFMVUUJCUFzY2VuZC1NdWx0aWNhc3QtQ2xpZW50CU11bHRpY2FzdC1ObwkJMAotVkFMVUUJCUFzY2VuZC1NdWx0aWNhc3QtQ2xpZW50CU11bHRpY2FzdC1ZZXMJCTEKLVZBTFVFCQlBc2NlbmQtVXNlci1BY2N0LVR5cGUJQXNjZW5kLVVzZXItQWNjdC1Ob25lCTAKLVZBTFVFCQlBc2NlbmQtVXNlci1BY2N0LVR5cGUJQXNjZW5kLVVzZXItQWNjdC1Vc2VyCTEKLVZBTFVFCQlBc2NlbmQtVXNlci1BY2N0LVR5cGUJQXNjZW5kLVVzZXItQWNjdC1Vc2VyLURlZmF1bHQJMgotVkFMVUUJCUFzY2VuZC1Vc2VyLUFjY3QtQmFzZQlCYXNlLTEwCQkJMAotVkFMVUUJCUFzY2VuZC1Vc2VyLUFjY3QtQmFzZQlCYXNlLTE2CQkJMQotVkFMVUUJCUFzY2VuZC1ESENQLVJlcGx5CURIQ1AtUmVwbHktTm8JCTAKLVZBTFVFCQlBc2NlbmQtREhDUC1SZXBseQlESENQLVJlcGx5LVllcwkJMQotVkFMVUUJCUFzY2VuZC1DbGllbnQtQXNzaWduLUROUwlETlMtQXNzaWduLU5vCQkwCi1WQUxVRQkJQXNjZW5kLUNsaWVudC1Bc3NpZ24tRE5TCUROUy1Bc3NpZ24tWWVzCQkxCi1WQUxVRQkJQXNjZW5kLUV2ZW50LVR5cGUJQXNjZW5kLUNvbGRTdGFydAkxCi1WQUxVRQkJQXNjZW5kLUV2ZW50LVR5cGUJQXNjZW5kLVNlc3Npb24tRXZlbnQJMgotVkFMVUUJCUFzY2VuZC1CQUNQLUVuYWJsZQlCQUNQLU5vCQkJMAotVkFMVUUJCUFzY2VuZC1CQUNQLUVuYWJsZQlCQUNQLVllcwkJMQotVkFMVUUJCUFzY2VuZC1EaWFsb3V0LUFsbG93ZWQJRGlhbG91dC1Ob3QtQWxsb3dlZAkwCi1WQUxVRQkJQXNjZW5kLURpYWxvdXQtQWxsb3dlZAlEaWFsb3V0LUFsbG93ZWQJCTEKLVZBTFVFCQlBc2NlbmQtU2hhcmVkLVByb2ZpbGUtRW5hYmxlICAgIFNoYXJlZC1Qcm9maWxlLU5vICAgICAgIDAKLVZBTFVFCQlBc2NlbmQtU2hhcmVkLVByb2ZpbGUtRW5hYmxlICAgIFNoYXJlZC1Qcm9maWxlLVllcyAgICAgIDEKLVZBTFVFCQlBc2NlbmQtVGVtcG9yYXJ5LVJ0ZXMJVGVtcC1SdGVzLU5vCQkwCi1WQUxVRQkJQXNjZW5kLVRlbXBvcmFyeS1SdGVzCVRlbXAtUnRlcy1ZZXMJCTEKZGlmZiAtLWdpdCBhL3BwcGQvcGx1Z2lucy9yYWRpdXMvZXRjL2RpY3Rpb25hcnkuY29tcGF0IGIvcHBwZC9wbHVnaW5zL3JhZGl1cy9ldGMvZGljdGlvbmFyeS5jb21wYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlM2YwODcuLjAwMDAwMDAKLS0tIGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9ldGMvZGljdGlvbmFyeS5jb21wYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jCi0jCU9ic29sZXRlIG5hbWVzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHVzZXJzIGZpbGVzLgotIwotQVRUUklCVVRFCUNsaWVudC1JZAkJNAlpcGFkZHIKLUFUVFJJQlVURQlDbGllbnQtUG9ydC1JZAkJNQlpbnRlZ2VyCi1BVFRSSUJVVEUJVXNlci1TZXJ2aWNlLVR5cGUJNglpbnRlZ2VyCi1BVFRSSUJVVEUJRnJhbWVkLUFkZHJlc3MJCTgJaXBhZGRyCi1BVFRSSUJVVEUJRnJhbWVkLU5ldG1hc2sJCTkJaXBhZGRyCi1BVFRSSUJVVEUJRnJhbWVkLUZpbHRlci1JZAkxMQlzdHJpbmcKLUFUVFJJQlVURQlMb2dpbi1Ib3N0CQkxNAlpcGFkZHIKLUFUVFJJQlVURQlMb2dpbi1Qb3J0CQkxNglpbnRlZ2VyCi1BVFRSSUJVVEUJT2xkLVBhc3N3b3JkCQkxNwlzdHJpbmcKLUFUVFJJQlVURQlQb3J0LU1lc3NhZ2UJCTE4CXN0cmluZwotQVRUUklCVVRFCURpYWxiYWNrLU5vCQkxOQlzdHJpbmcKLUFUVFJJQlVURQlEaWFsYmFjay1OYW1lCQkyMAlzdHJpbmcKLUFUVFJJQlVURQlDaGFsbGVuZ2UtU3RhdGUJCTI0CXN0cmluZwotVkFMVUUJCUZyYW1lZC1Db21wcmVzc2lvbglWYW4tSmFjb2JzZW4tVENQLUlQCTEKLVZBTFVFCQlGcmFtZWQtQ29tcHJlc3Npb24JVkotVENQLUlQCQkxCi1WQUxVRQkJU2VydmljZS1UeXBlCQlTaGVsbC1Vc2VyCQk2Ci1WQUxVRQkJQXV0aC1UeXBlCQlVbml4CQkJMQotVkFMVUUJCVNlcnZpY2UtVHlwZQkJRGlhbGJhY2stTG9naW4tVXNlcgkzCi1WQUxVRQkJU2VydmljZS1UeXBlCQlEaWFsYmFjay1GcmFtZWQtVXNlcgk0Ci0KLSMKLSMJRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBNRVJJVCB1c2VycyBmaWxlcy4KLSMKLUFUVFJJQlVURQlOQVMtUG9ydAkJNQlpbnRlZ2VyCi1BVFRSSUJVVEUJTG9naW4tSG9zdAkJMTQJaXBhZGRyCi1BVFRSSUJVVEUJTG9naW4tQ2FsbGJhY2stTnVtYmVyCTE5CXN0cmluZwotQVRUUklCVVRFCUZyYW1lZC1DYWxsYmFjay1JZAkyMAlzdHJpbmcKLUFUVFJJQlVURQlDbGllbnQtUG9ydC1ETklTCTMwCXN0cmluZwotQVRUUklCVVRFCUNhbGxlci1JRAkJMzEJc3RyaW5nCi1WQUxVRQkJU2VydmljZS1UeXBlCQlMb2dpbgkJCTEKLVZBTFVFCQlTZXJ2aWNlLVR5cGUJCUZyYW1lZAkJCTIKLVZBTFVFCQlTZXJ2aWNlLVR5cGUJCUNhbGxiYWNrLUxvZ2luCQkzCi1WQUxVRQkJU2VydmljZS1UeXBlCQlDYWxsYmFjay1GcmFtZWQJCTQKLVZBTFVFCQlTZXJ2aWNlLVR5cGUJCUV4ZWMtVXNlcgkJNwotCi0jCi0jCUZvciBjb21wYXRpYmlsaXR5IHdpdGggRVNWQSBSQURJVVMsIE9sZCBDaXN0cm9uIFJBRElVUwotIwotQVRUUklCVVRFCVNlc3Npb24JCQkxMDM0CWludGVnZXIKLUFUVFJJQlVURQlVc2VyLU5hbWUtSXMtU3RhcgkxMDM1CWludGVnZXIKLVZBTFVFCQlVc2VyLU5hbWUtSXMtU3RhcglObwkJCTAKLVZBTFVFCQlVc2VyLU5hbWUtSXMtU3RhcglZZXMJCQkxCmRpZmYgLS1naXQgYS9wcHBkL3BsdWdpbnMvcmFkaXVzL2V0Yy9kaWN0aW9uYXJ5Lm1lcml0IGIvcHBwZC9wbHVnaW5zL3JhZGl1cy9ldGMvZGljdGlvbmFyeS5tZXJpdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q2NzVlNS4uMDAwMDAwMAotLS0gYS9wcHBkL3BsdWdpbnMvcmFkaXVzL2V0Yy9kaWN0aW9uYXJ5Lm1lcml0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIwotIwlFeHBlcmltZW50YWwgZXh0ZW5zaW9ucywgY29uZmlndXJhdGlvbiBvbmx5IChmb3IgY2hlY2staXRlbXMpCi0jCU5hbWVzL251bWJlcnMgYXMgcGVyIHRoZSBNRVJJVCBleHRlbnNpb25zIChpZiBwb3NzaWJsZSkuCi0jCi1BVFRSSUJVVEUJTkFTLUlkZW50aWZpZXIJCTMyCXN0cmluZwotQVRUUklCVVRFCVByb3h5LVN0YXRlCQkzMwlzdHJpbmcKLUFUVFJJQlVURQlMb2dpbi1MQVQtU2VydmljZQkzNAlzdHJpbmcKLUFUVFJJQlVURQlMb2dpbi1MQVQtTm9kZQkJMzUJc3RyaW5nCi1BVFRSSUJVVEUJTG9naW4tTEFULUdyb3VwCQkzNglzdHJpbmcKLUFUVFJJQlVURQlGcmFtZWQtQXBwbGVUYWxrLUxpbmsJMzcJaW50ZWdlcgotQVRUUklCVVRFCUZyYW1lZC1BcHBsZVRhbGstTmV0d29yayAzOAlpbnRlZ2VyCi1BVFRSSUJVVEUJRnJhbWVkLUFwcGxlVGFsay1ab25lCTM5CXN0cmluZwotQVRUUklCVVRFICAgICAgIEFjY3QtSW5wdXQtUGFja2V0cwk0NwlpbnRlZ2VyCi1BVFRSSUJVVEUgICAgICAgQWNjdC1PdXRwdXQtUGFja2V0cwk0OAlpbnRlZ2VyCi0jIDggaXMgYSBNRVJJVCBleHRlbnNpb24uCi1WQUxVRQkJU2VydmljZS1UeXBlCQlBdXRoZW50aWNhdGUtT25seQk4Ci0KZGlmZiAtLWdpdCBhL3BwcGQvcGx1Z2lucy9yYWRpdXMvZXRjL2RpY3Rpb25hcnkubWljcm9zb2Z0IGIvcHBwZC9wbHVnaW5zL3JhZGl1cy9ldGMvZGljdGlvbmFyeS5taWNyb3NvZnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhM2EzMTcuLjAwMDAwMDAKLS0tIGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9ldGMvZGljdGlvbmFyeS5taWNyb3NvZnQKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0jCi0jCU1pY3Jvc29mdCdzIFZTQSdzLCBmcm9tIFJGQyAyNTQ4Ci0jCi0jCSRJZDogZGljdGlvbmFyeS5taWNyb3NvZnQsdiAxLjEgMjAwNC8xMS8xNCAwNzoyNjoyNiBwYXVsdXMgRXhwICQKLSMKLQotVkVORE9SCQlNaWNyb3NvZnQJMzExCU1pY3Jvc29mdAotCi1BVFRSSUJVVEUJTVMtQ0hBUC1SZXNwb25zZQkxCXN0cmluZwlNaWNyb3NvZnQKLUFUVFJJQlVURQlNUy1DSEFQLUVycm9yCQkyCXN0cmluZwlNaWNyb3NvZnQKLUFUVFJJQlVURQlNUy1DSEFQLUNQVy0xCQkzCXN0cmluZwlNaWNyb3NvZnQKLUFUVFJJQlVURQlNUy1DSEFQLUNQVy0yCQk0CXN0cmluZwlNaWNyb3NvZnQKLUFUVFJJQlVURQlNUy1DSEFQLUxNLUVuYy1QVwk1CXN0cmluZwlNaWNyb3NvZnQKLUFUVFJJQlVURQlNUy1DSEFQLU5ULUVuYy1QVwk2CXN0cmluZwlNaWNyb3NvZnQKLUFUVFJJQlVURQlNUy1NUFBFLUVuY3J5cHRpb24tUG9saWN5IDcJc3RyaW5nCU1pY3Jvc29mdAotIyBUaGlzIGlzIHJlZmVycmVkIHRvIGFzIGJvdGggc2luZ3VsYXIgYW5kIHBsdXJhbCBpbiB0aGUgUkZDLgotIyBQbHVyYWwgc2VlbXMgdG8gbWFrZSBtb3JlIHNlbnNlLgotQVRUUklCVVRFCU1TLU1QUEUtRW5jcnlwdGlvbi1UeXBlIDgJc3RyaW5nCU1pY3Jvc29mdAotQVRUUklCVVRFCU1TLU1QUEUtRW5jcnlwdGlvbi1UeXBlcyAgOAlzdHJpbmcJTWljcm9zb2Z0Ci1BVFRSSUJVVEUJTVMtUkFTLVZlbmRvcgkJOQlpbnRlZ2VyCU1pY3Jvc29mdAotQVRUUklCVVRFCU1TLUNIQVAtRG9tYWluCQkxMAlzdHJpbmcJTWljcm9zb2Z0Ci1BVFRSSUJVVEUJTVMtQ0hBUC1DaGFsbGVuZ2UJMTEJc3RyaW5nCU1pY3Jvc29mdAotQVRUUklCVVRFCU1TLUNIQVAtTVBQRS1LZXlzCTEyCXN0cmluZwlNaWNyb3NvZnQKLUFUVFJJQlVURQlNUy1CQVAtVXNhZ2UJCTEzCWludGVnZXIJTWljcm9zb2Z0Ci1BVFRSSUJVVEUJTVMtTGluay1VdGlsaXphdGlvbi1UaHJlc2hvbGQgMTQgaW50ZWdlcglNaWNyb3NvZnQKLUFUVFJJQlVURQlNUy1MaW5rLURyb3AtVGltZS1MaW1pdAkxNQlpbnRlZ2VyCU1pY3Jvc29mdAotQVRUUklCVVRFCU1TLU1QUEUtU2VuZC1LZXkJMTYJc3RyaW5nCU1pY3Jvc29mdAotQVRUUklCVVRFCU1TLU1QUEUtUmVjdi1LZXkJMTcJc3RyaW5nCU1pY3Jvc29mdAotQVRUUklCVVRFCU1TLVJBUy1WZXJzaW9uCQkxOAlzdHJpbmcJTWljcm9zb2Z0Ci1BVFRSSUJVVEUJTVMtT2xkLUFSQVAtUGFzc3dvcmQJMTkJc3RyaW5nCU1pY3Jvc29mdAotQVRUUklCVVRFCU1TLU5ldy1BUkFQLVBhc3N3b3JkCTIwCXN0cmluZwlNaWNyb3NvZnQKLUFUVFJJQlVURQlNUy1BUkFQLVBXLUNoYW5nZS1SZWFzb24gMjEJaW50ZWdlcglNaWNyb3NvZnQKLQotQVRUUklCVVRFCU1TLUZpbHRlcgkJMjIJc3RyaW5nCU1pY3Jvc29mdAotQVRUUklCVVRFCU1TLUFjY3QtQXV0aC1UeXBlCTIzCWludGVnZXIJTWljcm9zb2Z0Ci1BVFRSSUJVVEUJTVMtQWNjdC1FQVAtVHlwZQkyNAlpbnRlZ2VyCU1pY3Jvc29mdAotCi1BVFRSSUJVVEUJTVMtQ0hBUDItUmVzcG9uc2UJMjUJc3RyaW5nCU1pY3Jvc29mdAotQVRUUklCVVRFCU1TLUNIQVAyLVN1Y2Nlc3MJMjYJc3RyaW5nCU1pY3Jvc29mdAotQVRUUklCVVRFCU1TLUNIQVAyLUNQVwkJMjcJc3RyaW5nCU1pY3Jvc29mdAotCi1BVFRSSUJVVEUJTVMtUHJpbWFyeS1ETlMtU2VydmVyCTI4CWlwYWRkcglNaWNyb3NvZnQKLUFUVFJJQlVURQlNUy1TZWNvbmRhcnktRE5TLVNlcnZlcgkyOQlpcGFkZHIJTWljcm9zb2Z0Ci1BVFRSSUJVVEUJTVMtUHJpbWFyeS1OQk5TLVNlcnZlcgkzMAlpcGFkZHIJTWljcm9zb2Z0Ci1BVFRSSUJVVEUJTVMtU2Vjb25kYXJ5LU5CTlMtU2VydmVyIDMxCWlwYWRkcglNaWNyb3NvZnQKLQotI0FUVFJJQlVURQlNUy1BUkFQLUNoYWxsZW5nZQkzMwlzdHJpbmcJTWljcm9zb2Z0Ci0KLQotIwotIwlJbnRlZ2VyIFRyYW5zbGF0aW9ucwotIwotCi0jCU1TLUJBUC1Vc2FnZSBWYWx1ZXMKLQotVkFMVUUJCU1TLUJBUC1Vc2FnZQkJTm90LUFsbG93ZWQJMAotVkFMVUUJCU1TLUJBUC1Vc2FnZQkJQWxsb3dlZAkJMQotVkFMVUUJCU1TLUJBUC1Vc2FnZQkJUmVxdWlyZWQJMgotCi0jCU1TLUFSQVAtUGFzc3dvcmQtQ2hhbmdlLVJlYXNvbiBWYWx1ZXMKLQotVkFMVUUJTVMtQVJBUC1QVy1DaGFuZ2UtUmVhc29uCUp1c3QtQ2hhbmdlLVBhc3N3b3JkCQkxCi1WQUxVRQlNUy1BUkFQLVBXLUNoYW5nZS1SZWFzb24JRXhwaXJlZC1QYXNzd29yZAkJMgotVkFMVUUJTVMtQVJBUC1QVy1DaGFuZ2UtUmVhc29uCUFkbWluLVJlcXVpcmVzLVBhc3N3b3JkLUNoYW5nZQkzCi1WQUxVRQlNUy1BUkFQLVBXLUNoYW5nZS1SZWFzb24JUGFzc3dvcmQtVG9vLVNob3J0CQk0Ci0KLSMJTVMtQWNjdC1BdXRoLVR5cGUgVmFsdWVzCi0KLVZBTFVFCQlNUy1BY2N0LUF1dGgtVHlwZQlQQVAJCTEKLVZBTFVFCQlNUy1BY2N0LUF1dGgtVHlwZQlDSEFQCQkyCi1WQUxVRQkJTVMtQWNjdC1BdXRoLVR5cGUJTVMtQ0hBUC0xCTMKLVZBTFVFCQlNUy1BY2N0LUF1dGgtVHlwZQlNUy1DSEFQLTIJNAotVkFMVUUJCU1TLUFjY3QtQXV0aC1UeXBlCUVBUAkJNQotCi0jCU1TLUFjY3QtRUFQLVR5cGUgVmFsdWVzCi0KLVZBTFVFCQlNUy1BY2N0LUVBUC1UeXBlCU1ENQkJNAotVkFMVUUJCU1TLUFjY3QtRUFQLVR5cGUJT1RQCQk1Ci1WQUxVRQkJTVMtQWNjdC1FQVAtVHlwZQlHZW5lcmljLVRva2VuLUNhcmQJNgotVkFMVUUJCU1TLUFjY3QtRUFQLVR5cGUJVExTCQkxMwotCmRpZmYgLS1naXQgYS9wcHBkL3BsdWdpbnMvcmFkaXVzL2V0Yy9pc3N1ZSBiL3BwcGQvcGx1Z2lucy9yYWRpdXMvZXRjL2lzc3VlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjU0NDg3Li4wMDAwMDAwCi0tLSBhL3BwcGQvcGx1Z2lucy9yYWRpdXMvZXRjL2lzc3VlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0oXEkpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotXFMgXFIgKFxOKSAocG9ydCBcTCkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KZGlmZiAtLWdpdCBhL3BwcGQvcGx1Z2lucy9yYWRpdXMvZXRjL3BvcnQtaWQtbWFwIGIvcHBwZC9wbHVnaW5zL3JhZGl1cy9ldGMvcG9ydC1pZC1tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwODhhMGIuLjAwMDAwMDAKLS0tIGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9ldGMvcG9ydC1pZC1tYXAKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jCi0jIHBvcnQtaWQtbWFwCi0jCi0jIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHR0eW5hbWUgdG8gcG9ydCBpZCBtYXBwaW5nLiBUaGUgcG9ydCBpZAotIyBpcyByZXBvcnRlZCBhcyBwYXJ0IG9mIGEgUkFESVVTIGF1dGhlbnRpY2F0aW9uIG9yIGFjY291dGluZyByZXF1ZXN0LgotIwotI3R0eW5hbWUgKGFzIHJldHVybmVkIGJ5IHR0eW5hbWUoMykpCXBvcnQtaWQKLS9kZXYvdHR5MQkxCi0vZGV2L3R0eTIJMgotL2Rldi90dHkzCTMKLS9kZXYvdHR5NAk0Ci0vZGV2L3R0eTUJNQotL2Rldi90dHk2CTYKLS9kZXYvdHR5Nwk3Ci0vZGV2L3R0eTgJOAotL2Rldi90dHlTMAk5Ci0vZGV2L3R0eVMxCTEwCi0vZGV2L3R0eVMyCTExCi0vZGV2L3R0eVMzCTEyCi0vZGV2L3R0eVM0CTEzCi0vZGV2L3R0eVM1CTE0Ci0vZGV2L3R0eVM2CTE1Ci0vZGV2L3R0eVM3CTE2Ci0gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9ldGMvcmFkaXVzY2xpZW50LmNvbmYgYi9wcHBkL3BsdWdpbnMvcmFkaXVzL2V0Yy9yYWRpdXNjbGllbnQuY29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRjMThhNS4uMDAwMDAwMAotLS0gYS9wcHBkL3BsdWdpbnMvcmFkaXVzL2V0Yy9yYWRpdXNjbGllbnQuY29uZgorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLSMgR2VuZXJhbCBzZXR0aW5ncwotCi0jIHNwZWNpZnkgd2hpY2ggYXV0aGVudGljYXRpb24gY29tZXMgZmlyc3QgcmVzcGVjdGl2ZWx5IHdoaWNoCi0jIGF1dGhlbnRpY2F0aW9uIGlzIHVzZWQuIHBvc3NpYmxlIHZhbHVlcyBhcmU6ICJyYWRpdXMiIGFuZCAibG9jYWwiLgotIyBpZiB5b3Ugc3BlY2lmeSAicmFkaXVzLGxvY2FsIiB0aGVuIHRoZSBSQURJVVMgc2VydmVyIGlzIGFza2VkCi0jIGZpcnN0IHRoZW4gdGhlIGxvY2FsIG9uZS4gaWYgb25seSBvbmUga2V5d29yZCBpcyBzcGVjaWZpZWQgb25seQotIyB0aGlzIHNlcnZlciBpcyBhc2tlZC4KLWF1dGhfb3JkZXIJcmFkaXVzCi0KLSMgbWF4aW11bSBsb2dpbiB0cmllcyBhIHVzZXIgaGFzIChkZWZhdWx0IDQpCi1sb2dpbl90cmllcwk0Ci0KLSMgdGltZW91dCBmb3IgYWxsIGxvZ2luIHRyaWVzIChkZWZhdWx0IDYwKQotIyBpZiB0aGlzIHRpbWUgaXMgZXhjZWVkZWQgdGhlIHVzZXIgaXMga2lja2VkIG91dCAKLWxvZ2luX3RpbWVvdXQJNjAKLQotIyBuYW1lIG9mIHRoZSBub2xvZ2luIGZpbGUgd2hpY2ggd2hlbiBpdCBleGlzdHMgZGlzYWJsZXMgbG9naW5zLgotIyBpdCBtYXkgYmUgZXh0ZW5kZWQgYnkgdGhlIHR0eW5hbWUgd2hpY2ggd2lsbCByZXN1bHQgaW4KLSMgYSB0ZXJtaW5hbCBzcGVjaWZpYyBsb2NrIChlLmcuIC9ldGMvbm9sb2dpbi50dHlTMiB3aWxsIGRpc2FibGUKLSMgbG9naW5zIG9uIC9kZXYvdHR5UzIpICAgKGRlZmF1bHQgL2V0Yy9ub2xvZ2luKQotbm9sb2dpbiAvZXRjL25vbG9naW4KLQotIyBuYW1lIG9mIHRoZSBpc3N1ZSBmaWxlLiBpdCdzIG9ubHkgZGlzcGxheSB3aGVuIG5vIHVzZXJuYW1lIGlzIHBhc3NlZAotIyBvbiB0aGUgcmFkbG9naW4gY29tbWFuZCBsaW5lICAoZGVmYXVsdCAvZXRjL3JhZGl1c2NsaWVudC9pc3N1ZSkKLWlzc3VlCS91c3IvbG9jYWwvZXRjL3JhZGl1c2NsaWVudC9pc3N1ZQotCi0jIFJBRElVUyBzZXR0aW5ncwotCi0jIFJBRElVUyBzZXJ2ZXIgdG8gdXNlIGZvciBhdXRoZW50aWNhdGlvbiByZXF1ZXN0cy4gdGhpcyBjb25maWcKLSMgaXRlbSBjYW4gYXBwZWFyIG1vcmUgdGhlbiBvbmUgdGltZS4gaWYgbXVsdGlwbGUgc2VydmVycyBhcmUKLSMgZGVmaW5lZCB0aGV5IGFyZSB0cmllZCBpbiBhIHJvdW5kIHJvYmluIGZhc2hpb24gaWYgb25lCi0jIHNlcnZlciBpcyBub3QgYW5zd2VyaW5nLgotIyBvcHRpb25hbGx5IHlvdSBjYW4gc3BlY2lmeSBhIHRoZSBwb3J0IG51bWJlciBvbiB3aGljaCBpcyByZW1vdGUKLSMgUkFESVVTIGxpc3RlbnMgc2VwYXJhdGVkIGJ5IGEgY29sb24gZnJvbSB0aGUgaG9zdG5hbWUuIGlmCi0jIG5vIHBvcnQgaXMgc3BlY2lmaWVkIC9ldGMvc2VydmljZXMgaXMgY29uc3VsdGVkIG9mIHRoZSByYWRpdXMKLSMgc2VydmljZS4gaWYgdGhpcyBmYWlscyBhbHNvIGEgY29tcGlsZWQgaW4gZGVmYXVsdCBpcyB1c2VkLgotYXV0aHNlcnZlciAJbG9jYWxob3N0OjE4MTIKLQotIyBSQURJVVMgc2VydmVyIHRvIHVzZSBmb3IgYWNjb3V0aW5nIHJlcXVlc3RzLiBBbGwgdGhhdCBJCi0jIHNhaWQgZm9yIGF1dGhzZXJ2ZXIgYXBwbGllcywgdG9vLiAKLSMKLWFjY3RzZXJ2ZXIgCWxvY2FsaG9zdDoxODEzCi0KLSMgZmlsZSBob2xkaW5nIHNoYXJlZCBzZWNyZXRzIHVzZWQgZm9yIHRoZSBjb21tdW5pY2F0aW9uCi0jIGJldHdlZW4gdGhlIFJBRElVUyBjbGllbnQgYW5kIHNlcnZlcgotc2VydmVycwkJL3Vzci9sb2NhbC9ldGMvcmFkaXVzY2xpZW50L3NlcnZlcnMKLQotIyBkaWN0aW9uYXJ5IG9mIGFsbG93ZWQgYXR0cmlidXRlcyBhbmQgdmFsdWVzCi0jIGp1c3QgbGlrZSBpbiB0aGUgbm9ybWFsIFJBRElVUyBkaXN0cmlidXRpb25zCi1kaWN0aW9uYXJ5IAkvdXNyL2xvY2FsL2V0Yy9yYWRpdXNjbGllbnQvZGljdGlvbmFyeQotCi0jIHByb2dyYW0gdG8gY2FsbCBmb3IgYSBSQURJVVMgYXV0aGVudGljYXRlZCBsb2dpbiAKLSMgKGRlZmF1bHQgL3Vzci9zYmluL2xvZ2luLnJhZGl1cykKLWxvZ2luX3JhZGl1cwkvdXNyL2xvY2FsL3NiaW4vbG9naW4ucmFkaXVzCi0KLSMgZmlsZSB3aGljaCBob2xkcyBzZXF1ZW5jZSBudW1iZXIgZm9yIGNvbW11bmljYXRpb24gd2l0aCB0aGUKLSMgUkFESVVTIHNlcnZlcgotc2VxZmlsZQkJL3Zhci9ydW4vcmFkaXVzLnNlcQotCi0jIGZpbGUgd2hpY2ggc3BlY2lmaWVzIG1hcHBpbmcgYmV0d2VlbiB0dHluYW1lIGFuZCBOQVMtUG9ydCBhdHRyaWJ1dGUKLW1hcGZpbGUJCS91c3IvbG9jYWwvZXRjL3JhZGl1c2NsaWVudC9wb3J0LWlkLW1hcAotCi0jIGRlZmF1bHQgYXV0aGVudGljYXRpb24gcmVhbG0gdG8gYXBwZW5kIHRvIGFsbCB1c2VybmFtZXMgaWYgbm8KLSMgcmVhbG0gd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyCi0jIHRoZSByYWRpdXNkIGRpcmVjdGx5IGZvcm0gTGl2aW5nc3RvbiBkb2VzbnQgdXNlIGFueSByZWFsbXMsIHNvIGxlYXZlCi0jIGl0IGJsYW5rIHRoZW4KLWRlZmF1bHRfcmVhbG0KLQotIyB0aW1lIHRvIHdhaXQgZm9yIGEgcmVwbHkgZnJvbSB0aGUgUkFESVVTIHNlcnZlcgotcmFkaXVzX3RpbWVvdXQJMTAKLQotIyByZXNlbmQgcmVxdWVzdCB0aGlzIG1hbnkgdGltZXMgYmVmb3JlIHRyeWluZyB0aGUgbmV4dCBzZXJ2ZXIKLXJhZGl1c19yZXRyaWVzCTMKLQotIyBOQVMtSWRlbnRpZmllcgotIwotIyBJZiBzdXBwbGllZCwgdGhpcyBvcHRpb24gd2lsbCBjYXVzZSB0aGUgY2xpZW50IHRvIHNlbmQgdGhlIGdpdmVuIHN0cmluZwotIyBhcyB0aGUgY29udGVudHMgb2YgdGhlIE5BUy1JZGVudGlmaWVyIGF0dHJpYnV0ZSBpbiBSQURJVVMgcmVxdWVzdHMuICBObwotIyBOQVMtSVAtQWRkcmVzcyBhdHRyaWJ1dGUgd2lsbCBiZSBzZW50IGluIHRoaXMgY2FzZS4KLSMKLSMgVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gc2VuZCBhIE5BUy1JUC1BZGRyZXNzIG9wdGlvbiBhbmQgbm90IHNlbmQKLSMgYSBOQVMtSWRlbnRpZmllci4gIFRoZSB2YWx1ZSBvZiB0aGUgTkFTLUlQLUFkZHJlc3Mgb3B0aW9uIGlzIGNob3NlbgotIyBieSByZXNvbHZpbmcgdGhlIHN5c3RlbSBob3N0bmFtZS4KLQotIyBuYXNfaWRlbnRpZmllciBNeVVuaXF1ZU5BU05hbWUKLQotIyBMT0NBTCBzZXR0aW5ncwotCi0jIHByb2dyYW0gdG8gZXhlY3V0ZSBmb3IgbG9jYWwgbG9naW4KLSMgaXQgbXVzdCBzdXBwb3J0IHRoZSAtZiBmbGFnIGZvciBwcmVhdXRoZW50aWNhdGVkIGxvZ2luCi1sb2dpbl9sb2NhbAkvYmluL2xvZ2luCmRpZmYgLS1naXQgYS9wcHBkL3BsdWdpbnMvcmFkaXVzL2V0Yy9yYWRpdXNjbGllbnQuY29uZi5pbiBiL3BwcGQvcGx1Z2lucy9yYWRpdXMvZXRjL3JhZGl1c2NsaWVudC5jb25mLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWUyOTJjLi4wMDAwMDAwCi0tLSBhL3BwcGQvcGx1Z2lucy9yYWRpdXMvZXRjL3JhZGl1c2NsaWVudC5jb25mLmluCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotIyBHZW5lcmFsIHNldHRpbmdzCi0KLSMgc3BlY2lmeSB3aGljaCBhdXRoZW50aWNhdGlvbiBjb21lcyBmaXJzdCByZXNwZWN0aXZlbHkgd2hpY2gKLSMgYXV0aGVudGljYXRpb24gaXMgdXNlZC4gcG9zc2libGUgdmFsdWVzIGFyZTogInJhZGl1cyIgYW5kICJsb2NhbCIuCi0jIGlmIHlvdSBzcGVjaWZ5ICJyYWRpdXMsbG9jYWwiIHRoZW4gdGhlIFJBRElVUyBzZXJ2ZXIgaXMgYXNrZWQKLSMgZmlyc3QgdGhlbiB0aGUgbG9jYWwgb25lLiBpZiBvbmx5IG9uZSBrZXl3b3JkIGlzIHNwZWNpZmllZCBvbmx5Ci0jIHRoaXMgc2VydmVyIGlzIGFza2VkLgotYXV0aF9vcmRlcglyYWRpdXMKLQotIyBtYXhpbXVtIGxvZ2luIHRyaWVzIGEgdXNlciBoYXMgKGRlZmF1bHQgNCkKLWxvZ2luX3RyaWVzCTQKLQotIyB0aW1lb3V0IGZvciBhbGwgbG9naW4gdHJpZXMgKGRlZmF1bHQgNjApCi0jIGlmIHRoaXMgdGltZSBpcyBleGNlZWRlZCB0aGUgdXNlciBpcyBraWNrZWQgb3V0IAotbG9naW5fdGltZW91dAk2MAotCi0jIG5hbWUgb2YgdGhlIG5vbG9naW4gZmlsZSB3aGljaCB3aGVuIGl0IGV4aXN0cyBkaXNhYmxlcyBsb2dpbnMuCi0jIGl0IG1heSBiZSBleHRlbmRlZCBieSB0aGUgdHR5bmFtZSB3aGljaCB3aWxsIHJlc3VsdCBpbgotIyBhIHRlcm1pbmFsIHNwZWNpZmljIGxvY2sgKGUuZy4gL2V0Yy9ub2xvZ2luLnR0eVMyIHdpbGwgZGlzYWJsZQotIyBsb2dpbnMgb24gL2Rldi90dHlTMikgICAoZGVmYXVsdCAvZXRjL25vbG9naW4pCi1ub2xvZ2luIC9ldGMvbm9sb2dpbgotCi0jIG5hbWUgb2YgdGhlIGlzc3VlIGZpbGUuIGl0J3Mgb25seSBkaXNwbGF5IHdoZW4gbm8gdXNlcm5hbWUgaXMgcGFzc2VkCi0jIG9uIHRoZSByYWRsb2dpbiBjb21tYW5kIGxpbmUgIChkZWZhdWx0IC9ldGMvcmFkaXVzY2xpZW50L2lzc3VlKQotaXNzdWUJQHBrZ3N5c2NvbmZkaXJAL2lzc3VlCi0KLSMgUkFESVVTIHNldHRpbmdzCi0KLSMgUkFESVVTIHNlcnZlciB0byB1c2UgZm9yIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3RzLiB0aGlzIGNvbmZpZwotIyBpdGVtIGNhbiBhcHBlYXIgbW9yZSB0aGVuIG9uZSB0aW1lLiBpZiBtdWx0aXBsZSBzZXJ2ZXJzIGFyZQotIyBkZWZpbmVkIHRoZXkgYXJlIHRyaWVkIGluIGEgcm91bmQgcm9iaW4gZmFzaGlvbiBpZiBvbmUKLSMgc2VydmVyIGlzIG5vdCBhbnN3ZXJpbmcuCi0jIG9wdGlvbmFsbHkgeW91IGNhbiBzcGVjaWZ5IGEgdGhlIHBvcnQgbnVtYmVyIG9uIHdoaWNoIGlzIHJlbW90ZQotIyBSQURJVVMgbGlzdGVucyBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBmcm9tIHRoZSBob3N0bmFtZS4gaWYKLSMgbm8gcG9ydCBpcyBzcGVjaWZpZWQgL2V0Yy9zZXJ2aWNlcyBpcyBjb25zdWx0ZWQgb2YgdGhlIHJhZGl1cwotIyBzZXJ2aWNlLiBpZiB0aGlzIGZhaWxzIGFsc28gYSBjb21waWxlZCBpbiBkZWZhdWx0IGlzIHVzZWQuCi1hdXRoc2VydmVyIAlsb2NhbGhvc3Q6MTgxMgotCi0jIFJBRElVUyBzZXJ2ZXIgdG8gdXNlIGZvciBhY2NvdXRpbmcgcmVxdWVzdHMuIEFsbCB0aGF0IEkKLSMgc2FpZCBmb3IgYXV0aHNlcnZlciBhcHBsaWVzLCB0b28uIAotIwotYWNjdHNlcnZlciAJbG9jYWxob3N0OjE4MTMKLQotIyBmaWxlIGhvbGRpbmcgc2hhcmVkIHNlY3JldHMgdXNlZCBmb3IgdGhlIGNvbW11bmljYXRpb24KLSMgYmV0d2VlbiB0aGUgUkFESVVTIGNsaWVudCBhbmQgc2VydmVyCi1zZXJ2ZXJzCQlAcGtnc3lzY29uZmRpckAvc2VydmVycwotCi0jIGRpY3Rpb25hcnkgb2YgYWxsb3dlZCBhdHRyaWJ1dGVzIGFuZCB2YWx1ZXMKLSMganVzdCBsaWtlIGluIHRoZSBub3JtYWwgUkFESVVTIGRpc3RyaWJ1dGlvbnMKLWRpY3Rpb25hcnkgCUBwa2dzeXNjb25mZGlyQC9kaWN0aW9uYXJ5Ci0KLSMgcHJvZ3JhbSB0byBjYWxsIGZvciBhIFJBRElVUyBhdXRoZW50aWNhdGVkIGxvZ2luIAotIyAoZGVmYXVsdCAvdXNyL3NiaW4vbG9naW4ucmFkaXVzKQotbG9naW5fcmFkaXVzCUBzYmluZGlyQC9sb2dpbi5yYWRpdXMKLQotIyBmaWxlIHdoaWNoIGhvbGRzIHNlcXVlbmNlIG51bWJlciBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZQotIyBSQURJVVMgc2VydmVyCi1zZXFmaWxlCQkvdmFyL3J1bi9yYWRpdXMuc2VxCi0KLSMgZmlsZSB3aGljaCBzcGVjaWZpZXMgbWFwcGluZyBiZXR3ZWVuIHR0eW5hbWUgYW5kIE5BUy1Qb3J0IGF0dHJpYnV0ZQotbWFwZmlsZQkJQHBrZ3N5c2NvbmZkaXJAL3BvcnQtaWQtbWFwCi0KLSMgZGVmYXVsdCBhdXRoZW50aWNhdGlvbiByZWFsbSB0byBhcHBlbmQgdG8gYWxsIHVzZXJuYW1lcyBpZiBubwotIyByZWFsbSB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIKLSMgdGhlIHJhZGl1c2QgZGlyZWN0bHkgZm9ybSBMaXZpbmdzdG9uIGRvZXNudCB1c2UgYW55IHJlYWxtcywgc28gbGVhdmUKLSMgaXQgYmxhbmsgdGhlbgotZGVmYXVsdF9yZWFsbQotCi0jIHRpbWUgdG8gd2FpdCBmb3IgYSByZXBseSBmcm9tIHRoZSBSQURJVVMgc2VydmVyCi1yYWRpdXNfdGltZW91dAkxMAotCi0jIHJlc2VuZCByZXF1ZXN0IHRoaXMgbWFueSB0aW1lcyBiZWZvcmUgdHJ5aW5nIHRoZSBuZXh0IHNlcnZlcgotcmFkaXVzX3JldHJpZXMJMwotCi0jIE5BUy1JZGVudGlmaWVyCi0jCi0jIElmIHN1cHBsaWVkLCB0aGlzIG9wdGlvbiB3aWxsIGNhdXNlIHRoZSBjbGllbnQgdG8gc2VuZCB0aGUgZ2l2ZW4gc3RyaW5nCi0jIGFzIHRoZSBjb250ZW50cyBvZiB0aGUgTkFTLUlkZW50aWZpZXIgYXR0cmlidXRlIGluIFJBRElVUyByZXF1ZXN0cy4gIE5vCi0jIE5BUy1JUC1BZGRyZXNzIGF0dHJpYnV0ZSB3aWxsIGJlIHNlbnQgaW4gdGhpcyBjYXNlLgotIwotIyBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBzZW5kIGEgTkFTLUlQLUFkZHJlc3Mgb3B0aW9uIGFuZCBub3Qgc2VuZAotIyBhIE5BUy1JZGVudGlmaWVyLiAgVGhlIHZhbHVlIG9mIHRoZSBOQVMtSVAtQWRkcmVzcyBvcHRpb24gaXMgY2hvc2VuCi0jIGJ5IHJlc29sdmluZyB0aGUgc3lzdGVtIGhvc3RuYW1lLgotCi0jIG5hc19pZGVudGlmaWVyIE15VW5pcXVlTkFTTmFtZQotCi0jIExPQ0FMIHNldHRpbmdzCi0KLSMgcHJvZ3JhbSB0byBleGVjdXRlIGZvciBsb2NhbCBsb2dpbgotIyBpdCBtdXN0IHN1cHBvcnQgdGhlIC1mIGZsYWcgZm9yIHByZWF1dGhlbnRpY2F0ZWQgbG9naW4KLWxvZ2luX2xvY2FsCS9iaW4vbG9naW4KZGlmZiAtLWdpdCBhL3BwcGQvcGx1Z2lucy9yYWRpdXMvZXRjL3JlYWxtcyBiL3BwcGQvcGx1Z2lucy9yYWRpdXMvZXRjL3JlYWxtcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ0MDM2NC4uMDAwMDAwMAotLS0gYS9wcHBkL3BsdWdpbnMvcmFkaXVzL2V0Yy9yZWFsbXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIC9ldGMvcmFkaXVzY2xpZW50L3JlYWxtcwotIwotIyBIYW5kbGUgcmVhbG0gQG5ldHNlcnZlcnMuY28udWsgb24gYW4gaW50ZXJuYWwgUkFESVVTIHNlcnZlcgotIyAobm90ZSB0aGUgc2VydmVyIG11c3QgYmUgdG9sZCB0byBzdHJpcCB0aGUgcmVhbG0pCi0KLSNhdXRoc2VydmVyIG5ldHNlcnZlcnMuY28udWsgMTkyLjE2OC4xLjE6MTgxMgotI2FjY3RzZXJ2ZXIgbmV0c2VydmVycy5jby51ayAxOTIuMTY4LjEuMToxODEzCi0KLSMgdXNlcnMgaW4gcmVhbG0gQGV4YW1wbGUuY29tIGFyZSBoYW5kbGVkIGJ5IHNlcGFyYXRlIHNlcnZlcnMKLQotI2F1dGhzZXJ2ZXIgZXhhbXBsZS5jb20gMTAuMC4wLjE6MTgxMgotI2FjY3RzZXJ2ZXIgZXhhbXBsZS5jb20gMTAuMC4wLjI6MTgxMwotCi0jIHRoZSBERUZBVUxUIHJlYWxtIG1hdGNoZXMgdXNlcnMgdGhhdCBkbyBub3Qgc3VwcGx5IGEgcmVhbG0KLQotI2F1dGhzZXJ2ZXIgREVGQVVMVCAxOTIuMTY4LjEuMToxODEyCi0jYWNjdHNlcnZlciBERUZBVUxUIDE5Mi4xNjguMS4xOjE4MTMKLQotIyBBbnkgcmVhbG1zIHRoYXQgZG8gbm90IG1hdGNoIGluIHRoZSByZWFsbXMgZmlsZSBhdXRvbWF0aWNhbGx5IGZhbGwgCi0jIHRocm91Z2ggdG8gdGhlIHN0YW5kYXJkIHJhZGl1cyBwbHVnaW4gd2hpY2ggdXNlcyB0aGUgc2VydmVycyBpbiB0aGUgCi0jIHJhZGl1c2NsaWVudC5jb25mIGZpbGUuICBOb3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgdGhhbiB0aGUKLSMgREVGQVVMVCByZWFsbSBtYXRjaCwgYWJvdmUuCmRpZmYgLS1naXQgYS9wcHBkL3BsdWdpbnMvcmFkaXVzL2V0Yy9zZXJ2ZXJzIGIvcHBwZC9wbHVnaW5zL3JhZGl1cy9ldGMvc2VydmVycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2MWJmOS4uMDAwMDAwMAotLS0gYS9wcHBkL3BsdWdpbnMvcmFkaXVzL2V0Yy9zZXJ2ZXJzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jU2VydmVyIE5hbWUgb3IgQ2xpZW50L1NlcnZlciBwYWlyCQlLZXkKLSMtLS0tLS0tLS0tLS0tLS0tCQkJCS0tLS0tLS0tLS0tLS0tLQotI3BvcnRtYXN0ZXIuZWxlbWVudGFsLm5ldAkJCWhhcmRseWFzZWNyZXQKLSNwb3J0bWFzdGVyMi5lbGVtZW50YWwubmV0CSAgICAJCWRvbnR0ZWxsYW55b25lCmRpZmYgLS1naXQgYS9wcHBkL3BsdWdpbnMvcmFkaXVzL2luY2x1ZGVzLmggYi9wcHBkL3BsdWdpbnMvcmFkaXVzL2luY2x1ZGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGQ5YjcuLjAwMDAwMDAKLS0tIGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9pbmNsdWRlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqICRJZDogaW5jbHVkZXMuaCx2IDEuMSAyMDA0LzExLzE0IDA3OjI2OjI2IHBhdWx1cyBFeHAgJAotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NyBMYXJzIEZlbm5lYmVyZwotICoKLSAqIENvcHlyaWdodCAxOTkyIExpdmluZ3N0b24gRW50ZXJwcmlzZXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgMTk5MiwxOTkzLCAxOTk0LDE5OTUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4KLSAqIGFuZCBNZXJpdCBOZXR3b3JrLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLSAqCi0gKiBTZWUgdGhlIGZpbGUgQ09QWVJJR0hUIGZvciB0aGUgcmVzcGVjdGl2ZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4KLSAqIElmIHRoZSBmaWxlIGlzIG1pc3NpbmcgY29udGFjdCBtZSBhdCBsZkBlbGVtZW50YWwubmV0Ci0gKiBhbmQgSSdsbCBzZW5kIHlvdSBhIGNvcHkuCi0gKgotICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaW5jbHVkZSA8c3lzbG9nLmg+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2luY2x1ZGUgPGxpbWl0cy5oPgotCi0jaWZuZGVmIFBBVEhfTUFYCi0jZGVmaW5lIFBBVEhfTUFYICAgICAgICAxMDI0Ci0jZW5kaWYKLQotI2lmbmRlZiBVQ0hBUl9NQVgKLSMgZGVmaW5lIFVDSEFSX01BWCAgICAgICAyNTUKLSNlbmRpZgotCi0jaW5jbHVkZSA8cHdkLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLQotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2luY2x1ZGUgIm1hZ2ljLmgiCi0KLS8qIHJsaWIvbG9jay5jICovCi1pbnQgZG9fbG9ja19leGNsdXNpdmUoaW50KTsKLWludCBkb191bmxvY2soaW50KTsKZGlmZiAtLWdpdCBhL3BwcGQvcGx1Z2lucy9yYWRpdXMvaXBfdXRpbC5jIGIvcHBwZC9wbHVnaW5zL3JhZGl1cy9pcF91dGlsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNmE3NmUuLjAwMDAwMDAKLS0tIGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9pcF91dGlsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoKLSAqICRJZDogaXBfdXRpbC5jLHYgMS4xIDIwMDQvMTEvMTQgMDc6MjY6MjYgcGF1bHVzIEV4cCAkCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYsMTk5NyBMYXJzIEZlbm5lYmVyZwotICoKLSAqIENvcHlyaWdodCAxOTkyIExpdmluZ3N0b24gRW50ZXJwcmlzZXMsIEluYy4KLSAqCi0gKiBDb3B5cmlnaHQgMTk5MiwxOTkzLCAxOTk0LDE5OTUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4KLSAqIGFuZCBNZXJpdCBOZXR3b3JrLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLSAqCi0gKiBTZWUgdGhlIGZpbGUgQ09QWVJJR0hUIGZvciB0aGUgcmVzcGVjdGl2ZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4KLSAqIElmIHRoZSBmaWxlIGlzIG1pc3NpbmcgY29udGFjdCBtZSBhdCBsZkBlbGVtZW50YWwubmV0Ci0gKiBhbmQgSSdsbCBzZW5kIHlvdSBhIGNvcHkuCi0gKgotICovCi0KLSNpbmNsdWRlIDxpbmNsdWRlcy5oPgotI2luY2x1ZGUgPHJhZGl1c2NsaWVudC5oPgotCi0vKgotICogRnVuY3Rpb246IHJjX2dldF9pcGFkZHIKLSAqCi0gKiBQdXJwb3NlOiByZXR1cm4gYW4gSVAgYWRkcmVzcyBpbiBob3N0IGxvbmcgbm90YXRpb24gZnJvbSBhIGhvc3QKLSAqICAgICAgICAgIG5hbWUgb3IgYWRkcmVzcyBpbiBkb3Qgbm90YXRpb24uCi0gKgotICogUmV0dXJuczogMCBvbiBmYWlsdXJlCi0gKi8KLQotVUlOVDQgcmNfZ2V0X2lwYWRkciAoY2hhciAqaG9zdCkKLXsKLQlzdHJ1Y3QgaG9zdGVudCAqaHA7Ci0KLQlpZiAocmNfZ29vZF9pcGFkZHIgKGhvc3QpID09IDApCi0JewotCQlyZXR1cm4gbnRvaGwoaW5ldF9hZGRyIChob3N0KSk7Ci0JfQotCWVsc2UgaWYgKChocCA9IGdldGhvc3RieW5hbWUgKGhvc3QpKSA9PSAoc3RydWN0IGhvc3RlbnQgKikgTlVMTCkKLQl7Ci0JCWVycm9yKCJyY19nZXRfaXBhZGRyOiBjb3VsZG4ndCByZXNvbHZlIGhvc3RuYW1lOiAlcyIsIGhvc3QpOwotCQlyZXR1cm4gKChVSU5UNCkgMCk7Ci0JfQotCXJldHVybiBudG9obCgoKihVSU5UNCAqKSBocC0+aF9hZGRyKSk7Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbjogcmNfZ29vZF9pcGFkZHIKLSAqCi0gKiBQdXJwb3NlOiBjaGVjayBmb3IgdmFsaWQgSVAgYWRkcmVzcyBpbiBzdGFuZGFyZCBkb3Qgbm90YXRpb24uCi0gKgotICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtMSB3aGVuIGZhaWx1cmUKLSAqCi0gKi8KLQotaW50IHJjX2dvb2RfaXBhZGRyIChjaGFyICphZGRyKQotewotCWludCAgICAgICAgICAgICBkb3RfY291bnQ7Ci0JaW50ICAgICAgICAgICAgIGRpZ2l0X2NvdW50OwotCi0JaWYgKGFkZHIgPT0gTlVMTCkKLQkJcmV0dXJuICgtMSk7Ci0KLQlkb3RfY291bnQgPSAwOwotCWRpZ2l0X2NvdW50ID0gMDsKLQl3aGlsZSAoKmFkZHIgIT0gJ1wwJyAmJiAqYWRkciAhPSAnICcpCi0JewotCQlpZiAoKmFkZHIgPT0gJy4nKQotCQl7Ci0JCQlkb3RfY291bnQrKzsKLQkJCWRpZ2l0X2NvdW50ID0gMDsKLQkJfQotCQllbHNlIGlmICghaXNkaWdpdCAoKmFkZHIpKQotCQl7Ci0JCQlkb3RfY291bnQgPSA1OwotCQl9Ci0JCWVsc2UKLQkJewotCQkJZGlnaXRfY291bnQrKzsKLQkJCWlmIChkaWdpdF9jb3VudCA+IDMpCi0JCQl7Ci0JCQkJZG90X2NvdW50ID0gNTsKLQkJCX0KLQkJfQotCQlhZGRyKys7Ci0JfQotCWlmIChkb3RfY291bnQgIT0gMykKLQl7Ci0JCXJldHVybiAoLTEpOwotCX0KLQllbHNlCi0JewotCQlyZXR1cm4gKDApOwotCX0KLX0KLQotLyoKLSAqIEZ1bmN0aW9uOiByY19pcF9ob3N0bmFtZQotICoKLSAqIFB1cnBvc2U6IFJldHVybiBhIHByaW50YWJsZSBob3N0IG5hbWUgKG9yIElQIGFkZHJlc3MgaW4gZG90IG5vdGF0aW9uKQotICoJICAgIGZvciB0aGUgc3VwcGxpZWQgSVAgYWRkcmVzcy4KLSAqCi0gKi8KLQotY29uc3QgY2hhciAqcmNfaXBfaG9zdG5hbWUgKFVJTlQ0IGhfaXBhZGRyKQotewotCXN0cnVjdCBob3N0ZW50ICAqaHA7Ci0JVUlOVDQgICAgICAgICAgIG5faXBhZGRyID0gaHRvbmwgKGhfaXBhZGRyKTsKLQotCWlmICgoaHAgPSBnZXRob3N0YnlhZGRyICgoY2hhciAqKSAmbl9pcGFkZHIsIHNpemVvZiAoc3RydWN0IGluX2FkZHIpLAotCQkJICAgIEFGX0lORVQpKSA9PSBOVUxMKSB7Ci0JCWVycm9yKCJyY19pcF9ob3N0bmFtZTogY291bGRuJ3QgbG9vayB1cCBob3N0IGJ5IGFkZHI6ICUwOGxYIiwgaF9pcGFkZHIpOwotCX0KLQotCXJldHVybiAoKGhwPT1OVUxMKT8idW5rbm93biI6aHAtPmhfbmFtZSk7Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbjogcmNfb3duX2lwYWRkcmVzcwotICoKLSAqIFB1cnBvc2U6IGdldCB0aGUgSVAgYWRkcmVzcyBvZiB0aGlzIGhvc3QgaW4gaG9zdCBvcmRlcgotICoKLSAqIFJldHVybnM6IElQIGFkZHJlc3Mgb24gc3VjY2VzcywgMCBvbiBmYWlsdXJlCi0gKgotICovCi0KLVVJTlQ0IHJjX293bl9pcGFkZHJlc3Modm9pZCkKLXsKLQlzdGF0aWMgVUlOVDQgdGhpc19ob3N0X2lwYWRkciA9IDA7Ci0KLQlpZiAoIXRoaXNfaG9zdF9pcGFkZHIpIHsKLQkJaWYgKCh0aGlzX2hvc3RfaXBhZGRyID0gcmNfZ2V0X2lwYWRkciAoaG9zdG5hbWUpKSA9PSAwKSB7Ci0JCQllcnJvcigicmNfb3duX2lwYWRkcmVzczogY291bGRuJ3QgZ2V0IG93biBJUCBhZGRyZXNzIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXJldHVybiB0aGlzX2hvc3RfaXBhZGRyOwotfQotCi0vKgotICogRnVuY3Rpb246IHJjX293bl9iaW5kX2lwYWRkcmVzcwotICoKLSAqIFB1cnBvc2U6IGdldCB0aGUgSVAgYWRkcmVzcyB0byBiZSB1c2VkIGFzIGEgc291cmNlIGFkZHJlc3MKLSAqICAgICAgICAgIGZvciBzZW5kaW5nIHJlcXVlc3RzIGluIGhvc3Qgb3JkZXIKLSAqCi0gKiBSZXR1cm5zOiBJUCBhZGRyZXNzCi0gKgotICovCi0KLVVJTlQ0IHJjX293bl9iaW5kX2lwYWRkcmVzcyh2b2lkKQotewotCWNoYXIgKmJpbmRhZGRyOwotCVVJTlQ0IHJ2YWwgPSAwOwotCi0JaWYgKChiaW5kYWRkciA9IHJjX2NvbmZfc3RyKCJiaW5kYWRkciIpKSA9PSBOVUxMIHx8Ci0JICAgIHN0cmNtcChyY19jb25mX3N0cigiYmluZGFkZHIiKSwgIioiKSA9PSAwKSB7Ci0JCXJ2YWwgPSBJTkFERFJfQU5ZOwotCX0gZWxzZSB7Ci0JCWlmICgocnZhbCA9IHJjX2dldF9pcGFkZHIoYmluZGFkZHIpKSA9PSAwKSB7Ci0JCQllcnJvcigicmNfb3duX2JpbmRfaXBhZGRyZXNzOiBjb3VsZG4ndCBnZXQgSVAgYWRkcmVzcyBmcm9tIGJpbmRhZGRyIik7Ci0JCQlydmFsID0gSU5BRERSX0FOWTsKLQkJfQotCX0KLQotCXJldHVybiBydmFsOwotfQpkaWZmIC0tZ2l0IGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9sb2NrLmMgYi9wcHBkL3BsdWdpbnMvcmFkaXVzL2xvY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgyZTk3Yy4uMDAwMDAwMAotLS0gYS9wcHBkL3BsdWdpbnMvcmFkaXVzL2xvY2suYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiAkSWQ6IGxvY2suYyx2IDEuMSAyMDA0LzExLzE0IDA3OjI2OjI2IHBhdWx1cyBFeHAgJAotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NyBMYXJzIEZlbm5lYmVyZwotICoKLSAqIFNlZSB0aGUgZmlsZSBDT1BZUklHSFQgZm9yIHRoZSByZXNwZWN0aXZlIHRlcm1zIGFuZCBjb25kaXRpb25zLgotICogSWYgdGhlIGZpbGUgaXMgbWlzc2luZyBjb250YWN0IG1lIGF0IGxmQGVsZW1lbnRhbC5uZXQKLSAqIGFuZCBJJ2xsIHNlbmQgeW91IGEgY29weS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImluY2x1ZGVzLmgiCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLQotaW50IGRvX2xvY2tfZXhjbHVzaXZlKGludCBmZCkKLXsKLQlzdHJ1Y3QgZmxvY2sgZmw7Ci0JaW50IHJlczsKLQotCW1lbXNldCgodm9pZCAqKSZmbCwgMCwgc2l6ZW9mKGZsKSk7Ci0KLQlmbC5sX3R5cGUgPSBGX1dSTENLOwotCWZsLmxfd2hlbmNlID0gZmwubF9zdGFydCA9IDA7Ci0JZmwubF9sZW4gPSAwOyAvKiAwIG1lYW5zICJ0byBlbmQgb2YgZmlsZSIgKi8KLQotCXJlcyA9IGZjbnRsKGZkLCBGX1NFVExLLCAmZmwpOwotCi0JaWYgKChyZXMgPT0gLTEpICYmIChlcnJubyA9PSBFQUdBSU4pKQotCQllcnJubyA9IEVXT1VMREJMT0NLOwotCi0JcmV0dXJuIHJlczsKLX0KLQotaW50IGRvX3VubG9jayhpbnQgZmQpCi17Ci0Jc3RydWN0IGZsb2NrIGZsOwotCi0JbWVtc2V0KCh2b2lkICopJmZsLCAwLCBzaXplb2YoZmwpKTsKLQotCWZsLmxfdHlwZSA9IEZfVU5MQ0s7Ci0JZmwubF93aGVuY2UgPSBmbC5sX3N0YXJ0ID0gMDsKLQlmbC5sX2xlbiA9IDA7IC8qIDAgbWVhbnMgInRvIGVuZCBvZiBmaWxlIiAqLwotCi0JcmV0dXJuIGZjbnRsKGZkLCBGX1NFVExLLCAmZmwpOwotfQpkaWZmIC0tZ2l0IGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9tZDUuYyBiL3BwcGQvcGx1Z2lucy9yYWRpdXMvbWQ1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZjAzYWEuLjAwMDAwMDAKLS0tIGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9tZDUuYworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS8qCi0gKiAkSWQ6IG1kNS5jLHYgMS4xIDIwMDQvMTEvMTQgMDc6MjY6MjYgcGF1bHVzIEV4cCAkCi0gKi8KLSNpbmNsdWRlICJtZDUuaCIKLQotdm9pZCByY19tZDVfY2FsYyAodW5zaWduZWQgY2hhciAqb3V0cHV0LCB1bnNpZ25lZCBjaGFyICppbnB1dCwgdW5zaWduZWQgaW50IGlubGVuKQotewotCU1ENV9DVFggICAgICAgICBjb250ZXh0OwotCi0JTUQ1X0luaXQgKCZjb250ZXh0KTsKLQlNRDVfVXBkYXRlICgmY29udGV4dCwgaW5wdXQsIGlubGVuKTsKLQlNRDVfRmluYWwgKG91dHB1dCwgJmNvbnRleHQpOwotfQpkaWZmIC0tZ2l0IGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9vcHRpb25zLmggYi9wcHBkL3BsdWdpbnMvcmFkaXVzL29wdGlvbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRhZDk4Ni4uMDAwMDAwMAotLS0gYS9wcHBkL3BsdWdpbnMvcmFkaXVzL29wdGlvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiAkSWQ6IG9wdGlvbnMuaCx2IDEuMSAyMDA0LzExLzE0IDA3OjI2OjI2IHBhdWx1cyBFeHAgJAotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NiBMYXJzIEZlbm5lYmVyZwotICoKLSAqIFNlZSB0aGUgZmlsZSBDT1BZUklHSFQgZm9yIHRoZSByZXNwZWN0aXZlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAKLSAqIElmIHRoZSBmaWxlIGlzIG1pc3NpbmcgY29udGFjdCBtZSBhdCBsZkBlbGVtZW50YWwubmV0IAotICogYW5kIEknbGwgc2VuZCB5b3UgYSBjb3B5LgotICoKLSAqLwotCi0jZGVmaW5lIE9QVElPTl9MRU4JNjQKLQotLyogaWRzIGZvciBkaWZmZXJlbnQgb3B0aW9uIHR5cGVzICovCi0jZGVmaW5lIE9UX1NUUgkJKDE8PDApCSAgLyogc3RyaW5nICovCi0jZGVmaW5lIE9UX0lOVAkJKDE8PDEpCSAgLyogaW50ZWdlciAqLwotI2RlZmluZSBPVF9TUlYJCSgxPDwyKQkgIC8qIHNlcnZlciBsaXN0ICovCi0jZGVmaW5lIE9UX0FVTwkJKDE8PDMpICAgIC8qIGF1dGhlbnRpY2F0aW9uIG9yZGVyICovCi0KLSNkZWZpbmUgT1RfQU5ZCQkoKHVuc2lnbmVkIGludCl+MCkgLyogdXNlZCBpbnRlcm5hbGx5ICovCi0KLS8qIHN0YXR1cyB0eXBlcyAqLwotI2RlZmluZSBTVF9VTkRFRgkoMTw8MCkJICAvKiBvcHRpb24gaXMgdW5kZWZpbmVkICovCi0KLXR5cGVkZWYgc3RydWN0IF9vcHRpb24gewotCWNoYXIgbmFtZVtPUFRJT05fTEVOXTsJICAvKiBuYW1lIG9mIHRoZSBvcHRpb24gKi8KLQlpbnQgdHlwZSwgc3RhdHVzOwkgIC8qIHR5cGUgYW5kIHN0YXR1cyAgICAqLwotCXZvaWQgKnZhbDsJCSAgLyogcG9pbnRlciB0byBvcHRpb24gdmFsdWUgKi8KLX0gT1BUSU9OOwotCi1zdGF0aWMgU0VSVkVSIGFjY3RzZXJ2ZXIgPSB7MH07Ci1zdGF0aWMgU0VSVkVSIGF1dGhzZXJ2ZXIgPSB7MH07Ci0KLWludCBkZWZhdWx0X3RyaWVzID0gNDsKLWludCBkZWZhdWx0X3RpbWVvdXQgPSA2MDsKLQotc3RhdGljIE9QVElPTiBjb25maWdfb3B0aW9uc1tdID0gewotLyogaW50ZXJuYWxseSB1c2VkIG9wdGlvbnMgKi8KLXsiY29uZmlnX2ZpbGUiLAkJT1RfU1RSLCBTVF9VTkRFRiwgTlVMTH0sCi0vKiBHZW5lcmFsIG9wdGlvbnMgKi8KLXsiYXV0aF9vcmRlciIsCSAJT1RfQVVPLCBTVF9VTkRFRiwgTlVMTH0sCi17ImxvZ2luX3RyaWVzIiwJIAlPVF9JTlQsIFNUX1VOREVGLCAmZGVmYXVsdF90cmllc30sCi17ImxvZ2luX3RpbWVvdXQiLAlPVF9JTlQsIFNUX1VOREVGLCAmZGVmYXVsdF90aW1lb3V0fSwKLXsibm9sb2dpbiIsCQlPVF9TVFIsIFNUX1VOREVGLCAiL2V0Yy9ub2xvZ2luIn0sCi17Imlzc3VlIiwJCU9UX1NUUiwgU1RfVU5ERUYsICIvZXRjL3JhZGl1c2NsaWVudC9pc3N1ZSJ9LAotLyogUkFESVVTIHNwZWNpZmljIG9wdGlvbnMgKi8KLXsiYXV0aHNlcnZlciIsCQlPVF9TUlYsIFNUX1VOREVGLCAmYXV0aHNlcnZlcn0sCi17ImFjY3RzZXJ2ZXIiLAkJT1RfU1JWLCBTVF9VTkRFRiwgJmFjY3RzZXJ2ZXJ9LAoteyJzZXJ2ZXJzIiwJCU9UX1NUUiwgU1RfVU5ERUYsIE5VTEx9LAoteyJkaWN0aW9uYXJ5IiwJCU9UX1NUUiwgU1RfVU5ERUYsIE5VTEx9LAoteyJsb2dpbl9yYWRpdXMiLAlPVF9TVFIsIFNUX1VOREVGLCAiL3Vzci9zYmluL2xvZ2luLnJhZGl1cyJ9LAoteyJzZXFmaWxlIiwJCU9UX1NUUiwgU1RfVU5ERUYsIE5VTEx9LAoteyJtYXBmaWxlIiwJCU9UX1NUUiwgU1RfVU5ERUYsIE5VTEx9LAoteyJkZWZhdWx0X3JlYWxtIiwJT1RfU1RSLCBTVF9VTkRFRiwgTlVMTH0sCi17InJhZGl1c190aW1lb3V0IiwJT1RfSU5ULCBTVF9VTkRFRiwgTlVMTH0sCi17InJhZGl1c19yZXRyaWVzIiwJT1RfSU5ULAlTVF9VTkRFRiwgTlVMTH0sCi17Im5hc19pZGVudGlmaWVyIiwgICAgICBPVF9TVFIsIFNUX1VOREVGLCAiIn0sCi17ImJpbmRhZGRyIiwgICAgICAgICAgICBPVF9TVFIsIFNUX1VOREVGLCBOVUxMfSwKLS8qIGxvY2FsIG9wdGlvbnMgKi8KLXsibG9naW5fbG9jYWwiLAkJT1RfU1RSLCBTVF9VTkRFRiwgTlVMTH0sCi19OwotCi1zdGF0aWMgaW50IG51bV9vcHRpb25zID0gKChzaXplb2YoY29uZmlnX29wdGlvbnMpKS8oc2l6ZW9mKGNvbmZpZ19vcHRpb25zWzBdKSkpOwpkaWZmIC0tZ2l0IGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9wYXRobmFtZXMuaCBiL3BwcGQvcGx1Z2lucy9yYWRpdXMvcGF0aG5hbWVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYTRjNjAuLjAwMDAwMDAKLS0tIGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9wYXRobmFtZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiAkSWQ6IHBhdGhuYW1lcy5oLHYgMS4xIDIwMDQvMTEvMTQgMDc6MjY6MjYgcGF1bHVzIEV4cCAkCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYgTGFycyBGZW5uZWJlcmcKLSAqCi0gKiBDb3B5cmlnaHQgMTk5MiBMaXZpbmdzdG9uIEVudGVycHJpc2VzLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IDE5OTIsMTk5MywgMTk5NCwxOTk1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuCi0gKiBhbmQgTWVyaXQgTmV0d29yaywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkCi0gKgotICogU2VlIHRoZSBmaWxlIENPUFlSSUdIVCBmb3IgdGhlIHJlc3BlY3RpdmUgdGVybXMgYW5kIGNvbmRpdGlvbnMuCi0gKiBJZiB0aGUgZmlsZSBpcyBtaXNzaW5nIGNvbnRhY3QgbWUgYXQgbGZAZWxlbWVudGFsLm5ldAotICogYW5kIEknbGwgc2VuZCB5b3UgYSBjb3B5LgotICoKLSAqLwotCi0jaWZuZGVmIFBBVEhOQU1FU19ICi0jZGVmaW5lIFBBVEhOQU1FU19ICi0KLSNkZWZpbmUgX1BBVEhfREVWX1VSQU5ET00JIi9kZXYvdXJhbmRvbSIJCS8qIExpbnV4IG9ubHkgKi8KLSNkZWZpbmUgX1BBVEhfRVRDX0lTU1VFCQkiL2V0Yy9pc3N1ZSIKLQotLyogbm9ybWFsbHkgZGVmaW5lZCBpbiB0aGUgTWFrZWZpbGUgKi8KLSNpZm5kZWYgX1BBVEhfRVRDX1JBRElVU0NMSUVOVF9DT05GCi0jZGVmaW5lIF9QQVRIX0VUQ19SQURJVVNDTElFTlRfQ09ORiAgICAgICAiL2V0Yy9yYWRpdXNjbGllbnQuY29uZiIKLSNlbmRpZgotCi0jZW5kaWYgLyogUEFUSE5BTUVTX0ggKi8KZGlmZiAtLWdpdCBhL3BwcGQvcGx1Z2lucy9yYWRpdXMvcHBwZC1yYWRhdHRyLjggYi9wcHBkL3BsdWdpbnMvcmFkaXVzL3BwcGQtcmFkYXR0ci44CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmQxOTBiLi4wMDAwMDAwCi0tLSBhL3BwcGQvcGx1Z2lucy9yYWRpdXMvcHBwZC1yYWRhdHRyLjgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0uXCIgbWFudWFsIHBhZ2UgW10gZm9yIFJBREFUVFIgcGx1Z2luIGZvciBwcHBkIDIuNAotLlwiICRJZDogcHBwZC1yYWRhdHRyLjgsdiAxLjIgMjAwMy8wNC8yNSAwNzozMzoyMCBmY3VzYWNrIEV4cCAkCi0uXCIgU0ggc2VjdGlvbiBoZWFkaW5nCi0uXCIgU1Mgc3Vic2VjdGlvbiBoZWFkaW5nCi0uXCIgTFAgcGFyYWdyYXBoCi0uXCIgSVAgaW5kZW50ZWQgcGFyYWdyYXBoCi0uXCIgVFAgaGFuZ2luZyBsYWJlbAotLlRIIFBQUEQtUkFEQVRUUiA4Ci0uU0ggTkFNRQotcmFkYXR0ci5zbyBcLSBSQURJVVMgdXRpbGl0eSBwbHVnaW4gZm9yCi0uQlIgcHBwZCAoOCkKLS5TSCBTWU5PUFNJUwotLkIgcHBwZAotWwotLkkgb3B0aW9ucwotXQotcGx1Z2luIHJhZGl1cy5zbyBwbHVnaW4gcmFkYXR0ci5zbwotLlNIIERFU0NSSVBUSU9OCi0uTFAKLVRoZSByYWRhdHRyIHBsdWdpbiBmb3IgcHBwZCBjYXVzZXMgYWxsIHJhZGl1cyBhdHRyaWJ1dGVzIHJldHVybmVkIGJ5Ci10aGUgUkFESVVTIHNlcnZlciBhdCBhdXRoZW50aWNhdGlvbiB0aW1lIHRvIGJlIHN0b3JlZCBpbiB0aGUgZmlsZQotLkkgL3Zhci9ydW4vcmFkYXR0ci5wcHBOCi13aGVyZQotLkkgcHBwTgotaXMgdGhlIG5hbWUgb2YgdGhlIFBQUCBpbnRlcmZhY2UuICBUaGUgUkFESVVTIGF0dHJpYnV0ZXMgYXJlIHN0b3JlZAotb25lIHBlciBsaW5lIGluIHRoZSBmb3JtYXQgIkF0dHJpYnV0ZS1OYW1lIEF0dHJpYnV0ZS1WYWx1ZSIuICBUaGlzCi1mb3JtYXQgaXMgY29udmVuaWVudCBmb3IgdXNlIGluIC9ldGMvcHBwL2lwLXVwIGFuZCAvZXRjL3BwcC9pcC1kb3duCi1zY3JpcHRzLgotLkxQCi1Ob3RlIHRoYXQgeW91Ci0uSSBtdXN0Ci1sb2FkIHRoZSByYWRpdXMuc28gcGx1Z2luIGJlZm9yZSBsb2FkaW5nIHRoZSByYWRhdHRyLnNvIHBsdWdpbjsKLXJhZGF0dHIuc28gZGVwZW5kcyBvbiBzeW1ib2xzIGRlZmluZWQgaW4gcmFkaXVzLnNvLgotCi0uU0ggVVNBR0UKLVRvIHVzZSB0aGUgcGx1Z2luLCBzaW1wbHkgc3VwcGx5IHRoZQotLkIgcGx1Z2luIHJhZGl1cy5zbyBwbHVnaW4gcmFkYXR0ci5zbwotb3B0aW9ucyB0byBwcHBkLgotCi0uU0ggU0VFIEFMU08KLS5CUiBwcHBkICg4KSAiIHBwcGQtcmFkaXVzIiAoOCkKLQotLlNIIEFVVEhPUgotRGF2aWQgRi4gU2tvbGwgPGRmc0Byb2FyaW5ncGVuZ3Vpbi5jb20+CmRpZmYgLS1naXQgYS9wcHBkL3BsdWdpbnMvcmFkaXVzL3BwcGQtcmFkaXVzLjggYi9wcHBkL3BsdWdpbnMvcmFkaXVzL3BwcGQtcmFkaXVzLjgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YzEwM2MuLjAwMDAwMDAKLS0tIGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9wcHBkLXJhZGl1cy44CisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLlwiIG1hbnVhbCBwYWdlIFtdIGZvciBSQURJVVMgcGx1Z2luIGZvciBwcHBkIDIuNAotLlwiICRJZDogcHBwZC1yYWRpdXMuOCx2IDEuNSAyMDA0LzAzLzI2IDEzOjI3OjE3IGthZCBFeHAgJAotLlwiIFNIIHNlY3Rpb24gaGVhZGluZwotLlwiIFNTIHN1YnNlY3Rpb24gaGVhZGluZwotLlwiIExQIHBhcmFncmFwaAotLlwiIElQIGluZGVudGVkIHBhcmFncmFwaAotLlwiIFRQIGhhbmdpbmcgbGFiZWwKLS5USCBQUFBELVJBRElVUyA4Ci0uU0ggTkFNRQotcmFkaXVzLnNvIFwtIFJBRElVUyBhdXRoZW50aWNhdGlvbiBwbHVnaW4gZm9yCi0uQlIgcHBwZCAoOCkKLS5TSCBTWU5PUFNJUwotLkIgcHBwZAotWwotLkkgb3B0aW9ucwotXQotcGx1Z2luIHJhZGl1cy5zbwotLlNIIERFU0NSSVBUSU9OCi0uTFAKLVRoZSBSQURJVVMgcGx1Z2luIGZvciBwcHBkIHBlcm1pdHMgcHBwZCB0byBwZXJmb3JtIFBBUCwgQ0hBUCwgTVMtQ0hBUCBhbmQKLU1TLUNIQVB2MiBhdXRoZW50aWNhdGlvbiBhZ2FpbnN0IGEgUkFESVVTIHNlcnZlciBpbnN0ZWFkIG9mIHRoZSB1c3VhbAotLkkgL2V0Yy9wcHAvcGFwLXNlY3JldHMKLWFuZAotLkkgL2V0Yy9wcHAvY2hhcC1zZWNyZXRzCi1maWxlcy4KLS5MUAotVGhlIFJBRElVUyBwbHVnaW4gaXMgYnVpbHQgb24gYSBsaWJyYXJ5IGNhbGxlZAotLkIgcmFkaXVzY2xpZW50Ci13aGljaCBoYXMgaXRzIG93biBjb25maWd1cmF0aW9uIGZpbGVzICh1c3VhbGx5IGluIFxmSS9ldGMvcmFkaXVzY2xpZW50XGZSKSwKLWNvbnN1bHQgdGhvc2UgZmlsZXMgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY29uZmlndXJpbmcgdGhlIFJBRElVUwotcGx1Z2luCi0KLS5TSCBPUFRJT05TCi1UaGUgUkFESVVTIHBsdWdpbiBpbnRyb2R1Y2VzIG9uZSBhZGRpdGlvbmFsIHBwcGQgb3B0aW9uOgotLlRQCi0uQkkgInJhZGl1cy1jb25maWctZmlsZSAiIGZpbGVuYW1lCi1UaGUgZmlsZQotLkkgZmlsZW5hbWUKLWlzIHRha2VuIGFzIHRoZSByYWRpdXNjbGllbnQgY29uZmlndXJhdGlvbiBmaWxlLiAgSWYgdGhpcyBvcHRpb24gaXMgbm90Ci11c2VkLCB0aGVuIHRoZSBwbHVnaW4gdXNlcwotLkkgL2V0Yy9yYWRpdXNjbGllbnQvcmFkaXVzY2xpZW50LmNvbmYKLWFzIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0uVFAKLS5CSSAiYXZwYWlyICIgYXR0cmlidXRlPXZhbHVlCi1BZGRzIGFuIEF0dHJpYnV0ZS1WYWx1ZSBwYWlyIHRvIGJlIHBhc3NlZCBvbiB0byB0aGUgUkFESVVTIHNlcnZlciBvbiBlYWNoIHJlcXVlc3QuCi0uVFAKLS5CSSBtYXAtdG8taWZuYW1lCi1TZXRzIFJhZGl1cyBOQVMtUG9ydCBhdHRyaWJ1dGUgdG8gbnVtYmVyIGVxdWFsIHRvIGludGVyZmFjZSBuYW1lIChEZWZhdWx0KQotLlRQCi0uQkkgbWFwLXRvLXR0eW5hbWUKLVNldHMgUmFkaXVzIE5BUy1Qb3J0IGF0dHJpYnV0ZSB2YWx1ZSB2aWEgbGlicmFkaXVzY2xpZW50IGxpYnJhcnkKLQotLlNIIFVTQUdFCi1UbyB1c2UgdGhlIHBsdWdpbiwgc2ltcGx5IHN1cHBseSB0aGUKLS5CIHBsdWdpbiByYWRpdXMuc28KLW9wdGlvbiB0byBwcHBkLCBhbmQgZWRpdAotLkkgL2V0Yy9yYWRpdXNjbGllbnQvcmFkaXVzY2xpZW50LmNvbmYKLWFwcHJvcHJpYXRlbHkuICBJZiB5b3UgdXNlIHRoZSBSQURJVVMgcGx1Z2luLCB0aGUgbm9ybWFsIHBwcGQgYXV0aGVudGljYXRpb24KLXNjaGVtZXMgKGxvZ2luLCBjaGVja2luZyB0aGUgL2V0Yy9wcHAvKi1zZWNyZXRzIGZpbGVzKSBhcmUgc2tpcHBlZC4gIFRoZQotUkFESVVTIHNlcnZlciBzaG91bGQgYXNzaWduIGFuIElQIGFkZHJlc3MgdG8gdGhlIHBlZXIgdXNpbmcgdGhlIFJBRElVUwotRnJhbWVkLUlQLUFkZHJlc3MgYXR0cmlidXRlLgotCi0uU0ggU0VFIEFMU08KLS5CUiBwcHBkICg4KSAiIHBwcGQtcmFkYXR0ciIgKDgpCi0KLS5TSCBBVVRIT1IKLURhdmlkIEYuIFNrb2xsIDxkZnNAcm9hcmluZ3Blbmd1aW4uY29tPgpkaWZmIC0tZ2l0IGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9yYWRhdHRyLmMgYi9wcHBkL3BsdWdpbnMvcmFkaXVzL3JhZGF0dHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZlN2RhYS4uMDAwMDAwMAotLS0gYS9wcHBkL3BsdWdpbnMvcmFkaXVzL3JhZGF0dHIuYworKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogcmFkYXR0ci5jCi0qCi0qIEEgcGx1Z2luIHdoaWNoIGlzIHN0YWNrZWQgb24gdG9wIG9mIHJhZGl1cy5zby4gIFRoaXMgcGx1Z2luIHdyaXRlcwotKiBhbGwgUkFESVVTIGF0dHJpYnV0ZXMgZnJvbSB0aGUgc2VydmVyJ3MgYXV0aGVudGljYXRpb24gY29uZmlybWF0aW9uCi0qIGludG8gL3Zhci9ydW4vcmFkYXR0ci5wcHBOLiAgVGhlc2UgYXR0cmlidXRlcyBhcmUgYXZhaWxhYmxlIGZvcgotKiBjb25zdW1wdGlvbiBieSAvZXRjL3BwcC9pcC17dXAsZG93bn0gc2NyaXB0cy4KLSoKLSogQ29weXJpZ2h0IChDKSAyMDAyIFJvYXJpbmcgUGVuZ3VpbiBTb2Z0d2FyZSBJbmMuCi0qCi0qIFRoaXMgcGx1Z2luIG1heSBiZSBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUKLSogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGNoYXIgY29uc3QgUkNTSURbXSA9Ci0iJElkOiByYWRhdHRyLmMsdiAxLjIgMjAwNC8xMC8yOCAwMDoyNDo0MCBwYXVsdXMgRXhwICQiOwotCi0jaW5jbHVkZSAicHBwZC5oIgotI2luY2x1ZGUgInJhZGl1c2NsaWVudC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWV4dGVybiB2b2lkICgqcmFkaXVzX2F0dHJpYnV0ZXNfaG9vaykoVkFMVUVfUEFJUiAqKTsKLXN0YXRpYyB2b2lkIHByaW50X2F0dHJpYnV0ZXMoVkFMVUVfUEFJUiAqKTsKLXN0YXRpYyB2b2lkIGNsZWFudXAodm9pZCAqb3BhcXVlLCBpbnQgYXJnKTsKLQotY2hhciBwcHBkX3ZlcnNpb25bXSA9IFZFUlNJT047Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICVGVU5DVElPTjogcGx1Z2luX2luaXQKLSogJUFSR1VNRU5UUzoKLSogIE5vbmUKLSogJVJFVFVSTlM6Ci0qICBOb3RoaW5nCi0qICVERVNDUklQVElPTjoKLSogIEluaXRpYWxpemVzIHJhZGF0dHIgcGx1Z2luLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1wbHVnaW5faW5pdCh2b2lkKQotewotICAgIHJhZGl1c19hdHRyaWJ1dGVzX2hvb2sgPSBwcmludF9hdHRyaWJ1dGVzOwotCi0jaWYgMAotICAgIC8qIGNhbGxpbmcgY2xlYW51cCgpIG9uIGxpbmsgZG93biBpcyBwcm9ibGVtYXRpYyBiZWNhdXNlIHByaW50X2F0dHJpYnV0ZXMoKQotICAgICAgIGlzIGNhbGxlZCBvbmx5IGFmdGVyIFBBUCBvciBDSEFQIGF1dGhlbnRpY2F0aW9uLCBidXQgbm90IHdoZW4gdGhlIGxpbmsKLSAgICAgICBzaG91bGQgZ28gdXAgYWdhaW4gZm9yIGFueSBvdGhlciByZWFzb24gKi8KLSAgICBhZGRfbm90aWZpZXIoJmxpbmtfZG93bl9ub3RpZmllciwgY2xlYW51cCwgTlVMTCk7Ci0jZW5kaWYKLQotICAgIC8qIEp1c3QgaW4gY2FzZS4uLiAqLwotICAgIGFkZF9ub3RpZmllcigmZXhpdG5vdGlmeSwgY2xlYW51cCwgTlVMTCk7Ci0gICAgaW5mbygiUkFEQVRUUiBwbHVnaW4gaW5pdGlhbGl6ZWQuIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICVGVU5DVElPTjogcHJpbnRfYXR0cmlidXRlcwotKiAlQVJHVU1FTlRTOgotKiAgdnAgLS0gbGlua2VkLWxpc3Qgb2YgUkFESVVTIGF0dHJpYnV0ZS12YWx1ZSBwYWlycwotKiAlUkVUVVJOUzoKLSogIE5vdGhpbmcKLSogJURFU0NSSVBUSU9OOgotKiAgUHJpbnRzIHRoZSBhdHRyaWJ1dGUgcGFpcnMgdG8gL3Zhci9ydW4vcmFkYXR0ci5wcHBOLiAgRWFjaCBsaW5lIG9mIHRoZQotKiAgZmlsZSBjb250YWlucyAibmFtZSB2YWx1ZSIgcGFpcnMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1wcmludF9hdHRyaWJ1dGVzKFZBTFVFX1BBSVIgKnZwKQotewotICAgIEZJTEUgKmZwOwotICAgIGNoYXIgZm5hbWVbNTEyXTsKLSAgICBjaGFyIG5hbWVbMjA0OF07Ci0gICAgY2hhciB2YWx1ZVsyMDQ4XTsKLSAgICBpbnQgY250ID0gMDsKLQotICAgIHNscHJpbnRmKGZuYW1lLCBzaXplb2YoZm5hbWUpLCAiL3Zhci9ydW4vcmFkYXR0ci4lcyIsIGlmbmFtZSk7Ci0gICAgZnAgPSBmb3BlbihmbmFtZSwgInciKTsKLSAgICBpZiAoIWZwKSB7Ci0Jd2FybigicmFkYXR0ciBwbHVnaW46IENvdWxkIG5vdCBvcGVuICVzIGZvciB3cml0aW5nOiAlbSIsIGZuYW1lKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgZm9yICg7IHZwOyB2cD12cC0+bmV4dCkgewotCWlmIChyY19hdnBhaXJfdG9zdHIodnAsIG5hbWUsIHNpemVvZihuYW1lKSwgdmFsdWUsIHNpemVvZih2YWx1ZSkpIDwgMCkgewotCSAgICBjb250aW51ZTsKLQl9Ci0JZnByaW50ZihmcCwgIiVzICVzXG4iLCBuYW1lLCB2YWx1ZSk7Ci0JY250Kys7Ci0gICAgfQotICAgIGZjbG9zZShmcCk7Ci0gICAgZGJnbG9nKCJSQURBVFRSIHBsdWdpbiB3cm90ZSAlZCBsaW5lKHMpIHRvIGZpbGUgJXMuIiwgY250LCBmbmFtZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICVGVU5DVElPTjogY2xlYW51cAotKiAlQVJHVU1FTlRTOgotKiAgb3BhcXVlIC0tIG5vdCB1c2VkCi0qICBhcmcgLS0gbm90IHVzZWQKLSogJVJFVFVSTlM6Ci0qICBOb3RoaW5nCi0qICVERVNDUklQVElPTjoKLSogIERlbGV0ZXMgL3Zhci9ydW4vcmFkYXR0ci5wcHBOCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1jbGVhbnVwKHZvaWQgKm9wYXF1ZSwgaW50IGFyZykKLXsKLSAgICBjaGFyIGZuYW1lWzUxMl07Ci0KLSAgICBzbHByaW50ZihmbmFtZSwgc2l6ZW9mKGZuYW1lKSwgIi92YXIvcnVuL3JhZGF0dHIuJXMiLCBpZm5hbWUpOwotICAgICh2b2lkKSByZW1vdmUoZm5hbWUpOwotICAgIGRiZ2xvZygiUkFEQVRUUiBwbHVnaW4gcmVtb3ZlZCBmaWxlICVzLiIsIGZuYW1lKTsKLX0KZGlmZiAtLWdpdCBhL3BwcGQvcGx1Z2lucy9yYWRpdXMvcmFkaXVzLmMgYi9wcHBkL3BsdWdpbnMvcmFkaXVzL3JhZGl1cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmE1ZjUyLi4wMDAwMDAwCi0tLSBhL3BwcGQvcGx1Z2lucy9yYWRpdXMvcmFkaXVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiByYWRpdXMuYwotKgotKiBSQURJVVMgcGx1Z2luIGZvciBwcHBkLiAgUGVyZm9ybXMgUEFQLCBDSEFQLCBNUy1DSEFQLCBNUy1DSEFQdjIKLSogYXV0aGVudGljYXRpb24gdXNpbmcgUkFESVVTLgotKgotKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9hcmluZyBQZW5ndWluIFNvZnR3YXJlIEluYy4KLSoKLSogQmFzZWQgb24gYSBwYXRjaCBmb3IgaXBwcGQsIHdoaWNoIGlzOgotKiAgICBDb3B5cmlnaHQgKEMpIDE5OTYsIE1hdGpheiBHb2RlYyA8Z29keUBlbGdvLnNpPgotKiAgICBDb3B5cmlnaHQgKEMpIDE5OTYsIExhcnMgRmVubmViZXJnIDxpbjV5MDUwQHB1YmxpYy51bmktaGFtYnVyZy5kZT4KLSogICAgQ29weXJpZ2h0IChDKSAxOTk3LCBNaWd1ZWwgQS5MLiBQYXJheiA8bWFwQGlwaGlsLm5ldD4KLSoKLSogVXNlcyByYWRpdXNjbGllbnQgbGlicmFyeSwgd2hpY2ggaXM6Ci0qICAgIENvcHlyaWdodCAoQykgMTk5NSwxOTk2LDE5OTcsMTk5OCBMYXJzIEZlbm5lYmVyZyA8bGZAZWxlbWVudGFsLm5ldD4KLSogICAgQ29weXJpZ2h0IChDKSAyMDAyIFJvYXJpbmcgUGVuZ3VpbiBTb2Z0d2FyZSBJbmMuCi0qCi0qIE1QUEUgc3VwcG9ydCBpcyBieSBSYWxmIEhvZm1hbm4sIDxyYWxmLmhvZm1hbm5AZWx2aWRvLm5ldD4sIHdpdGgKLSogbW9kaWZpY2F0aW9uIGZyb20gRnJhbmsgQ3VzYWNrLCA8ZnJhbmtAZ29vZ2xlLmNvbT4uCi0qCi0qIFRoaXMgcGx1Z2luIG1heSBiZSBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUKLSogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBjaGFyIGNvbnN0IFJDU0lEW10gPQotIiRJZDogcmFkaXVzLmMsdiAxLjMyIDIwMDgvMDUvMjYgMDk6MTg6MDggcGF1bHVzIEV4cCAkIjsKLQotI2luY2x1ZGUgInBwcGQuaCIKLSNpbmNsdWRlICJjaGFwLW5ldy5oIgotI2lmZGVmIENIQVBNUwotI2luY2x1ZGUgImNoYXBfbXMuaCIKLSNpZmRlZiBNUFBFCi0jaW5jbHVkZSAibWQ1LmgiCi0jZW5kaWYKLSNlbmRpZgotI2luY2x1ZGUgInJhZGl1c2NsaWVudC5oIgotI2luY2x1ZGUgImZzbS5oIgotI2luY2x1ZGUgImlwY3AuaCIKLSNpbmNsdWRlIDxzeXNsb2cuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2RlZmluZSBCVUZfTEVOIDEwMjQKLQotI2RlZmluZSBNRDVfSEFTSF9TSVpFCTE2Ci0KLSNkZWZpbmUgTVNETlMgMQotCi1zdGF0aWMgY2hhciAqY29uZmlnX2ZpbGUgPSBOVUxMOwotc3RhdGljIGludCBhZGRfYXZwKGNoYXIgKiopOwotc3RhdGljIHN0cnVjdCBhdnBvcHQgewotICAgIGNoYXIgKnZwc3RyOwotICAgIHN0cnVjdCBhdnBvcHQgKm5leHQ7Ci19ICphdnBvcHQgPSBOVUxMOwotc3RhdGljIGJvb2wgcG9ydG51bW1hcCA9IDA7Ci0KLXN0YXRpYyBvcHRpb25fdCBPcHRpb25zW10gPSB7Ci0gICAgeyAicmFkaXVzLWNvbmZpZy1maWxlIiwgb19zdHJpbmcsICZjb25maWdfZmlsZSB9LAotICAgIHsgImF2cGFpciIsIG9fc3BlY2lhbCwgYWRkX2F2cCB9LAotICAgIHsgIm1hcC10by10dHluYW1lIiwgb19ib29sLCAmcG9ydG51bW1hcCwKLQkiU2V0IFJhZGl1cyBOQVMtUG9ydCBhdHRyaWJ1dGUgdmFsdWUgdmlhIGxpYnJhZGl1c2NsaWVudCBsaWJyYXJ5IiwgT1BUX1BSSU8gfCAxIH0sCi0gICAgeyAibWFwLXRvLWlmbmFtZSIsIG9fYm9vbCwgJnBvcnRudW1tYXAsCi0JIlNldCBSYWRpdXMgTkFTLVBvcnQgYXR0cmlidXRlIHRvIG51bWJlciBhcyBpbiBpbnRlcmZhY2UgbmFtZSAoRGVmYXVsdCkiLCBPUFRfUFJJT1NVQiB8IDAgfSwKLSAgICB7IE5VTEwgfQotfTsKLQotc3RhdGljIGludCByYWRpdXNfc2VjcmV0X2NoZWNrKHZvaWQpOwotc3RhdGljIGludCByYWRpdXNfcGFwX2F1dGgoY2hhciAqdXNlciwKLQkJCSAgIGNoYXIgKnBhc3N3ZCwKLQkJCSAgIGNoYXIgKiptc2dwLAotCQkJICAgc3RydWN0IHdvcmRsaXN0ICoqcGFkZHJzLAotCQkJICAgc3RydWN0IHdvcmRsaXN0ICoqcG9wdHMpOwotc3RhdGljIGludCByYWRpdXNfY2hhcF92ZXJpZnkoY2hhciAqdXNlciwgY2hhciAqb3VybmFtZSwgaW50IGlkLAotCQkJICAgICAgc3RydWN0IGNoYXBfZGlnZXN0X3R5cGUgKmRpZ2VzdCwKLQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmNoYWxsZW5nZSwKLQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKnJlc3BvbnNlLAotCQkJICAgICAgY2hhciAqbWVzc2FnZSwgaW50IG1lc3NhZ2Vfc3BhY2UpOwotCi1zdGF0aWMgdm9pZCByYWRpdXNfaXBfdXAodm9pZCAqb3BhcXVlLCBpbnQgYXJnKTsKLXN0YXRpYyB2b2lkIHJhZGl1c19pcF9kb3duKHZvaWQgKm9wYXF1ZSwgaW50IGFyZyk7Ci1zdGF0aWMgdm9pZCBtYWtlX3VzZXJuYW1lX3JlYWxtKGNoYXIgKnVzZXIpOwotc3RhdGljIGludCByYWRpdXNfc2V0cGFyYW1zKFZBTFVFX1BBSVIgKnZwLCBjaGFyICptc2csIFJFUVVFU1RfSU5GTyAqcmVxX2luZm8sCi0JCQkgICAgc3RydWN0IGNoYXBfZGlnZXN0X3R5cGUgKmRpZ2VzdCwKLQkJCSAgICB1bnNpZ25lZCBjaGFyICpjaGFsbGVuZ2UsCi0JCQkgICAgY2hhciAqbWVzc2FnZSwgaW50IG1lc3NhZ2Vfc3BhY2UpOwotc3RhdGljIHZvaWQgcmFkaXVzX2Nob29zZV9pcCh1X2ludDMyX3QgKmFkZHJwKTsKLXN0YXRpYyBpbnQgcmFkaXVzX2luaXQoY2hhciAqbXNnKTsKLXN0YXRpYyBpbnQgZ2V0X2NsaWVudF9wb3J0KGNoYXIgKmlmbmFtZSk7Ci1zdGF0aWMgaW50IHJhZGl1c19hbGxvd2VkX2FkZHJlc3ModV9pbnQzMl90IGFkZHIpOwotc3RhdGljIHZvaWQgcmFkaXVzX2FjY3RfaW50ZXJpbSh2b2lkICopOwotI2lmZGVmIE1QUEUKLXN0YXRpYyBpbnQgcmFkaXVzX3NldG1wcGVrZXlzKFZBTFVFX1BBSVIgKnZwLCBSRVFVRVNUX0lORk8gKnJlcV9pbmZvLAotCQkJICAgICAgdW5zaWduZWQgY2hhciAqKTsKLXN0YXRpYyBpbnQgcmFkaXVzX3NldG1wcGVrZXlzMihWQUxVRV9QQUlSICp2cCwgUkVRVUVTVF9JTkZPICpyZXFfaW5mbyk7Ci0jZW5kaWYKLQotI2lmbmRlZiBNQVhTRVNTSU9OSUQKLSNkZWZpbmUgTUFYU0VTU0lPTklEIDMyCi0jZW5kaWYKLQotI2lmbmRlZiBNQVhDTEFTU0xFTgotI2RlZmluZSBNQVhDTEFTU0xFTiA1MDAKLSNlbmRpZgotCi1zdHJ1Y3QgcmFkaXVzX3N0YXRlIHsKLSAgICBpbnQgYWNjb3VudGluZ19zdGFydGVkOwotICAgIGludCBpbml0aWFsaXplZDsKLSAgICBpbnQgY2xpZW50X3BvcnQ7Ci0gICAgaW50IGNob29zZV9pcDsKLSAgICBpbnQgYW55X2lwX2FkZHJfb2s7Ci0gICAgaW50IGRvbmVfY2hhcF9vbmNlOwotICAgIHVfaW50MzJfdCBpcF9hZGRyOwotICAgIGNoYXIgdXNlcltNQVhOQU1FTEVOXTsKLSAgICBjaGFyIGNvbmZpZ19maWxlW01BWFBBVEhMRU5dOwotICAgIGNoYXIgc2Vzc2lvbl9pZFtNQVhTRVNTSU9OSUQgKyAxXTsKLSAgICB0aW1lX3Qgc3RhcnRfdGltZTsKLSAgICBpbnQgYWNjdF9pbnRlcmltX2ludGVydmFsOwotICAgIFNFUlZFUiAqYXV0aHNlcnZlcjsJCS8qIEF1dGhlbnRpY2F0aW9uIHNlcnZlciB0byB1c2UgKi8KLSAgICBTRVJWRVIgKmFjY3RzZXJ2ZXI7CQkvKiBBY2NvdW50aW5nIHNlcnZlciB0byB1c2UgKi8KLSAgICBpbnQgY2xhc3NfbGVuOwotICAgIGNoYXIgY2xhc3NbTUFYQ0xBU1NMRU5dOwotICAgIFZBTFVFX1BBSVIgKmF2cDsJLyogQWRkaXRpb25hbCAodXNlciBzdXBwbGllZCkgdnAncyB0byBzZW5kIHRvIHNlcnZlciAqLwotfTsKLQotdm9pZCAoKnJhZGl1c19hdHRyaWJ1dGVzX2hvb2spKFZBTFVFX1BBSVIgKikgPSBOVUxMOwotCi0vKiBUaGUgcHJlX2F1dGhfaG9vayBNQVkgc2V0IGF1dGhzZXJ2ZXIgYW5kIGFjY3RzZXJ2ZXIgaWYgaXQgd2FudHMuCi0gICBJbiB0aGF0IGNhc2UsIHRoZXkgb3ZlcnJpZGUgdGhlIHZhbHVlcyBpbiB0aGUgcmFkaXVzY2xpZW50LmNvbmYgZmlsZSAqLwotdm9pZCAoKnJhZGl1c19wcmVfYXV0aF9ob29rKShjaGFyIGNvbnN0ICp1c2VyLAotCQkJICAgICBTRVJWRVIgKiphdXRoc2VydmVyLAotCQkJICAgICBTRVJWRVIgKiphY2N0c2VydmVyKSA9IE5VTEw7Ci0KLXN0YXRpYyBzdHJ1Y3QgcmFkaXVzX3N0YXRlIHJzdGF0ZTsKLQotY2hhciBwcHBkX3ZlcnNpb25bXSA9IFZFUlNJT047Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICVGVU5DVElPTjogcGx1Z2luX2luaXQKLSogJUFSR1VNRU5UUzoKLSogIE5vbmUKLSogJVJFVFVSTlM6Ci0qICBOb3RoaW5nCi0qICVERVNDUklQVElPTjoKLSogIEluaXRpYWxpemVzIFJBRElVUyBwbHVnaW4uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLXBsdWdpbl9pbml0KHZvaWQpCi17Ci0gICAgcGFwX2NoZWNrX2hvb2sgPSByYWRpdXNfc2VjcmV0X2NoZWNrOwotICAgIHBhcF9hdXRoX2hvb2sgPSByYWRpdXNfcGFwX2F1dGg7Ci0KLSAgICBjaGFwX2NoZWNrX2hvb2sgPSByYWRpdXNfc2VjcmV0X2NoZWNrOwotICAgIGNoYXBfdmVyaWZ5X2hvb2sgPSByYWRpdXNfY2hhcF92ZXJpZnk7Ci0KLSAgICBpcF9jaG9vc2VfaG9vayA9IHJhZGl1c19jaG9vc2VfaXA7Ci0gICAgYWxsb3dlZF9hZGRyZXNzX2hvb2sgPSByYWRpdXNfYWxsb3dlZF9hZGRyZXNzOwotCi0gICAgYWRkX25vdGlmaWVyKCZpcF91cF9ub3RpZmllciwgcmFkaXVzX2lwX3VwLCBOVUxMKTsKLSAgICBhZGRfbm90aWZpZXIoJmlwX2Rvd25fbm90aWZpZXIsIHJhZGl1c19pcF9kb3duLCBOVUxMKTsKLQotICAgIG1lbXNldCgmcnN0YXRlLCAwLCBzaXplb2YocnN0YXRlKSk7Ci0KLSAgICBzdHJsY3B5KHJzdGF0ZS5jb25maWdfZmlsZSwgIi9ldGMvcmFkaXVzY2xpZW50L3JhZGl1c2NsaWVudC5jb25mIiwKLQkgICAgc2l6ZW9mKHJzdGF0ZS5jb25maWdfZmlsZSkpOwotCi0gICAgYWRkX29wdGlvbnMoT3B0aW9ucyk7Ci0KLSAgICBpbmZvKCJSQURJVVMgcGx1Z2luIGluaXRpYWxpemVkLiIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAlRlVOQ1RJT046IGFkZF9hdnAKLSogJUFSR1VNRU5UUzoKLSogIGFyZ3YgLS0gdGhlIDxhdHRyaWJ1dGU9dmFsdWU+IHBhaXIgdG8gYWRkCi0qICVSRVRVUk5TOgotKiAgMQotKiAlREVTQ1JJUFRJT046Ci0qICBBZGRzIGFuIGF2IHBhaXIgdG8gYmUgcGFzc2VkIG9uIHRvIHRoZSBSQURJVVMgc2VydmVyIG9uIGVhY2ggcmVxdWVzdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludAotYWRkX2F2cChjaGFyICoqYXJndikKLXsKLSAgICBzdHJ1Y3QgYXZwb3B0ICpwID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXZwb3B0KSk7Ci0KLSAgICAvKiBBcHBlbmQgdG8gYSBsaXN0IG9mIHZwJ3MgZm9yIGxhdGVyIHBhcnNpbmcgKi8KLSAgICBwLT52cHN0ciA9IHN0cmR1cCgqYXJndik7Ci0gICAgcC0+bmV4dCA9IGF2cG9wdDsKLSAgICBhdnBvcHQgPSBwOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICVGVU5DVElPTjogcmFkaXVzX3NlY3JldF9jaGVjawotKiAlQVJHVU1FTlRTOgotKiAgTm9uZQotKiAlUkVUVVJOUzoKLSogIDEgLS0gd2UgYXJlIEFMV0FZUyB3aWxsaW5nIHRvIHN1cHBseSBhIHNlY3JldC4gOi0pCi0qICVERVNDUklQVElPTjoKLSogVGVsbHMgcHBwZCB0aGF0IHdlIHdpbGwgdHJ5IHRvIGF1dGhlbnRpY2F0ZSB0aGUgcGVlciwgYW5kIG5vdCB0bwotKiB3b3JyeSBhYm91dCBsb29raW5nIGluIC9ldGMvcHBwLyotc2VjcmV0cwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50Ci1yYWRpdXNfc2VjcmV0X2NoZWNrKHZvaWQpCi17Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICVGVU5DVElPTjogcmFkaXVzX2Nob29zZV9pcAotKiAlQVJHVU1FTlRTOgotKiAgYWRkcnAgLS0gd2hlcmUgdG8gc3RvcmUgdGhlIElQIGFkZHJlc3MKLSogJVJFVFVSTlM6Ci0qICBOb3RoaW5nCi0qICVERVNDUklQVElPTjoKLSogIElmIFJBRElVUyBzZXJ2ZXIgaGFzIHNwZWNpZmllZCBhbiBJUCBhZGRyZXNzLCBpdCBpcyBzdG9yZWQgaW4gKmFkZHJwLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotcmFkaXVzX2Nob29zZV9pcCh1X2ludDMyX3QgKmFkZHJwKQotewotICAgIGlmIChyc3RhdGUuY2hvb3NlX2lwKSB7Ci0JKmFkZHJwID0gcnN0YXRlLmlwX2FkZHI7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAlRlVOQ1RJT046IHJhZGl1c19wYXBfYXV0aAotKiAlQVJHVU1FTlRTOgotKiAgdXNlciAtLSB1c2VyLW5hbWUgb2YgcGVlcgotKiAgcGFzc3dkIC0tIHBhc3N3b3JkIHN1cHBsaWVkIGJ5IHBlZXIKLSogIG1zZ3AgLS0gTWVzc2FnZSB3aGljaCB3aWxsIGJlIHNlbnQgaW4gUEFQIHJlc3BvbnNlCi0qICBwYWRkcnMgLS0gc2V0IHRvIGEgbGlzdCBvZiBwb3NzaWJsZSBwZWVyIElQIGFkZHJlc3NlcwotKiAgcG9wdHMgLS0gc2V0IHRvIGEgbGlzdCBvZiBhZGRpdGlvbmFsIHBwcGQgb3B0aW9ucwotKiAlUkVUVVJOUzoKLSogIDEgaWYgd2UgY2FuIGF1dGhlbnRpY2F0ZSwgLTEgaWYgd2UgY2Fubm90LgotKiAlREVTQ1JJUFRJT046Ci0qIFBlcmZvcm1zIFBBUCBhdXRoZW50aWNhdGlvbiB1c2luZyBSQURJVVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludAotcmFkaXVzX3BhcF9hdXRoKGNoYXIgKnVzZXIsCi0JCWNoYXIgKnBhc3N3ZCwKLQkJY2hhciAqKm1zZ3AsCi0JCXN0cnVjdCB3b3JkbGlzdCAqKnBhZGRycywKLQkJc3RydWN0IHdvcmRsaXN0ICoqcG9wdHMpCi17Ci0gICAgVkFMVUVfUEFJUiAqc2VuZCwgKnJlY2VpdmVkOwotICAgIFVJTlQ0IGF2X3R5cGU7Ci0gICAgaW50IHJlc3VsdDsKLSAgICBzdGF0aWMgY2hhciByYWRpdXNfbXNnW0JVRl9MRU5dOwotCi0gICAgcmFkaXVzX21zZ1swXSA9IDA7Ci0gICAgKm1zZ3AgPSByYWRpdXNfbXNnOwotCi0gICAgaWYgKHJhZGl1c19pbml0KHJhZGl1c19tc2cpIDwgMCkgewotCXJldHVybiAwOwotICAgIH0KLQotICAgIC8qIFB1dCB1c2VyIHdpdGggcG90ZW50aWFsbHkgcmVhbG0gYWRkZWQgaW4gcnN0YXRlLnVzZXIgKi8KLSAgICBtYWtlX3VzZXJuYW1lX3JlYWxtKHVzZXIpOwotCi0gICAgaWYgKHJhZGl1c19wcmVfYXV0aF9ob29rKSB7Ci0JcmFkaXVzX3ByZV9hdXRoX2hvb2socnN0YXRlLnVzZXIsCi0JCQkgICAgICZyc3RhdGUuYXV0aHNlcnZlciwKLQkJCSAgICAgJnJzdGF0ZS5hY2N0c2VydmVyKTsKLSAgICB9Ci0KLSAgICBzZW5kID0gTlVMTDsKLSAgICByZWNlaXZlZCA9IE5VTEw7Ci0KLSAgICAvKiBIYWNrLi4uIHRoZSAicG9ydCIgaXMgdGhlIHBwcCBpbnRlcmZhY2UgbnVtYmVyLiAgU2hvdWxkIHJlYWxseSBiZQotICAgICAgIHRoZSB0dHkgKi8KLSAgICByc3RhdGUuY2xpZW50X3BvcnQgPSBnZXRfY2xpZW50X3BvcnQocG9ydG51bW1hcCA/IGRldm5hbSA6IGlmbmFtZSk7Ci0KLSAgICBhdl90eXBlID0gUFdfRlJBTUVEOwotICAgIHJjX2F2cGFpcl9hZGQoJnNlbmQsIFBXX1NFUlZJQ0VfVFlQRSwgJmF2X3R5cGUsIDAsIFZFTkRPUl9OT05FKTsKLQotICAgIGF2X3R5cGUgPSBQV19QUFA7Ci0gICAgcmNfYXZwYWlyX2FkZCgmc2VuZCwgUFdfRlJBTUVEX1BST1RPQ09MLCAmYXZfdHlwZSwgMCwgVkVORE9SX05PTkUpOwotCi0gICAgcmNfYXZwYWlyX2FkZCgmc2VuZCwgUFdfVVNFUl9OQU1FLCByc3RhdGUudXNlciAsIDAsIFZFTkRPUl9OT05FKTsKLSAgICByY19hdnBhaXJfYWRkKCZzZW5kLCBQV19VU0VSX1BBU1NXT1JELCBwYXNzd2QsIDAsIFZFTkRPUl9OT05FKTsKLSAgICBpZiAoKnJlbW90ZV9udW1iZXIpIHsKLQlyY19hdnBhaXJfYWRkKCZzZW5kLCBQV19DQUxMSU5HX1NUQVRJT05fSUQsIHJlbW90ZV9udW1iZXIsIDAsCi0JCSAgICAgICBWRU5ET1JfTk9ORSk7Ci0gICAgfSBlbHNlIGlmIChpcHBhcmFtKQotCXJjX2F2cGFpcl9hZGQoJnNlbmQsIFBXX0NBTExJTkdfU1RBVElPTl9JRCwgaXBwYXJhbSwgMCwgVkVORE9SX05PTkUpOwotCi0gICAgLyogQWRkIHVzZXIgc3BlY2lmaWVkIHZwJ3MgKi8KLSAgICBpZiAocnN0YXRlLmF2cCkKLQlyY19hdnBhaXJfaW5zZXJ0KCZzZW5kLCBOVUxMLCByY19hdnBhaXJfY29weShyc3RhdGUuYXZwKSk7Ci0KLSAgICBpZiAocnN0YXRlLmF1dGhzZXJ2ZXIpIHsKLQlyZXN1bHQgPSByY19hdXRoX3VzaW5nX3NlcnZlcihyc3RhdGUuYXV0aHNlcnZlciwKLQkJCQkgICAgICByc3RhdGUuY2xpZW50X3BvcnQsIHNlbmQsCi0JCQkJICAgICAgJnJlY2VpdmVkLCByYWRpdXNfbXNnLCBOVUxMKTsKLSAgICB9IGVsc2UgewotCXJlc3VsdCA9IHJjX2F1dGgocnN0YXRlLmNsaWVudF9wb3J0LCBzZW5kLCAmcmVjZWl2ZWQsIHJhZGl1c19tc2csIE5VTEwpOwotICAgIH0KLQotICAgIGlmIChyZXN1bHQgPT0gT0tfUkMpIHsKLQlpZiAocmFkaXVzX3NldHBhcmFtcyhyZWNlaXZlZCwgcmFkaXVzX21zZywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCkgPCAwKSB7Ci0JICAgIHJlc3VsdCA9IEVSUk9SX1JDOwotCX0KLSAgICB9Ci0KLSAgICAvKiBmcmVlIHZhbHVlIHBhaXJzICovCi0gICAgcmNfYXZwYWlyX2ZyZWUocmVjZWl2ZWQpOwotICAgIHJjX2F2cGFpcl9mcmVlKHNlbmQpOwotCi0gICAgcmV0dXJuIChyZXN1bHQgPT0gT0tfUkMpID8gMSA6IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICVGVU5DVElPTjogcmFkaXVzX2NoYXBfdmVyaWZ5Ci0qICVBUkdVTUVOVFM6Ci0qICB1c2VyIC0tIG5hbWUgb2YgdGhlIHBlZXIKLSogIG91cm5hbWUgLS0gbmFtZSBmb3IgdGhpcyBtYWNoaW5lCi0qICBpZCAtLSB0aGUgSUQgYnl0ZSBpbiB0aGUgY2hhbGxlbmdlCi0qICBkaWdlc3QgLS0gcG9pbnRzIHRvIHRoZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBkaWdlc3QgdHlwZQotKiAgY2hhbGxlbmdlIC0tIHRoZSBjaGFsbGVuZ2Ugc3RyaW5nIHdlIHNlbnQgKGxlbmd0aCBpbiBmaXJzdCBieXRlKQotKiAgcmVzcG9uc2UgLS0gdGhlIHJlc3BvbnNlIChoYXNoKSB0aGUgcGVlciBzZW50IGJhY2sgKGxlbmd0aCBpbiAxc3QgYnl0ZSkKLSogIG1lc3NhZ2UgLS0gc3BhY2UgZm9yIGEgbWVzc2FnZSB0byBiZSByZXR1cm5lZCB0byB0aGUgcGVlcgotKiAgbWVzc2FnZV9zcGFjZSAtLSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0ICptZXNzYWdlLgotKiAlUkVUVVJOUzoKLSogIDEgaWYgdGhlIHJlc3BvbnNlIGlzIGdvb2QsIDAgaWYgaXQgaXMgYmFkCi0qICVERVNDUklQVElPTjoKLSogUGVyZm9ybXMgQ0hBUCwgTVMtQ0hBUCBhbmQgTVMtQ0hBUHYyIGF1dGhlbnRpY2F0aW9uIHVzaW5nIFJBRElVUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludAotcmFkaXVzX2NoYXBfdmVyaWZ5KGNoYXIgKnVzZXIsIGNoYXIgKm91cm5hbWUsIGludCBpZCwKLQkJICAgc3RydWN0IGNoYXBfZGlnZXN0X3R5cGUgKmRpZ2VzdCwKLQkJICAgdW5zaWduZWQgY2hhciAqY2hhbGxlbmdlLCB1bnNpZ25lZCBjaGFyICpyZXNwb25zZSwKLQkJICAgY2hhciAqbWVzc2FnZSwgaW50IG1lc3NhZ2Vfc3BhY2UpCi17Ci0gICAgVkFMVUVfUEFJUiAqc2VuZCwgKnJlY2VpdmVkOwotICAgIFVJTlQ0IGF2X3R5cGU7Ci0gICAgc3RhdGljIGNoYXIgcmFkaXVzX21zZ1tCVUZfTEVOXTsKLSAgICBpbnQgcmVzdWx0OwotICAgIGludCBjaGFsbGVuZ2VfbGVuLCByZXNwb25zZV9sZW47Ci0gICAgdV9jaGFyIGNwYXNzd29yZFtNQVhfUkVTUE9OU0VfTEVOICsgMV07Ci0jaWZkZWYgTVBQRQotICAgIC8qIE5lZWQgdGhlIFJBRElVUyBzZWNyZXQgYW5kIFJlcXVlc3QgQXV0aGVudGljYXRvciB0byBkZWNvZGUgTVBQRSAqLwotICAgIFJFUVVFU1RfSU5GTyByZXF1ZXN0X2luZm8sICpyZXFfaW5mbyA9ICZyZXF1ZXN0X2luZm87Ci0jZWxzZQotICAgIFJFUVVFU1RfSU5GTyAqcmVxX2luZm8gPSBOVUxMOwotI2VuZGlmCi0KLSAgICBjaGFsbGVuZ2VfbGVuID0gKmNoYWxsZW5nZSsrOwotICAgIHJlc3BvbnNlX2xlbiA9ICpyZXNwb25zZSsrOwotCi0gICAgcmFkaXVzX21zZ1swXSA9IDA7Ci0KLSAgICBpZiAocmFkaXVzX2luaXQocmFkaXVzX21zZykgPCAwKSB7Ci0JZXJyb3IoIiVzIiwgcmFkaXVzX21zZyk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogcmV0dXJuIGVycm9yIGZvciB0eXBlcyB3ZSBjYW4ndCBoYW5kbGUgKi8KLSAgICBpZiAoKGRpZ2VzdC0+Y29kZSAhPSBDSEFQX01ENSkKLSNpZmRlZiBDSEFQTVMKLQkmJiAoZGlnZXN0LT5jb2RlICE9IENIQVBfTUlDUk9TT0ZUKQotCSYmIChkaWdlc3QtPmNvZGUgIT0gQ0hBUF9NSUNST1NPRlRfVjIpCi0jZW5kaWYKLQkpIHsKLQllcnJvcigiUkFESVVTOiBDaGFsbGVuZ2UgdHlwZSAldSB1bnN1cHBvcnRlZCIsIGRpZ2VzdC0+Y29kZSk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogUHV0IHVzZXIgd2l0aCBwb3RlbnRpYWxseSByZWFsbSBhZGRlZCBpbiByc3RhdGUudXNlciAqLwotICAgIGlmICghcnN0YXRlLmRvbmVfY2hhcF9vbmNlKSB7Ci0JbWFrZV91c2VybmFtZV9yZWFsbSh1c2VyKTsKLQlyc3RhdGUuY2xpZW50X3BvcnQgPSBnZXRfY2xpZW50X3BvcnQgKHBvcnRudW1tYXAgPyBkZXZuYW0gOiBpZm5hbWUpOwotCWlmIChyYWRpdXNfcHJlX2F1dGhfaG9vaykgewotCSAgICByYWRpdXNfcHJlX2F1dGhfaG9vayhyc3RhdGUudXNlciwKLQkJCQkgJnJzdGF0ZS5hdXRoc2VydmVyLAotCQkJCSAmcnN0YXRlLmFjY3RzZXJ2ZXIpOwotCX0KLSAgICB9Ci0KLSAgICBzZW5kID0gcmVjZWl2ZWQgPSBOVUxMOwotCi0gICAgYXZfdHlwZSA9IFBXX0ZSQU1FRDsKLSAgICByY19hdnBhaXJfYWRkICgmc2VuZCwgUFdfU0VSVklDRV9UWVBFLCAmYXZfdHlwZSwgMCwgVkVORE9SX05PTkUpOwotCi0gICAgYXZfdHlwZSA9IFBXX1BQUDsKLSAgICByY19hdnBhaXJfYWRkICgmc2VuZCwgUFdfRlJBTUVEX1BST1RPQ09MLCAmYXZfdHlwZSwgMCwgVkVORE9SX05PTkUpOwotCi0gICAgcmNfYXZwYWlyX2FkZCAoJnNlbmQsIFBXX1VTRVJfTkFNRSwgcnN0YXRlLnVzZXIgLCAwLCBWRU5ET1JfTk9ORSk7Ci0KLSAgICAvKgotICAgICAqIGFkZCB0aGUgY2hhbGxlbmdlIGFuZCByZXNwb25zZSBmaWVsZHMKLSAgICAgKi8KLSAgICBzd2l0Y2ggKGRpZ2VzdC0+Y29kZSkgewotICAgIGNhc2UgQ0hBUF9NRDU6Ci0JLyogQ0hBUC1DaGFsbGVuZ2UgYW5kIENIQVAtUGFzc3dvcmQgKi8KLQlpZiAocmVzcG9uc2VfbGVuICE9IE1ENV9IQVNIX1NJWkUpCi0JICAgIHJldHVybiAwOwotCWNwYXNzd29yZFswXSA9IGlkOwotCW1lbWNweSgmY3Bhc3N3b3JkWzFdLCByZXNwb25zZSwgTUQ1X0hBU0hfU0laRSk7Ci0KLQlyY19hdnBhaXJfYWRkKCZzZW5kLCBQV19DSEFQX0NIQUxMRU5HRSwKLQkJICAgICAgY2hhbGxlbmdlLCBjaGFsbGVuZ2VfbGVuLCBWRU5ET1JfTk9ORSk7Ci0JcmNfYXZwYWlyX2FkZCgmc2VuZCwgUFdfQ0hBUF9QQVNTV09SRCwKLQkJICAgICAgY3Bhc3N3b3JkLCBNRDVfSEFTSF9TSVpFICsgMSwgVkVORE9SX05PTkUpOwotCWJyZWFrOwotCi0jaWZkZWYgQ0hBUE1TCi0gICAgY2FzZSBDSEFQX01JQ1JPU09GVDoKLSAgICB7Ci0JLyogTVMtQ0hBUC1DaGFsbGVuZ2UgYW5kIE1TLUNIQVAtUmVzcG9uc2UgKi8KLQl1X2NoYXIgKnAgPSBjcGFzc3dvcmQ7Ci0KLQlpZiAocmVzcG9uc2VfbGVuICE9IE1TX0NIQVBfUkVTUE9OU0VfTEVOKQotCSAgICByZXR1cm4gMDsKLQkqcCsrID0gaWQ7Ci0JLyogVGhlIGlkaW90cyB1c2UgYSBkaWZmZXJlbnQgZmllbGQgb3JkZXIgaW4gUkFESVVTIHRoYW4gUFBQICovCi0JKnArKyA9IHJlc3BvbnNlW01TX0NIQVBfVVNFTlRdOwotCW1lbWNweShwLCByZXNwb25zZSwgTVNfQ0hBUF9MQU5NQU5SRVNQX0xFTiArIE1TX0NIQVBfTlRSRVNQX0xFTik7Ci0KLQlyY19hdnBhaXJfYWRkKCZzZW5kLCBQV19NU19DSEFQX0NIQUxMRU5HRSwKLQkJICAgICAgY2hhbGxlbmdlLCBjaGFsbGVuZ2VfbGVuLCBWRU5ET1JfTUlDUk9TT0ZUKTsKLQlyY19hdnBhaXJfYWRkKCZzZW5kLCBQV19NU19DSEFQX1JFU1BPTlNFLAotCQkgICAgICBjcGFzc3dvcmQsIE1TX0NIQVBfUkVTUE9OU0VfTEVOICsgMSwgVkVORE9SX01JQ1JPU09GVCk7Ci0JYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBDSEFQX01JQ1JPU09GVF9WMjoKLSAgICB7Ci0JLyogTVMtQ0hBUC1DaGFsbGVuZ2UgYW5kIE1TLUNIQVAyLVJlc3BvbnNlICovCi0JdV9jaGFyICpwID0gY3Bhc3N3b3JkOwotCi0JaWYgKHJlc3BvbnNlX2xlbiAhPSBNU19DSEFQMl9SRVNQT05TRV9MRU4pCi0JICAgIHJldHVybiAwOwotCSpwKysgPSBpZDsKLQkvKiBUaGUgaWRpb3RzIHVzZSBhIGRpZmZlcmVudCBmaWVsZCBvcmRlciBpbiBSQURJVVMgdGhhbiBQUFAgKi8KLQkqcCsrID0gcmVzcG9uc2VbTVNfQ0hBUDJfRkxBR1NdOwotCW1lbWNweShwLCByZXNwb25zZSwgKE1TX0NIQVAyX1BFRVJfQ0hBTF9MRU4gKyBNU19DSEFQMl9SRVNFUlZFRF9MRU4KLQkJCSAgICAgKyBNU19DSEFQMl9OVFJFU1BfTEVOKSk7Ci0KLQlyY19hdnBhaXJfYWRkKCZzZW5kLCBQV19NU19DSEFQX0NIQUxMRU5HRSwKLQkJICAgICAgY2hhbGxlbmdlLCBjaGFsbGVuZ2VfbGVuLCBWRU5ET1JfTUlDUk9TT0ZUKTsKLQlyY19hdnBhaXJfYWRkKCZzZW5kLCBQV19NU19DSEFQMl9SRVNQT05TRSwKLQkJICAgICAgY3Bhc3N3b3JkLCBNU19DSEFQMl9SRVNQT05TRV9MRU4gKyAxLCBWRU5ET1JfTUlDUk9TT0ZUKTsKLQlicmVhazsKLSAgICB9Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICBpZiAoKnJlbW90ZV9udW1iZXIpIHsKLQlyY19hdnBhaXJfYWRkKCZzZW5kLCBQV19DQUxMSU5HX1NUQVRJT05fSUQsIHJlbW90ZV9udW1iZXIsIDAsCi0JCSAgICAgICBWRU5ET1JfTk9ORSk7Ci0gICAgfSBlbHNlIGlmIChpcHBhcmFtKQotCXJjX2F2cGFpcl9hZGQoJnNlbmQsIFBXX0NBTExJTkdfU1RBVElPTl9JRCwgaXBwYXJhbSwgMCwgVkVORE9SX05PTkUpOwotCi0gICAgLyogQWRkIHVzZXIgc3BlY2lmaWVkIHZwJ3MgKi8KLSAgICBpZiAocnN0YXRlLmF2cCkKLQlyY19hdnBhaXJfaW5zZXJ0KCZzZW5kLCBOVUxMLCByY19hdnBhaXJfY29weShyc3RhdGUuYXZwKSk7Ci0KLSAgICAvKgotICAgICAqIG1ha2UgYXV0aGVudGljYXRpb24gd2l0aCBSQURJVVMgc2VydmVyCi0gICAgICovCi0KLSAgICBpZiAocnN0YXRlLmF1dGhzZXJ2ZXIpIHsKLQlyZXN1bHQgPSByY19hdXRoX3VzaW5nX3NlcnZlcihyc3RhdGUuYXV0aHNlcnZlciwKLQkJCQkgICAgICByc3RhdGUuY2xpZW50X3BvcnQsIHNlbmQsCi0JCQkJICAgICAgJnJlY2VpdmVkLCByYWRpdXNfbXNnLCByZXFfaW5mbyk7Ci0gICAgfSBlbHNlIHsKLQlyZXN1bHQgPSByY19hdXRoKHJzdGF0ZS5jbGllbnRfcG9ydCwgc2VuZCwgJnJlY2VpdmVkLCByYWRpdXNfbXNnLAotCQkJIHJlcV9pbmZvKTsKLSAgICB9Ci0KLSAgICBzdHJsY3B5KG1lc3NhZ2UsIHJhZGl1c19tc2csIG1lc3NhZ2Vfc3BhY2UpOwotCi0gICAgaWYgKHJlc3VsdCA9PSBPS19SQykgewotCWlmICghcnN0YXRlLmRvbmVfY2hhcF9vbmNlKSB7Ci0JICAgIGlmIChyYWRpdXNfc2V0cGFyYW1zKHJlY2VpdmVkLCByYWRpdXNfbXNnLCByZXFfaW5mbywgZGlnZXN0LAotCQkJCSBjaGFsbGVuZ2UsIG1lc3NhZ2UsIG1lc3NhZ2Vfc3BhY2UpIDwgMCkgewotCQllcnJvcigiJXMiLCByYWRpdXNfbXNnKTsKLQkJcmVzdWx0ID0gRVJST1JfUkM7Ci0JICAgIH0gZWxzZSB7Ci0JCXJzdGF0ZS5kb25lX2NoYXBfb25jZSA9IDE7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgcmNfYXZwYWlyX2ZyZWUocmVjZWl2ZWQpOwotICAgIHJjX2F2cGFpcl9mcmVlIChzZW5kKTsKLSAgICByZXR1cm4gKHJlc3VsdCA9PSBPS19SQyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICVGVU5DVElPTjogbWFrZV91c2VybmFtZV9yZWFsbQotKiAlQVJHVU1FTlRTOgotKiAgdXNlciAtLSB0aGUgdXNlciBnaXZlbiB0byBwcHBkCi0qICVSRVRVUk5TOgotKiAgTm90aGluZwotKiAlREVTQ1JJUFRJT046Ci0qICBDb3BpZXMgdXNlciBpbnRvIHJzdGF0ZS51c2VyLiAgSWYgaXQgbGFja3MgYSByZWFsbSAobm8gIkBkb21haW4iIHBhcnQpLAotKiB0aGVuIHRoZSBkZWZhdWx0IHJlYWxtIGZyb20gdGhlIHJhZGl1c2NsaWVudCBjb25maWcgZmlsZSBpcyBhZGRlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLW1ha2VfdXNlcm5hbWVfcmVhbG0oY2hhciAqdXNlcikKLXsKLSAgICBjaGFyICpkZWZhdWx0X3JlYWxtOwotCi0gICAgaWYgKCB1c2VyICE9IE5VTEwgKSB7Ci0Jc3RybGNweShyc3RhdGUudXNlciwgdXNlciwgc2l6ZW9mKHJzdGF0ZS51c2VyKSk7Ci0gICAgfSAgZWxzZSB7Ci0JcnN0YXRlLnVzZXJbMF0gPSAwOwotICAgIH0KLQotICAgIGRlZmF1bHRfcmVhbG0gPSByY19jb25mX3N0cigiZGVmYXVsdF9yZWFsbSIpOwotCi0gICAgaWYgKCFzdHJjaHIocnN0YXRlLnVzZXIsICdAJykgJiYKLQlkZWZhdWx0X3JlYWxtICYmCi0JKCpkZWZhdWx0X3JlYWxtICE9ICdcMCcpKSB7Ci0Jc3RybGNhdChyc3RhdGUudXNlciwgIkAiLCBzaXplb2YocnN0YXRlLnVzZXIpKTsKLQlzdHJsY2F0KHJzdGF0ZS51c2VyLCBkZWZhdWx0X3JlYWxtLCBzaXplb2YocnN0YXRlLnVzZXIpKTsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICVGVU5DVElPTjogcmFkaXVzX3NldHBhcmFtcwotKiAlQVJHVU1FTlRTOgotKiAgdnAgLS0gcmVjZWl2ZWQgdmFsdWUtcGFpcnMKLSogIG1zZyAtLSBidWZmZXIgaW4gd2hpY2ggdG8gcGxhY2UgZXJyb3IgbWVzc2FnZS4gIEhvbGRzIHVwIHRvIEJVRl9MRU4gY2hhcnMKLSogJVJFVFVSTlM6Ci0qICA+PSAwIG9uIHN1Y2Nlc3M7IC0xIG9uIGZhaWx1cmUKLSogJURFU0NSSVBUSU9OOgotKiAgUGFyc2VzIGF0dHJpYnV0ZXMgc2VudCBieSBSQURJVVMgc2VydmVyIGFuZCBzZXRzIHRoZW0gaW4gcHBwZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludAotcmFkaXVzX3NldHBhcmFtcyhWQUxVRV9QQUlSICp2cCwgY2hhciAqbXNnLCBSRVFVRVNUX0lORk8gKnJlcV9pbmZvLAotCQkgc3RydWN0IGNoYXBfZGlnZXN0X3R5cGUgKmRpZ2VzdCwgdW5zaWduZWQgY2hhciAqY2hhbGxlbmdlLAotCQkgY2hhciAqbWVzc2FnZSwgaW50IG1lc3NhZ2Vfc3BhY2UpCi17Ci0gICAgdV9pbnQzMl90IHJlbW90ZTsKLSAgICBpbnQgbXNfY2hhcDJfc3VjY2VzcyA9IDA7Ci0jaWZkZWYgTVBQRQotICAgIGludCBtcHBlX2VuY19rZXlzID0gMDsJLyogd2hldGhlciBvciBub3QgdGhlc2Ugd2VyZSByZWNlaXZlZCAqLwotICAgIGludCBtcHBlX2VuY19wb2xpY3kgPSAwOwotICAgIGludCBtcHBlX2VuY190eXBlcyA9IDA7Ci0jZW5kaWYKLSNpZmRlZiBNU0ROUwotICAgIGlwY3Bfb3B0aW9ucyAqd28gPSAmaXBjcF93YW50b3B0aW9uc1swXTsKLSAgICBpcGNwX29wdGlvbnMgKmFvID0gJmlwY3BfYWxsb3dvcHRpb25zWzBdOwotICAgIGludCBnb3RfbXNkbnNfMSA9IDA7Ci0gICAgaW50IGdvdF9tc2Ruc18yID0gMDsKLSAgICBpbnQgZ290X3dpbnNfMSA9IDA7Ci0gICAgaW50IGdvdF93aW5zXzIgPSAwOwotI2VuZGlmCi0KLSAgICAvKiBTZW5kIFJBRElVUyBhdHRyaWJ1dGVzIHRvIGFueW9uZSBlbHNlIHdobyBtaWdodCBiZSBpbnRlcmVzdGVkICovCi0gICAgaWYgKHJhZGl1c19hdHRyaWJ1dGVzX2hvb2spIHsKLQkoKnJhZGl1c19hdHRyaWJ1dGVzX2hvb2spKHZwKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIHNlcnZpY2UgdHlwZSAoaWYgbm90IGZyYW1lZCB0aGVuIHF1aXQpLAotICAgICAqIG5ldyBJUCBhZGRyZXNzIChSQURJVVMgY2FuIGRlZmluZSBzdGF0aWMgSVAgZm9yIHNvbWUgdXNlcnMpLAotICAgICAqLwotCi0gICAgd2hpbGUgKHZwKSB7Ci0JaWYgKHZwLT52ZW5kb3Jjb2RlID09IFZFTkRPUl9OT05FKSB7Ci0JICAgIHN3aXRjaCAodnAtPmF0dHJpYnV0ZSkgewotCSAgICBjYXNlIFBXX1NFUlZJQ0VfVFlQRToKLQkJLyogY2hlY2sgZm9yIHNlcnZpY2UgdHlwZSAgICAgICAqLwotCQkvKiBpZiBub3QgRlJBTUVEIHRoZW4gZXhpdCAgICAgICovCi0JCWlmICh2cC0+bHZhbHVlICE9IFBXX0ZSQU1FRCkgewotCQkgICAgc2xwcmludGYobXNnLCBCVUZfTEVOLCAiUkFESVVTOiB3cm9uZyBzZXJ2aWNlIHR5cGUgJWxkIGZvciAlcyIsCi0JCQkgICAgIHZwLT5sdmFsdWUsIHJzdGF0ZS51c2VyKTsKLQkJICAgIHJldHVybiAtMTsKLQkJfQotCQlicmVhazsKLQotCSAgICBjYXNlIFBXX0ZSQU1FRF9QUk9UT0NPTDoKLQkJLyogY2hlY2sgZm9yIGZyYW1lZCBwcm90b2NvbCB0eXBlICAgICAgICovCi0JCS8qIGlmIG5vdCBQUFAgdGhlbiBhbHNvIGV4aXQgICAgICAgICAgICAqLwotCQlpZiAodnAtPmx2YWx1ZSAhPSBQV19QUFApIHsKLQkJICAgIHNscHJpbnRmKG1zZywgQlVGX0xFTiwgIlJBRElVUzogd3JvbmcgZnJhbWVkIHByb3RvY29sICVsZCBmb3IgJXMiLAotCQkJICAgICB2cC0+bHZhbHVlLCByc3RhdGUudXNlcik7Ci0JCSAgICByZXR1cm4gLTE7Ci0JCX0KLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSBQV19TRVNTSU9OX1RJTUVPVVQ6Ci0JCS8qIFNlc3Npb24gdGltZW91dCAqLwotCQltYXhjb25uZWN0ID0gdnAtPmx2YWx1ZTsKLQkJYnJlYWs7Ci0gICAgICAgICAgIGNhc2UgUFdfRklMVEVSX0lEOgotICAgICAgICAgICAgICAgLyogcGFja2V0IGZpbHRlciwgd2lsbCBiZSBoYW5kbGVkIHZpYSBpcC0odXB8ZG93bikgc2NyaXB0ICovCi0gICAgICAgICAgICAgICBzY3JpcHRfc2V0ZW52KCJSQURJVVNfRklMVEVSX0lEIiwgdnAtPnN0cnZhbHVlLCAxKTsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBjYXNlIFBXX0ZSQU1FRF9ST1VURToKLSAgICAgICAgICAgICAgIC8qIHJvdXRlLCB3aWxsIGJlIGhhbmRsZWQgdmlhIGlwLSh1cHxkb3duKSBzY3JpcHQgKi8KLSAgICAgICAgICAgICAgIHNjcmlwdF9zZXRlbnYoIlJBRElVU19GUkFNRURfUk9VVEUiLCB2cC0+c3RydmFsdWUsIDEpOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIGNhc2UgUFdfSURMRV9USU1FT1VUOgotICAgICAgICAgICAgICAgLyogaWRsZSBwYXJhbWV0ZXIgKi8KLSAgICAgICAgICAgICAgIGlkbGVfdGltZV9saW1pdCA9IHZwLT5sdmFsdWU7Ci0gICAgICAgICAgICAgICBicmVhazsKLSNpZmRlZiBNQVhPQ1RFVFMKLQkgICAgY2FzZSBQV19TRVNTSU9OX09DVEVUU19MSU1JVDoKLQkJLyogU2Vzc2lvbiB0cmFmZmljIGxpbWl0ICovCi0JCW1heG9jdGV0cyA9IHZwLT5sdmFsdWU7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFBXX09DVEVUU19ESVJFQ1RJT046Ci0JCS8qIFNlc3Npb24gdHJhZmZpYyBsaW1pdCBkaXJlY3Rpb24gY2hlY2sgKi8KLQkJbWF4b2N0ZXRzX2RpciA9ICggdnAtPmx2YWx1ZSA+IDQgKSA/IDAgOiB2cC0+bHZhbHVlIDsKLQkJYnJlYWs7Ci0jZW5kaWYKLQkgICAgY2FzZSBQV19BQ0NUX0lOVEVSSU1fSU5URVJWQUw6Ci0JCS8qIFNlbmQgYWNjb3VudGluZyB1cGRhdGVzIGV2ZXJ5IGZldyBzZWNvbmRzICovCi0JCXJzdGF0ZS5hY2N0X2ludGVyaW1faW50ZXJ2YWwgPSB2cC0+bHZhbHVlOwotCQkvKiBSRkMgc2F5cyBpdCBNVVNUIE5PVCBiZSBsZXNzIHRoYW4gNjAgc2Vjb25kcyAqLwotCQkvKiBXZSB1c2UgIjAiIHRvIHNpZ25pZnkgbm90IHNlbmRpbmcgdXBkYXRlcyAqLwotCQlpZiAocnN0YXRlLmFjY3RfaW50ZXJpbV9pbnRlcnZhbCAmJgotCQkgICAgcnN0YXRlLmFjY3RfaW50ZXJpbV9pbnRlcnZhbCA8IDYwKSB7Ci0JCSAgICByc3RhdGUuYWNjdF9pbnRlcmltX2ludGVydmFsID0gNjA7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgUFdfRlJBTUVEX0lQX0FERFJFU1M6Ci0JCS8qIHNldGluZyB1cCByZW1vdGUgSVAgYWRkcmVzc2VzICovCi0JCXJlbW90ZSA9IHZwLT5sdmFsdWU7Ci0JCWlmIChyZW1vdGUgPT0gMHhmZmZmZmZmZikgewotCQkgICAgLyogMHhmZmZmZmZmZiBtZWFucyB1c2VyIHNob3VsZCBiZSBhbGxvd2VkIHRvIHNlbGVjdCBvbmUgKi8KLQkJICAgIHJzdGF0ZS5hbnlfaXBfYWRkcl9vayA9IDE7Ci0JCX0gZWxzZSBpZiAocmVtb3RlICE9IDB4ZmZmZmZmZmUpIHsKLQkJICAgIC8qIDB4ZmZmZmZmZmUgbWVhbnMgTkFTIHNob3VsZCBzZWxlY3QgYW4gaXAgYWRkcmVzcyAqLwotCQkgICAgcmVtb3RlID0gaHRvbmwodnAtPmx2YWx1ZSk7Ci0JCSAgICBpZiAoYmFkX2lwX2FkcnMgKHJlbW90ZSkpIHsKLQkJCXNscHJpbnRmKG1zZywgQlVGX0xFTiwgIlJBRElVUzogYmFkIHJlbW90ZSBJUCBhZGRyZXNzICVJIGZvciAlcyIsCi0JCQkJIHJlbW90ZSwgcnN0YXRlLnVzZXIpOwotCQkJcmV0dXJuIC0xOwotCQkgICAgfQotCQkgICAgcnN0YXRlLmNob29zZV9pcCA9IDE7Ci0JCSAgICByc3RhdGUuaXBfYWRkciA9IHJlbW90ZTsKLQkJfQotCQlicmVhazsKLSAgICAgICAgICAgIGNhc2UgUFdfTkFTX0lQX0FERFJFU1M6Ci0gICAgICAgICAgICAgICAgd28tPm91cmFkZHIgPSBodG9ubCh2cC0+bHZhbHVlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQkgICAgY2FzZSBQV19DTEFTUzoKLQkJLyogU2F2ZSBDbGFzcyBhdHRyaWJ1dGUgdG8gcGFzcyBpdCBpbiBhY2NvdW50aW5nIHJlcXVlc3QgKi8KLQkJaWYgKHZwLT5sdmFsdWUgPD0gTUFYQ0xBU1NMRU4pIHsKLQkJICAgIHJzdGF0ZS5jbGFzc19sZW49dnAtPmx2YWx1ZTsKLQkJICAgIG1lbWNweShyc3RhdGUuY2xhc3MsIHZwLT5zdHJ2YWx1ZSwgcnN0YXRlLmNsYXNzX2xlbik7Ci0JCX0gLyogZWxzZSB0b28gYmlnIGZvciBvdXIgYnVmZmVyIC0gaWdub3JlIGl0ICovCi0JCWJyZWFrOwotCSAgICB9Ci0KLQotCX0gZWxzZSBpZiAodnAtPnZlbmRvcmNvZGUgPT0gVkVORE9SX01JQ1JPU09GVCkgewotI2lmZGVmIENIQVBNUwotCSAgICBzd2l0Y2ggKHZwLT5hdHRyaWJ1dGUpIHsKLQkgICAgY2FzZSBQV19NU19DSEFQMl9TVUNDRVNTOgotCQlpZiAoKHZwLT5sdmFsdWUgIT0gNDMpIHx8IHN0cm5jbXAodnAtPnN0cnZhbHVlICsgMSwgIlM9IiwgMikpIHsKLQkJICAgIHNscHJpbnRmKG1zZyxCVUZfTEVOLCJSQURJVVM6IGJhZCBNUy1DSEFQMi1TdWNjZXNzIHBhY2tldCIpOwotCQkgICAgcmV0dXJuIC0xOwotCQl9Ci0JCWlmIChtZXNzYWdlICE9IE5VTEwpCi0JCSAgICBzdHJsY3B5KG1lc3NhZ2UsIHZwLT5zdHJ2YWx1ZSArIDEsIG1lc3NhZ2Vfc3BhY2UpOwotCQltc19jaGFwMl9zdWNjZXNzID0gMTsKLQkJYnJlYWs7Ci0KLSNpZmRlZiBNUFBFCi0JICAgIGNhc2UgUFdfTVNfQ0hBUF9NUFBFX0tFWVM6Ci0JCWlmIChyYWRpdXNfc2V0bXBwZWtleXModnAsIHJlcV9pbmZvLCBjaGFsbGVuZ2UpIDwgMCkgewotCQkgICAgc2xwcmludGYobXNnLCBCVUZfTEVOLAotCQkJICAgICAiUkFESVVTOiBiYWQgTVMtQ0hBUC1NUFBFLUtleXMgYXR0cmlidXRlIik7Ci0JCSAgICByZXR1cm4gLTE7Ci0JCX0KLQkJbXBwZV9lbmNfa2V5cyA9IDE7Ci0JCWJyZWFrOwotCi0JICAgIGNhc2UgUFdfTVNfTVBQRV9TRU5EX0tFWToKLQkgICAgY2FzZSBQV19NU19NUFBFX1JFQ1ZfS0VZOgotCQlpZiAocmFkaXVzX3NldG1wcGVrZXlzMih2cCwgcmVxX2luZm8pIDwgMCkgewotCQkgICAgc2xwcmludGYobXNnLCBCVUZfTEVOLAotCQkJICAgICAiUkFESVVTOiBiYWQgTVMtTVBQRS0lcy1LZXkgYXR0cmlidXRlIiwKLQkJCSAgICAgKHZwLT5hdHRyaWJ1dGUgPT0gUFdfTVNfTVBQRV9TRU5EX0tFWSk/Ci0JCQkgICAgICJTZW5kIjogIlJlY3YiKTsKLQkJICAgIHJldHVybiAtMTsKLQkJfQotCQltcHBlX2VuY19rZXlzID0gMTsKLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSBQV19NU19NUFBFX0VOQ1JZUFRJT05fUE9MSUNZOgotCQltcHBlX2VuY19wb2xpY3kgPSB2cC0+bHZhbHVlOwkvKiBzYXZlIGZvciBsYXRlciAqLwotCQlicmVhazsKLQotCSAgICBjYXNlIFBXX01TX01QUEVfRU5DUllQVElPTl9UWVBFUzoKLQkJbXBwZV9lbmNfdHlwZXMgPSB2cC0+bHZhbHVlOwkvKiBzYXZlIGZvciBsYXRlciAqLwotCQlicmVhazsKLQotI2VuZGlmIC8qIE1QUEUgKi8KLSNpZmRlZiBNU0ROUwotCSAgICBjYXNlIFBXX01TX1BSSU1BUllfRE5TX1NFUlZFUjoKLQkJYW8tPmRuc2FkZHJbMF0gPSBodG9ubCh2cC0+bHZhbHVlKTsKLQkJZ290X21zZG5zXzEgPSAxOwotCQlpZiAoIWdvdF9tc2Ruc18yKQotCQkgICAgYW8tPmRuc2FkZHJbMV0gPSBhby0+ZG5zYWRkclswXTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgUFdfTVNfU0VDT05EQVJZX0ROU19TRVJWRVI6Ci0JCWFvLT5kbnNhZGRyWzFdID0gaHRvbmwodnAtPmx2YWx1ZSk7Ci0JCWdvdF9tc2Ruc18yID0gMTsKLQkJaWYgKCFnb3RfbXNkbnNfMSkKLQkJICAgIGFvLT5kbnNhZGRyWzBdID0gYW8tPmRuc2FkZHJbMV07Ci0JCWJyZWFrOwotCSAgICBjYXNlIFBXX01TX1BSSU1BUllfTkJOU19TRVJWRVI6Ci0JCWFvLT53aW5zYWRkclswXSA9IGh0b25sKHZwLT5sdmFsdWUpOwotCQlnb3Rfd2luc18xID0gMTsKLQkJaWYgKCFnb3Rfd2luc18yKQotCQkgICAgYW8tPndpbnNhZGRyWzFdID0gYW8tPndpbnNhZGRyWzBdOwotCQlicmVhazsKLQkgICAgY2FzZSBQV19NU19TRUNPTkRBUllfTkJOU19TRVJWRVI6Ci0JCWFvLT53aW5zYWRkclsxXSA9IGh0b25sKHZwLT5sdmFsdWUpOwotCQlnb3Rfd2luc18yID0gMTsKLQkJaWYgKCFnb3Rfd2luc18xKQotCQkgICAgYW8tPndpbnNhZGRyWzBdID0gYW8tPndpbnNhZGRyWzFdOwotCQlicmVhazsKLSNlbmRpZiAvKiBNU0ROUyAqLwotCSAgICB9Ci0jZW5kaWYgLyogQ0hBUE1TICovCi0JfQotCXZwID0gdnAtPm5leHQ7Ci0gICAgfQotCi0gICAgLyogUmVxdWlyZSBhIHZhbGlkIE1TLUNIQVAyLVNVQ0NFU1MgZm9yIE1TLUNIQVB2MiBhdXRoICovCi0gICAgaWYgKGRpZ2VzdCAmJiAoZGlnZXN0LT5jb2RlID09IENIQVBfTUlDUk9TT0ZUX1YyKSAmJiAhbXNfY2hhcDJfc3VjY2VzcykKLQlyZXR1cm4gLTE7Ci0KLSNpZmRlZiBNUFBFCi0gICAgLyoKLSAgICAgKiBSZXF1aXJlIGJvdGggcG9saWN5IGFuZCBrZXkgYXR0cmlidXRlcyB0byBpbmRpY2F0ZSBhIHZhbGlkIGtleS4KLSAgICAgKiBOb3RlIHRoYXQgaWYgdGhlIHBvbGljeSB2YWx1ZSB3YXMgJzAnIHdlIGRvbid0IHNldCB0aGUga2V5IQotICAgICAqLwotICAgIGlmIChtcHBlX2VuY19wb2xpY3kgJiYgbXBwZV9lbmNfa2V5cykgewotCW1wcGVfa2V5c19zZXQgPSAxOwotCS8qIFNldC9tb2RpZnkgYWxsb3dlZCBlbmNyeXB0aW9uIHR5cGVzLiAqLwotCWlmIChtcHBlX2VuY190eXBlcykKLQkgICAgc2V0X21wcGVfZW5jX3R5cGVzKG1wcGVfZW5jX3BvbGljeSwgbXBwZV9lbmNfdHlwZXMpOwotICAgIH0KLSNlbmRpZgotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBNUFBFCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAlRlVOQ1RJT046IHJhZGl1c19zZXRtcHBla2V5cwotKiAlQVJHVU1FTlRTOgotKiAgdnAgLS0gdmFsdWUgcGFpciBob2xkaW5nIE1TLUNIQVAtTVBQRS1LRVlTIGF0dHJpYnV0ZQotKiAgcmVxX2luZm8gLS0gcmFkaXVzIHJlcXVlc3QgaW5mb3JtYXRpb24gdXNlZCBmb3IgZW5jcnlwdGlvbgotKiAlUkVUVVJOUzoKLSogID49IDAgb24gc3VjY2VzczsgLTEgb24gZmFpbHVyZQotKiAlREVTQ1JJUFRJT046Ci0qICBEZWNyeXB0IHRoZSAia2V5IiBwcm92aWRlZCBieSB0aGUgUkFESVVTIHNlcnZlciBmb3IgTVBQRSBlbmNyeXB0aW9uLgotKiAgU2VlIFJGQyAyNTQ4LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50Ci1yYWRpdXNfc2V0bXBwZWtleXMoVkFMVUVfUEFJUiAqdnAsIFJFUVVFU1RfSU5GTyAqcmVxX2luZm8sCi0JCSAgIHVuc2lnbmVkIGNoYXIgKmNoYWxsZW5nZSkKLXsKLSAgICBpbnQgaTsKLSAgICBNRDVfQ1RYIENvbnRleHQ7Ci0gICAgdV9jaGFyICBwbGFpblszMl07Ci0gICAgdV9jaGFyICBidWZbMTZdOwotCi0gICAgaWYgKHZwLT5sdmFsdWUgIT0gMzIpIHsKLQllcnJvcigiUkFESVVTOiBJbmNvcnJlY3QgYXR0cmlidXRlIGxlbmd0aCAoJWQpIGZvciBNUy1DSEFQLU1QUEUtS2V5cyIsCi0JICAgICAgdnAtPmx2YWx1ZSk7Ci0JcmV0dXJuIC0xOwotICAgIH0KLQotICAgIG1lbWNweShwbGFpbiwgdnAtPnN0cnZhbHVlLCBzaXplb2YocGxhaW4pKTsKLQotICAgIE1ENV9Jbml0KCZDb250ZXh0KTsKLSAgICBNRDVfVXBkYXRlKCZDb250ZXh0LCByZXFfaW5mby0+c2VjcmV0LCBzdHJsZW4ocmVxX2luZm8tPnNlY3JldCkpOwotICAgIE1ENV9VcGRhdGUoJkNvbnRleHQsIHJlcV9pbmZvLT5yZXF1ZXN0X3ZlY3RvciwgQVVUSF9WRUNUT1JfTEVOKTsKLSAgICBNRDVfRmluYWwoYnVmLCAmQ29udGV4dCk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQlwbGFpbltpXSBePSBidWZbaV07Ci0KLSAgICBNRDVfSW5pdCgmQ29udGV4dCk7Ci0gICAgTUQ1X1VwZGF0ZSgmQ29udGV4dCwgcmVxX2luZm8tPnNlY3JldCwgc3RybGVuKHJlcV9pbmZvLT5zZWNyZXQpKTsKLSAgICBNRDVfVXBkYXRlKCZDb250ZXh0LCB2cC0+c3RydmFsdWUsIDE2KTsKLSAgICBNRDVfRmluYWwoYnVmLCAmQ29udGV4dCk7Ci0KLSAgICBmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKQotCXBsYWluW2kgKyAxNl0gXj0gYnVmW2ldOwotCi0gICAgLyoKLSAgICAgKiBBbm5veWluZy4gIFRoZSAia2V5IiByZXR1cm5lZCBpcyBqdXN0IHRoZSBOVFBhc3N3b3JkSGFzaEhhc2gsIHdoaWNoCi0gICAgICogdGhlIE5BUyAodXMpIGRvZXNuJ3QgbmVlZDsgd2Ugb25seSBuZWVkIHRoZSBzdGFydCBrZXkuICBTbyB3ZSBoYXZlCi0gICAgICogdG8gZ2VuZXJhdGUgdGhlIHN0YXJ0IGtleSwgc2lnaC4gIE5COiBXZSBkbyBub3Qgc3VwcG9ydCB0aGUgTE0tS2V5LgotICAgICAqLwotICAgIG1wcGVfc2V0X2tleXMoY2hhbGxlbmdlLCAmcGxhaW5bOF0pOwotCi0gICAgcmV0dXJuIDA7ICAgIAotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAlRlVOQ1RJT046IHJhZGl1c19zZXRtcHBla2V5czIKLSogJUFSR1VNRU5UUzoKLSogIHZwIC0tIHZhbHVlIHBhaXIgaG9sZGluZyBNUy1NUFBFLVNFTkQtS0VZIG9yIE1TLU1QUEUtUkVDVi1LRVkgYXR0cmlidXRlCi0qICByZXFfaW5mbyAtLSByYWRpdXMgcmVxdWVzdCBpbmZvcm1hdGlvbiB1c2VkIGZvciBlbmNyeXB0aW9uCi0qICVSRVRVUk5TOgotKiAgPj0gMCBvbiBzdWNjZXNzOyAtMSBvbiBmYWlsdXJlCi0qICVERVNDUklQVElPTjoKLSogIERlY3J5cHQgdGhlIGtleSBwcm92aWRlZCBieSB0aGUgUkFESVVTIHNlcnZlciBmb3IgTVBQRSBlbmNyeXB0aW9uLgotKiAgU2VlIFJGQyAyNTQ4LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50Ci1yYWRpdXNfc2V0bXBwZWtleXMyKFZBTFVFX1BBSVIgKnZwLCBSRVFVRVNUX0lORk8gKnJlcV9pbmZvKQotewotICAgIGludCBpOwotICAgIE1ENV9DVFggQ29udGV4dDsKLSAgICB1X2NoYXIgICpzYWx0ID0gdnAtPnN0cnZhbHVlOwotICAgIHVfY2hhciAgKmNyeXB0ID0gdnAtPnN0cnZhbHVlICsgMjsKLSAgICB1X2NoYXIgIHBsYWluWzMyXTsKLSAgICB1X2NoYXIgIGJ1ZltNRDVfSEFTSF9TSVpFXTsKLSAgICBjaGFyICAgICp0eXBlID0gIlNlbmQiOwotCi0gICAgaWYgKHZwLT5hdHRyaWJ1dGUgPT0gUFdfTVNfTVBQRV9SRUNWX0tFWSkKLQl0eXBlID0gIlJlY3YiOwotCi0gICAgaWYgKHZwLT5sdmFsdWUgIT0gMzQpIHsKLQllcnJvcigiUkFESVVTOiBJbmNvcnJlY3QgYXR0cmlidXRlIGxlbmd0aCAoJWQpIGZvciBNUy1NUFBFLSVzLUtleSIsCi0JICAgICAgdnAtPmx2YWx1ZSwgdHlwZSk7Ci0JcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGlmICgoc2FsdFswXSAmIDB4ODApID09IDApIHsKLQllcnJvcigiUkFESVVTOiBJbGxlZ2FsIHNhbHQgdmFsdWUgZm9yIE1TLU1QUEUtJXMtS2V5IGF0dHJpYnV0ZSIsIHR5cGUpOwotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBtZW1jcHkocGxhaW4sIGNyeXB0LCAzMik7Ci0KLSAgICBNRDVfSW5pdCgmQ29udGV4dCk7Ci0gICAgTUQ1X1VwZGF0ZSgmQ29udGV4dCwgcmVxX2luZm8tPnNlY3JldCwgc3RybGVuKHJlcV9pbmZvLT5zZWNyZXQpKTsKLSAgICBNRDVfVXBkYXRlKCZDb250ZXh0LCByZXFfaW5mby0+cmVxdWVzdF92ZWN0b3IsIEFVVEhfVkVDVE9SX0xFTik7Ci0gICAgTUQ1X1VwZGF0ZSgmQ29udGV4dCwgc2FsdCwgMik7Ci0gICAgTUQ1X0ZpbmFsKGJ1ZiwgJkNvbnRleHQpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JcGxhaW5baV0gXj0gYnVmW2ldOwotCi0gICAgaWYgKHBsYWluWzBdICE9IHNpemVvZihtcHBlX3NlbmRfa2V5KSAvKiAxNiAqLykgewotCWVycm9yKCJSQURJVVM6IEluY29ycmVjdCBrZXkgbGVuZ3RoICglZCkgZm9yIE1TLU1QUEUtJXMtS2V5IGF0dHJpYnV0ZSIsCi0JICAgICAgKGludCkgcGxhaW5bMF0sIHR5cGUpOwotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBNRDVfSW5pdCgmQ29udGV4dCk7Ci0gICAgTUQ1X1VwZGF0ZSgmQ29udGV4dCwgcmVxX2luZm8tPnNlY3JldCwgc3RybGVuKHJlcV9pbmZvLT5zZWNyZXQpKTsKLSAgICBNRDVfVXBkYXRlKCZDb250ZXh0LCBjcnlwdCwgMTYpOwotICAgIE1ENV9GaW5hbChidWYsICZDb250ZXh0KTsKLQotICAgIHBsYWluWzE2XSBePSBidWZbMF07IC8qIG9ubHkgbmVlZCB0aGUgZmlyc3QgYnl0ZSAqLwotCi0gICAgaWYgKHZwLT5hdHRyaWJ1dGUgPT0gUFdfTVNfTVBQRV9TRU5EX0tFWSkKLQltZW1jcHkobXBwZV9zZW5kX2tleSwgcGxhaW4gKyAxLCAxNik7Ci0gICAgZWxzZQotCW1lbWNweShtcHBlX3JlY3Zfa2V5LCBwbGFpbiArIDEsIDE2KTsKLQotICAgIHJldHVybiAwOwotfQotI2VuZGlmIC8qIE1QUEUgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogJUZVTkNUSU9OOiByYWRpdXNfYWNjdF9zdGFydAotKiAlQVJHVU1FTlRTOgotKiAgTm9uZQotKiAlUkVUVVJOUzoKLSogIE5vdGhpbmcKLSogJURFU0NSSVBUSU9OOgotKiAgU2VuZHMgYSAic3RhcnQiIGFjY291bnRpbmcgbWVzc2FnZSB0byB0aGUgUkFESVVTIHNlcnZlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLXJhZGl1c19hY2N0X3N0YXJ0KHZvaWQpCi17Ci0gICAgVUlOVDQgYXZfdHlwZTsKLSAgICBpbnQgcmVzdWx0OwotICAgIFZBTFVFX1BBSVIgKnNlbmQgPSBOVUxMOwotICAgIGlwY3Bfb3B0aW9ucyAqaG8gPSAmaXBjcF9oaXNvcHRpb25zWzBdOwotICAgIHVfaW50MzJfdCBoaXNhZGRyOwotCi0gICAgaWYgKCFyc3RhdGUuaW5pdGlhbGl6ZWQpIHsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgcnN0YXRlLnN0YXJ0X3RpbWUgPSB0aW1lKE5VTEwpOwotCi0gICAgc3RybmNweShyc3RhdGUuc2Vzc2lvbl9pZCwgcmNfbWtzaWQoKSwgc2l6ZW9mKHJzdGF0ZS5zZXNzaW9uX2lkKSk7Ci0KLSAgICByY19hdnBhaXJfYWRkKCZzZW5kLCBQV19BQ0NUX1NFU1NJT05fSUQsCi0JCSAgIHJzdGF0ZS5zZXNzaW9uX2lkLCAwLCBWRU5ET1JfTk9ORSk7Ci0gICAgcmNfYXZwYWlyX2FkZCgmc2VuZCwgUFdfVVNFUl9OQU1FLAotCQkgICByc3RhdGUudXNlciwgMCwgVkVORE9SX05PTkUpOwotCi0gICAgaWYgKHJzdGF0ZS5jbGFzc19sZW4gPiAwKQotCXJjX2F2cGFpcl9hZGQoJnNlbmQsIFBXX0NMQVNTLAotCQkgICAgICByc3RhdGUuY2xhc3MsIHJzdGF0ZS5jbGFzc19sZW4sIFZFTkRPUl9OT05FKTsKLQotICAgIGF2X3R5cGUgPSBQV19TVEFUVVNfU1RBUlQ7Ci0gICAgcmNfYXZwYWlyX2FkZCgmc2VuZCwgUFdfQUNDVF9TVEFUVVNfVFlQRSwgJmF2X3R5cGUsIDAsIFZFTkRPUl9OT05FKTsKLQotICAgIGF2X3R5cGUgPSBQV19GUkFNRUQ7Ci0gICAgcmNfYXZwYWlyX2FkZCgmc2VuZCwgUFdfU0VSVklDRV9UWVBFLCAmYXZfdHlwZSwgMCwgVkVORE9SX05PTkUpOwotCi0gICAgYXZfdHlwZSA9IFBXX1BQUDsKLSAgICByY19hdnBhaXJfYWRkKCZzZW5kLCBQV19GUkFNRURfUFJPVE9DT0wsICZhdl90eXBlLCAwLCBWRU5ET1JfTk9ORSk7Ci0KLSAgICBpZiAoKnJlbW90ZV9udW1iZXIpIHsKLQlyY19hdnBhaXJfYWRkKCZzZW5kLCBQV19DQUxMSU5HX1NUQVRJT05fSUQsCi0JCSAgICAgICByZW1vdGVfbnVtYmVyLCAwLCBWRU5ET1JfTk9ORSk7Ci0gICAgfSBlbHNlIGlmIChpcHBhcmFtKQotCXJjX2F2cGFpcl9hZGQoJnNlbmQsIFBXX0NBTExJTkdfU1RBVElPTl9JRCwgaXBwYXJhbSwgMCwgVkVORE9SX05PTkUpOwotCi0gICAgYXZfdHlwZSA9IFBXX1JBRElVUzsKLSAgICByY19hdnBhaXJfYWRkKCZzZW5kLCBQV19BQ0NUX0FVVEhFTlRJQywgJmF2X3R5cGUsIDAsIFZFTkRPUl9OT05FKTsKLQotCi0gICAgYXZfdHlwZSA9ICggdXNpbmdfcHR5ID8gUFdfVklSVFVBTCA6ICggc3luY19zZXJpYWwgPyBQV19TWU5DIDogUFdfQVNZTkMgKSApOwotICAgIHJjX2F2cGFpcl9hZGQoJnNlbmQsIFBXX05BU19QT1JUX1RZUEUsICZhdl90eXBlLCAwLCBWRU5ET1JfTk9ORSk7Ci0KLSAgICBoaXNhZGRyID0gaG8tPmhpc2FkZHI7Ci0gICAgYXZfdHlwZSA9IGh0b25sKGhpc2FkZHIpOwotICAgIHJjX2F2cGFpcl9hZGQoJnNlbmQsIFBXX0ZSQU1FRF9JUF9BRERSRVNTICwgJmF2X3R5cGUgLCAwLCBWRU5ET1JfTk9ORSk7Ci0KLSAgICAvKiBBZGQgdXNlciBzcGVjaWZpZWQgdnAncyAqLwotICAgIGlmIChyc3RhdGUuYXZwKQotCXJjX2F2cGFpcl9pbnNlcnQoJnNlbmQsIE5VTEwsIHJjX2F2cGFpcl9jb3B5KHJzdGF0ZS5hdnApKTsKLQotICAgIGlmIChyc3RhdGUuYWNjdHNlcnZlcikgewotCXJlc3VsdCA9IHJjX2FjY3RfdXNpbmdfc2VydmVyKHJzdGF0ZS5hY2N0c2VydmVyLAotCQkJCSAgICAgIHJzdGF0ZS5jbGllbnRfcG9ydCwgc2VuZCk7Ci0gICAgfSBlbHNlIHsKLQlyZXN1bHQgPSByY19hY2N0KHJzdGF0ZS5jbGllbnRfcG9ydCwgc2VuZCk7Ci0gICAgfQotCi0gICAgcmNfYXZwYWlyX2ZyZWUoc2VuZCk7Ci0KLSAgICBpZiAocmVzdWx0ICE9IE9LX1JDKSB7Ci0JLyogUkFESVVTIHNlcnZlciBjb3VsZCBiZSBkb3duIHNvIG1ha2UgdGhpcyBhIHdhcm5pbmcgKi8KLQlzeXNsb2coTE9HX1dBUk5JTkcsCi0JCSJBY2NvdW50aW5nIFNUQVJUIGZhaWxlZCBmb3IgJXMiLCByc3RhdGUudXNlcik7Ci0gICAgfSBlbHNlIHsKLQlyc3RhdGUuYWNjb3VudGluZ19zdGFydGVkID0gMTsKLQkvKiBLaWNrIG9mZiBwZXJpb2RpYyBhY2NvdW50aW5nIHJlcG9ydHMgKi8KLQlpZiAocnN0YXRlLmFjY3RfaW50ZXJpbV9pbnRlcnZhbCkgewotCSAgICBUSU1FT1VUKHJhZGl1c19hY2N0X2ludGVyaW0sIE5VTEwsIHJzdGF0ZS5hY2N0X2ludGVyaW1faW50ZXJ2YWwpOwotCX0KLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICVGVU5DVElPTjogcmFkaXVzX2FjY3Rfc3RvcAotKiAlQVJHVU1FTlRTOgotKiAgTm9uZQotKiAlUkVUVVJOUzoKLSogIE5vdGhpbmcKLSogJURFU0NSSVBUSU9OOgotKiAgU2VuZHMgYSAic3RvcCIgYWNjb3VudGluZyBtZXNzYWdlIHRvIHRoZSBSQURJVVMgc2VydmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotcmFkaXVzX2FjY3Rfc3RvcCh2b2lkKQotewotICAgIFVJTlQ0IGF2X3R5cGU7Ci0gICAgVkFMVUVfUEFJUiAqc2VuZCA9IE5VTEw7Ci0gICAgaXBjcF9vcHRpb25zICpobyA9ICZpcGNwX2hpc29wdGlvbnNbMF07Ci0gICAgdV9pbnQzMl90IGhpc2FkZHI7Ci0gICAgaW50IHJlc3VsdDsKLQotICAgIGlmICghcnN0YXRlLmluaXRpYWxpemVkKSB7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghcnN0YXRlLmFjY291bnRpbmdfc3RhcnRlZCkgewotCXJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocnN0YXRlLmFjY3RfaW50ZXJpbV9pbnRlcnZhbCkKLQlVTlRJTUVPVVQocmFkaXVzX2FjY3RfaW50ZXJpbSwgTlVMTCk7Ci0KLSAgICByc3RhdGUuYWNjb3VudGluZ19zdGFydGVkID0gMDsKLSAgICByY19hdnBhaXJfYWRkKCZzZW5kLCBQV19BQ0NUX1NFU1NJT05fSUQsIHJzdGF0ZS5zZXNzaW9uX2lkLAotCQkgICAwLCBWRU5ET1JfTk9ORSk7Ci0KLSAgICByY19hdnBhaXJfYWRkKCZzZW5kLCBQV19VU0VSX05BTUUsIHJzdGF0ZS51c2VyLCAwLCBWRU5ET1JfTk9ORSk7Ci0KLSAgICBhdl90eXBlID0gUFdfU1RBVFVTX1NUT1A7Ci0gICAgcmNfYXZwYWlyX2FkZCgmc2VuZCwgUFdfQUNDVF9TVEFUVVNfVFlQRSwgJmF2X3R5cGUsIDAsIFZFTkRPUl9OT05FKTsKLQotICAgIGF2X3R5cGUgPSBQV19GUkFNRUQ7Ci0gICAgcmNfYXZwYWlyX2FkZCgmc2VuZCwgUFdfU0VSVklDRV9UWVBFLCAmYXZfdHlwZSwgMCwgVkVORE9SX05PTkUpOwotCi0gICAgYXZfdHlwZSA9IFBXX1BQUDsKLSAgICByY19hdnBhaXJfYWRkKCZzZW5kLCBQV19GUkFNRURfUFJPVE9DT0wsICZhdl90eXBlLCAwLCBWRU5ET1JfTk9ORSk7Ci0KLSAgICBhdl90eXBlID0gUFdfUkFESVVTOwotICAgIHJjX2F2cGFpcl9hZGQoJnNlbmQsIFBXX0FDQ1RfQVVUSEVOVElDLCAmYXZfdHlwZSwgMCwgVkVORE9SX05PTkUpOwotCi0KLSAgICBpZiAobGlua19zdGF0c192YWxpZCkgewotCWF2X3R5cGUgPSBsaW5rX2Nvbm5lY3RfdGltZTsKLQlyY19hdnBhaXJfYWRkKCZzZW5kLCBQV19BQ0NUX1NFU1NJT05fVElNRSwgJmF2X3R5cGUsIDAsIFZFTkRPUl9OT05FKTsKLQotCWF2X3R5cGUgPSBsaW5rX3N0YXRzLmJ5dGVzX291dDsKLQlyY19hdnBhaXJfYWRkKCZzZW5kLCBQV19BQ0NUX09VVFBVVF9PQ1RFVFMsICZhdl90eXBlLCAwLCBWRU5ET1JfTk9ORSk7Ci0KLQlhdl90eXBlID0gbGlua19zdGF0cy5ieXRlc19pbjsKLQlyY19hdnBhaXJfYWRkKCZzZW5kLCBQV19BQ0NUX0lOUFVUX09DVEVUUywgJmF2X3R5cGUsIDAsIFZFTkRPUl9OT05FKTsKLQotCWF2X3R5cGUgPSBsaW5rX3N0YXRzLnBrdHNfb3V0OwotCXJjX2F2cGFpcl9hZGQoJnNlbmQsIFBXX0FDQ1RfT1VUUFVUX1BBQ0tFVFMsICZhdl90eXBlLCAwLCBWRU5ET1JfTk9ORSk7Ci0KLQlhdl90eXBlID0gbGlua19zdGF0cy5wa3RzX2luOwotCXJjX2F2cGFpcl9hZGQoJnNlbmQsIFBXX0FDQ1RfSU5QVVRfUEFDS0VUUywgJmF2X3R5cGUsIDAsIFZFTkRPUl9OT05FKTsKLSAgICB9Ci0KLSAgICBpZiAoKnJlbW90ZV9udW1iZXIpIHsKLQlyY19hdnBhaXJfYWRkKCZzZW5kLCBQV19DQUxMSU5HX1NUQVRJT05fSUQsCi0JCSAgICAgICByZW1vdGVfbnVtYmVyLCAwLCBWRU5ET1JfTk9ORSk7Ci0gICAgfSBlbHNlIGlmIChpcHBhcmFtKQotCXJjX2F2cGFpcl9hZGQoJnNlbmQsIFBXX0NBTExJTkdfU1RBVElPTl9JRCwgaXBwYXJhbSwgMCwgVkVORE9SX05PTkUpOwotCi0gICAgYXZfdHlwZSA9ICggdXNpbmdfcHR5ID8gUFdfVklSVFVBTCA6ICggc3luY19zZXJpYWwgPyBQV19TWU5DIDogUFdfQVNZTkMgKSApOwotICAgIHJjX2F2cGFpcl9hZGQoJnNlbmQsIFBXX05BU19QT1JUX1RZUEUsICZhdl90eXBlLCAwLCBWRU5ET1JfTk9ORSk7Ci0KLSAgICBhdl90eXBlID0gUFdfTkFTX0VSUk9SOwotICAgIHN3aXRjaCggc3RhdHVzICkgewotCWNhc2UgRVhJVF9PSzoKLQljYXNlIEVYSVRfVVNFUl9SRVFVRVNUOgotCSAgICBhdl90eXBlID0gUFdfVVNFUl9SRVFVRVNUOwotCSAgICBicmVhazsKLQotCWNhc2UgRVhJVF9IQU5HVVA6Ci0JY2FzZSBFWElUX1BFRVJfREVBRDoKLQljYXNlIEVYSVRfQ09OTkVDVF9GQUlMRUQ6Ci0JICAgIGF2X3R5cGUgPSBQV19MT1NUX0NBUlJJRVI7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBFWElUX0lOSVRfRkFJTEVEOgotCWNhc2UgRVhJVF9PUEVOX0ZBSUxFRDoKLQljYXNlIEVYSVRfTE9DS19GQUlMRUQ6Ci0JY2FzZSBFWElUX1BUWUNNRF9GQUlMRUQ6Ci0JICAgIGF2X3R5cGUgPSBQV19QT1JUX0VSUk9SOwotCSAgICBicmVhazsKLQotCWNhc2UgRVhJVF9QRUVSX0FVVEhfRkFJTEVEOgotCWNhc2UgRVhJVF9BVVRIX1RPUEVFUl9GQUlMRUQ6Ci0JY2FzZSBFWElUX05FR09USUFUSU9OX0ZBSUxFRDoKLQljYXNlIEVYSVRfQ05JRF9BVVRIX0ZBSUxFRDoKLQkgICAgYXZfdHlwZSA9IFBXX1NFUlZJQ0VfVU5BVkFJTEFCTEU7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBFWElUX0lETEVfVElNRU9VVDoKLQkgICAgYXZfdHlwZSA9IFBXX0FDQ1RfSURMRV9USU1FT1VUOwotCSAgICBicmVhazsKLQotCWNhc2UgRVhJVF9DQUxMQkFDSzoKLQkgICAgYXZfdHlwZSA9IFBXX0NBTExCQUNLOwotCSAgICBicmVhazsKLQkgICAgCi0JY2FzZSBFWElUX0NPTk5FQ1RfVElNRToKLQkgICAgYXZfdHlwZSA9IFBXX0FDQ1RfU0VTU0lPTl9USU1FT1VUOwotCSAgICBicmVhazsKLQkgICAgCi0jaWZkZWYgTUFYT0NURVRTCi0JY2FzZSBFWElUX1RSQUZGSUNfTElNSVQ6Ci0JICAgIGF2X3R5cGUgPSBQV19OQVNfUkVRVUVTVDsKLQkgICAgYnJlYWs7Ci0jZW5kaWYKLQotCWRlZmF1bHQ6Ci0JICAgIGF2X3R5cGUgPSBQV19OQVNfRVJST1I7Ci0JICAgIGJyZWFrOwotICAgIH0KLSAgICByY19hdnBhaXJfYWRkKCZzZW5kLCBQV19BQ0NUX1RFUk1JTkFURV9DQVVTRSwgJmF2X3R5cGUsIDAsIFZFTkRPUl9OT05FKTsKLQotICAgIGhpc2FkZHIgPSBoby0+aGlzYWRkcjsKLSAgICBhdl90eXBlID0gaHRvbmwoaGlzYWRkcik7Ci0gICAgcmNfYXZwYWlyX2FkZCgmc2VuZCwgUFdfRlJBTUVEX0lQX0FERFJFU1MgLCAmYXZfdHlwZSAsIDAsIFZFTkRPUl9OT05FKTsKLQotICAgIC8qIEFkZCB1c2VyIHNwZWNpZmllZCB2cCdzICovCi0gICAgaWYgKHJzdGF0ZS5hdnApCi0JcmNfYXZwYWlyX2luc2VydCgmc2VuZCwgTlVMTCwgcmNfYXZwYWlyX2NvcHkocnN0YXRlLmF2cCkpOwotCi0gICAgaWYgKHJzdGF0ZS5hY2N0c2VydmVyKSB7Ci0JcmVzdWx0ID0gcmNfYWNjdF91c2luZ19zZXJ2ZXIocnN0YXRlLmFjY3RzZXJ2ZXIsCi0JCQkJICAgICAgcnN0YXRlLmNsaWVudF9wb3J0LCBzZW5kKTsKLSAgICB9IGVsc2UgewotCXJlc3VsdCA9IHJjX2FjY3QocnN0YXRlLmNsaWVudF9wb3J0LCBzZW5kKTsKLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0ICE9IE9LX1JDKSB7Ci0JLyogUkFESVVTIHNlcnZlciBjb3VsZCBiZSBkb3duIHNvIG1ha2UgdGhpcyBhIHdhcm5pbmcgKi8KLQlzeXNsb2coTE9HX1dBUk5JTkcsCi0JCSJBY2NvdW50aW5nIFNUT1AgZmFpbGVkIGZvciAlcyIsIHJzdGF0ZS51c2VyKTsKLSAgICB9Ci0gICAgcmNfYXZwYWlyX2ZyZWUoc2VuZCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICVGVU5DVElPTjogcmFkaXVzX2FjY3RfaW50ZXJpbQotKiAlQVJHVU1FTlRTOgotKiAgTm9uZQotKiAlUkVUVVJOUzoKLSogIE5vdGhpbmcKLSogJURFU0NSSVBUSU9OOgotKiAgU2VuZHMgYW4gaW50ZXJpbSBhY2NvdW50aW5nIG1lc3NhZ2UgdG8gdGhlIFJBRElVUyBzZXJ2ZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLXJhZGl1c19hY2N0X2ludGVyaW0odm9pZCAqaWdub3JlZCkKLXsKLSAgICBVSU5UNCBhdl90eXBlOwotICAgIFZBTFVFX1BBSVIgKnNlbmQgPSBOVUxMOwotICAgIGlwY3Bfb3B0aW9ucyAqaG8gPSAmaXBjcF9oaXNvcHRpb25zWzBdOwotICAgIHVfaW50MzJfdCBoaXNhZGRyOwotICAgIGludCByZXN1bHQ7Ci0KLSAgICBpZiAoIXJzdGF0ZS5pbml0aWFsaXplZCkgewotCXJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIXJzdGF0ZS5hY2NvdW50aW5nX3N0YXJ0ZWQpIHsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgcmNfYXZwYWlyX2FkZCgmc2VuZCwgUFdfQUNDVF9TRVNTSU9OX0lELCByc3RhdGUuc2Vzc2lvbl9pZCwKLQkJICAgMCwgVkVORE9SX05PTkUpOwotCi0gICAgcmNfYXZwYWlyX2FkZCgmc2VuZCwgUFdfVVNFUl9OQU1FLCByc3RhdGUudXNlciwgMCwgVkVORE9SX05PTkUpOwotCi0gICAgYXZfdHlwZSA9IFBXX1NUQVRVU19BTElWRTsKLSAgICByY19hdnBhaXJfYWRkKCZzZW5kLCBQV19BQ0NUX1NUQVRVU19UWVBFLCAmYXZfdHlwZSwgMCwgVkVORE9SX05PTkUpOwotCi0gICAgYXZfdHlwZSA9IFBXX0ZSQU1FRDsKLSAgICByY19hdnBhaXJfYWRkKCZzZW5kLCBQV19TRVJWSUNFX1RZUEUsICZhdl90eXBlLCAwLCBWRU5ET1JfTk9ORSk7Ci0KLSAgICBhdl90eXBlID0gUFdfUFBQOwotICAgIHJjX2F2cGFpcl9hZGQoJnNlbmQsIFBXX0ZSQU1FRF9QUk9UT0NPTCwgJmF2X3R5cGUsIDAsIFZFTkRPUl9OT05FKTsKLQotICAgIGF2X3R5cGUgPSBQV19SQURJVVM7Ci0gICAgcmNfYXZwYWlyX2FkZCgmc2VuZCwgUFdfQUNDVF9BVVRIRU5USUMsICZhdl90eXBlLCAwLCBWRU5ET1JfTk9ORSk7Ci0KLSAgICAvKiBVcGRhdGUgbGluayBzdGF0cyAqLwotICAgIHVwZGF0ZV9saW5rX3N0YXRzKDApOwotCi0gICAgaWYgKGxpbmtfc3RhdHNfdmFsaWQpIHsKLQlsaW5rX3N0YXRzX3ZhbGlkID0gMDsgLyogRm9yY2UgbGF0ZXIgY29kZSB0byB1cGRhdGUgKi8KLQotCWF2X3R5cGUgPSBsaW5rX2Nvbm5lY3RfdGltZTsKLQlyY19hdnBhaXJfYWRkKCZzZW5kLCBQV19BQ0NUX1NFU1NJT05fVElNRSwgJmF2X3R5cGUsIDAsIFZFTkRPUl9OT05FKTsKLQotCWF2X3R5cGUgPSBsaW5rX3N0YXRzLmJ5dGVzX291dDsKLQlyY19hdnBhaXJfYWRkKCZzZW5kLCBQV19BQ0NUX09VVFBVVF9PQ1RFVFMsICZhdl90eXBlLCAwLCBWRU5ET1JfTk9ORSk7Ci0KLQlhdl90eXBlID0gbGlua19zdGF0cy5ieXRlc19pbjsKLQlyY19hdnBhaXJfYWRkKCZzZW5kLCBQV19BQ0NUX0lOUFVUX09DVEVUUywgJmF2X3R5cGUsIDAsIFZFTkRPUl9OT05FKTsKLQotCWF2X3R5cGUgPSBsaW5rX3N0YXRzLnBrdHNfb3V0OwotCXJjX2F2cGFpcl9hZGQoJnNlbmQsIFBXX0FDQ1RfT1VUUFVUX1BBQ0tFVFMsICZhdl90eXBlLCAwLCBWRU5ET1JfTk9ORSk7Ci0KLQlhdl90eXBlID0gbGlua19zdGF0cy5wa3RzX2luOwotCXJjX2F2cGFpcl9hZGQoJnNlbmQsIFBXX0FDQ1RfSU5QVVRfUEFDS0VUUywgJmF2X3R5cGUsIDAsIFZFTkRPUl9OT05FKTsKLSAgICB9Ci0KLSAgICBpZiAoKnJlbW90ZV9udW1iZXIpIHsKLQlyY19hdnBhaXJfYWRkKCZzZW5kLCBQV19DQUxMSU5HX1NUQVRJT05fSUQsCi0JCSAgICAgICByZW1vdGVfbnVtYmVyLCAwLCBWRU5ET1JfTk9ORSk7Ci0gICAgfSBlbHNlIGlmIChpcHBhcmFtKQotCXJjX2F2cGFpcl9hZGQoJnNlbmQsIFBXX0NBTExJTkdfU1RBVElPTl9JRCwgaXBwYXJhbSwgMCwgVkVORE9SX05PTkUpOwotCi0gICAgYXZfdHlwZSA9ICggdXNpbmdfcHR5ID8gUFdfVklSVFVBTCA6ICggc3luY19zZXJpYWwgPyBQV19TWU5DIDogUFdfQVNZTkMgKSApOwotICAgIHJjX2F2cGFpcl9hZGQoJnNlbmQsIFBXX05BU19QT1JUX1RZUEUsICZhdl90eXBlLCAwLCBWRU5ET1JfTk9ORSk7Ci0KLSAgICBoaXNhZGRyID0gaG8tPmhpc2FkZHI7Ci0gICAgYXZfdHlwZSA9IGh0b25sKGhpc2FkZHIpOwotICAgIHJjX2F2cGFpcl9hZGQoJnNlbmQsIFBXX0ZSQU1FRF9JUF9BRERSRVNTICwgJmF2X3R5cGUgLCAwLCBWRU5ET1JfTk9ORSk7Ci0KLSAgICAvKiBBZGQgdXNlciBzcGVjaWZpZWQgdnAncyAqLwotICAgIGlmIChyc3RhdGUuYXZwKQotCXJjX2F2cGFpcl9pbnNlcnQoJnNlbmQsIE5VTEwsIHJjX2F2cGFpcl9jb3B5KHJzdGF0ZS5hdnApKTsKLQotICAgIGlmIChyc3RhdGUuYWNjdHNlcnZlcikgewotCXJlc3VsdCA9IHJjX2FjY3RfdXNpbmdfc2VydmVyKHJzdGF0ZS5hY2N0c2VydmVyLAotCQkJCSAgICAgIHJzdGF0ZS5jbGllbnRfcG9ydCwgc2VuZCk7Ci0gICAgfSBlbHNlIHsKLQlyZXN1bHQgPSByY19hY2N0KHJzdGF0ZS5jbGllbnRfcG9ydCwgc2VuZCk7Ci0gICAgfQotCi0gICAgaWYgKHJlc3VsdCAhPSBPS19SQykgewotCS8qIFJBRElVUyBzZXJ2ZXIgY291bGQgYmUgZG93biBzbyBtYWtlIHRoaXMgYSB3YXJuaW5nICovCi0Jc3lzbG9nKExPR19XQVJOSU5HLAotCQkiSW50ZXJpbSBhY2NvdW50aW5nIGZhaWxlZCBmb3IgJXMiLCByc3RhdGUudXNlcik7Ci0gICAgfQotICAgIHJjX2F2cGFpcl9mcmVlKHNlbmQpOwotCi0gICAgLyogU2NoZWR1bGUgYW5vdGhlciBvbmUgKi8KLSAgICBUSU1FT1VUKHJhZGl1c19hY2N0X2ludGVyaW0sIE5VTEwsIHJzdGF0ZS5hY2N0X2ludGVyaW1faW50ZXJ2YWwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAlRlVOQ1RJT046IHJhZGl1c19pcF91cAotKiAlQVJHVU1FTlRTOgotKiAgb3BhcXVlIC0tIGlnbm9yZWQKLSogIGFyZyAtLSBpZ25vcmVkCi0qICVSRVRVUk5TOgotKiAgTm90aGluZwotKiAlREVTQ1JJUFRJT046Ci0qICBDYWxsZWQgd2hlbiBJUENQIGlzIHVwLiAgV2UnbGwgZG8gYSBzdGFydC1hY2NvdW50aW5nIHJlY29yZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLXJhZGl1c19pcF91cCh2b2lkICpvcGFxdWUsIGludCBhcmcpCi17Ci0gICAgcmFkaXVzX2FjY3Rfc3RhcnQoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogJUZVTkNUSU9OOiByYWRpdXNfaXBfZG93bgotKiAlQVJHVU1FTlRTOgotKiAgb3BhcXVlIC0tIGlnbm9yZWQKLSogIGFyZyAtLSBpZ25vcmVkCi0qICVSRVRVUk5TOgotKiAgTm90aGluZwotKiAlREVTQ1JJUFRJT046Ci0qICBDYWxsZWQgd2hlbiBJUENQIGlzIGRvd24uICBXZSdsbCBkbyBhIHN0b3AtYWNjb3VudGluZyByZWNvcmQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1yYWRpdXNfaXBfZG93bih2b2lkICpvcGFxdWUsIGludCBhcmcpCi17Ci0gICAgcmFkaXVzX2FjY3Rfc3RvcCgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAlRlVOQ1RJT046IHJhZGl1c19pbml0Ci0qICVBUkdVTUVOVFM6Ci0qICBtc2cgLS0gYnVmZmVyIG9mIHNpemUgQlVGX0xFTiBmb3IgZXJyb3IgbWVzc2FnZQotKiAlUkVUVVJOUzoKLSogIG5lZ2F0aXZlIG9uIGZhaWx1cmU7IG5vbi1uZWdhdGl2ZSBvbiBzdWNjZXNzCi0qICVERVNDUklQVElPTjoKLSogIEluaXRpYWxpemVzIHJhZGl1c2NsaWVudCBsaWJyYXJ5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQKLXJhZGl1c19pbml0KGNoYXIgKm1zZykKLXsKLSAgICBpZiAocnN0YXRlLmluaXRpYWxpemVkKSB7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKGNvbmZpZ19maWxlICYmICpjb25maWdfZmlsZSkgewotCXN0cmxjcHkocnN0YXRlLmNvbmZpZ19maWxlLCBjb25maWdfZmlsZSwgTUFYUEFUSExFTi0xKTsKLSAgICB9Ci0KLSAgICByc3RhdGUuaW5pdGlhbGl6ZWQgPSAxOwotCi0gICAgaWYgKHJjX3JlYWRfY29uZmlnKHJzdGF0ZS5jb25maWdfZmlsZSkgIT0gMCkgewotCXNscHJpbnRmKG1zZywgQlVGX0xFTiwgIlJBRElVUzogQ2FuJ3QgcmVhZCBjb25maWcgZmlsZSAlcyIsCi0JCSByc3RhdGUuY29uZmlnX2ZpbGUpOwotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpZiAocmNfcmVhZF9kaWN0aW9uYXJ5KHJjX2NvbmZfc3RyKCJkaWN0aW9uYXJ5IikpICE9IDApIHsKLQlzbHByaW50Zihtc2csIEJVRl9MRU4sICJSQURJVVM6IENhbid0IHJlYWQgZGljdGlvbmFyeSBmaWxlICVzIiwKLQkJIHJjX2NvbmZfc3RyKCJkaWN0aW9uYXJ5IikpOwotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpZiAocmNfcmVhZF9tYXBmaWxlKHJjX2NvbmZfc3RyKCJtYXBmaWxlIikpICE9IDApCXsKLQlzbHByaW50Zihtc2csIEJVRl9MRU4sICJSQURJVVM6IENhbid0IHJlYWQgbWFwIGZpbGUgJXMiLAotCQkgcmNfY29uZl9zdHIoIm1hcGZpbGUiKSk7Ci0JcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIEFkZCBhdiBwYWlycyBzYXZlZCBkdXJpbmcgb3B0aW9uIHBhcnNpbmcgKi8KLSAgICB3aGlsZSAoYXZwb3B0KSB7Ci0Jc3RydWN0IGF2cG9wdCAqbiA9IGF2cG9wdC0+bmV4dDsKLQotCXJjX2F2cGFpcl9wYXJzZShhdnBvcHQtPnZwc3RyLCAmcnN0YXRlLmF2cCk7Ci0JZnJlZShhdnBvcHQtPnZwc3RyKTsKLQlmcmVlKGF2cG9wdCk7Ci0JYXZwb3B0ID0gbjsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICVGVU5DVElPTjogZ2V0X2NsaWVudF9wb3J0Ci0qICVBUkdVTUVOVFM6Ci0qICBpZm5hbWUgLS0gUFBQIGludGVyZmFjZSBuYW1lIChlLmcuICJwcHA3IikKLSogJVJFVFVSTlM6Ci0qICBUaGUgTkFTIHBvcnQgbnVtYmVyIChlLmcuIDcpCi0qICVERVNDUklQVElPTjoKLSogIEV4dHJhY3RzIHRoZSBwb3J0IG51bWJlciBmcm9tIHRoZSBpbnRlcmZhY2UgbmFtZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50Ci1nZXRfY2xpZW50X3BvcnQoY2hhciAqaWZuYW1lKQotewotICAgIGludCBwb3J0OwotICAgIGlmIChzc2NhbmYoaWZuYW1lLCAicHBwJWQiLCAmcG9ydCkgPT0gMSkgewotCXJldHVybiBwb3J0OwotICAgIH0KLSAgICByZXR1cm4gcmNfbWFwMmlkKGlmbmFtZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICVGVU5DVElPTjogcmFkaXVzX2FsbG93ZWRfYWRkcmVzcwotKiAlQVJHVU1FTlRTOgotKiAgYWRkciAtLSBJUCBhZGRyZXNzCi0qICVSRVRVUk5TOgotKiAgMSBpZiB3ZSdyZSBhbGxvd2VkIHRvIHVzZSB0aGF0IElQIGFkZHJlc3M7IDAgaWYgbm90OyAtMSBpZiB3ZSBkbwotKiAgbm90IGtub3cuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQKLXJhZGl1c19hbGxvd2VkX2FkZHJlc3ModV9pbnQzMl90IGFkZHIpCi17Ci0gICAgaXBjcF9vcHRpb25zICp3byA9ICZpcGNwX3dhbnRvcHRpb25zWzBdOwotCi0gICAgaWYgKCFyc3RhdGUuY2hvb3NlX2lwKSB7Ci0JLyogSWYgUkFESVVTIHNlcnZlciBzYWlkIGFueSBhZGRyZXNzIGlzIE9LLCB0aGVuIGZpbmUuLi4gKi8KLQlpZiAocnN0YXRlLmFueV9pcF9hZGRyX29rKSB7Ci0JICAgIHJldHVybiAxOwotCX0KLQotCS8qIFNpZ2guLi4gaWYgYW4gYWRkcmVzcyB3YXMgc3VwcGxpZWQgZm9yIHJlbW90ZSBob3N0IGluIHBwcGQKLQkgICBvcHRpb25zLCBpdCBoYXMgdG8gbWF0Y2ggdGhhdC4gICovCi0JaWYgKHdvLT5oaXNhZGRyICE9IDAgJiYgd28tPmhpc2FkZHIgPT0gYWRkcikgewotCSAgICByZXR1cm4gMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGFkZHIgPT0gcnN0YXRlLmlwX2FkZHIpIHJldHVybiAxOwotICAgIHJldHVybiAwOwotfQotCi0vKiBVc2VmdWwgZm9yIG90aGVyIHBsdWdpbnMgKi8KLWNoYXIgKnJhZGl1c19sb2dnZWRfaW5fdXNlcih2b2lkKQotewotICAgIHJldHVybiByc3RhdGUudXNlcjsKLX0KZGlmZiAtLWdpdCBhL3BwcGQvcGx1Z2lucy9yYWRpdXMvcmFkaXVzY2xpZW50LmggYi9wcHBkL3BsdWdpbnMvcmFkaXVzL3JhZGl1c2NsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWI5NTlhLi4wMDAwMDAwCi0tLSBhL3BwcGQvcGx1Z2lucy9yYWRpdXMvcmFkaXVzY2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotLyoKLSAqICRJZDogcmFkaXVzY2xpZW50LmgsdiAxLjEgMjAwNC8xMS8xNCAwNzoyNjoyNiBwYXVsdXMgRXhwICQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUsMTk5NiwxOTk3LDE5OTggTGFycyBGZW5uZWJlcmcKLSAqCi0gKiBDb3B5cmlnaHQgMTk5MiBMaXZpbmdzdG9uIEVudGVycHJpc2VzLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IDE5OTIsMTk5MywgMTk5NCwxOTk1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuCi0gKiBhbmQgTWVyaXQgTmV0d29yaywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkCi0gKgotICogU2VlIHRoZSBmaWxlIENPUFlSSUdIVCBmb3IgdGhlIHJlc3BlY3RpdmUgdGVybXMgYW5kIGNvbmRpdGlvbnMuCi0gKiBJZiB0aGUgZmlsZSBpcyBtaXNzaW5nIGNvbnRhY3QgbWUgYXQgbGZAZWxlbWVudGFsLm5ldAotICogYW5kIEknbGwgc2VuZCB5b3UgYSBjb3B5LgotICoKLSAqLwotCi0jaWZuZGVmIFJBRElVU0NMSUVOVF9ICi0jZGVmaW5lIFJBRElVU0NMSUVOVF9ICi0KLSNpbmNsdWRlCTxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlCTxzdGRpby5oPgotI2luY2x1ZGUJPHRpbWUuaD4KLSNpbmNsdWRlICJwcHBkLmgiCi0KLSNpZm5kZWYgX1VJTlQ0X1QKLS8qIFRoaXMgd29ya3MgZm9yIGFsbCBtYWNoaW5lcyB0aGF0IExpbnV4IHJ1bnMgb24uLi4gKi8KLXR5cGVkZWYgdW5zaWduZWQgaW50IFVJTlQ0OwotdHlwZWRlZiBpbnQgICAgICAgICAgSU5UNDsKLSNlbmRpZgotCi0jZGVmaW5lIEFVVEhfVkVDVE9SX0xFTgkJMTYKLSNkZWZpbmUgQVVUSF9QQVNTX0xFTgkJKDMgKiAxNikgLyogbXVsdGlwbGUgb2YgMTYgKi8KLSNkZWZpbmUgQVVUSF9JRF9MRU4JCTY0Ci0jZGVmaW5lIEFVVEhfU1RSSU5HX0xFTgkJMTI4CSAvKiBtYXhpbXVtIG9mIDI1MyAqLwotCi0jZGVmaW5lCUJVRkZFUl9MRU4JCTgxOTIKLQotI2RlZmluZSBOQU1FX0xFTkdUSAkJMzIKLSNkZWZpbmUJR0VUU1RSX0xFTkdUSAkJMTI4CS8qIG11c3QgYmUgYmlnZ2VyIHRoYW4gQVVUSF9QQVNTX0xFTiAqLwotCi0vKiBjb2RlcyBmb3IgcmFkaXVzX2J1aWxkcmVxLCByYWRpdXNfZ2V0cG9ydCwgZXRjLiAqLwotI2RlZmluZSBBVVRICQkJMAotI2RlZmluZSBBQ0NUCQkJMQotCi0vKiBkZWZpbmVzIGZvciBjb25maWcuYyAqLwotCi0jZGVmaW5lIFNFUlZFUl9NQVggOAotCi0jZGVmaW5lIEFVVEhfTE9DQUxfRlNUCSgxPDwwKQotI2RlZmluZSBBVVRIX1JBRElVU19GU1QgKDE8PDEpCi0jZGVmaW5lIEFVVEhfTE9DQUxfU05EICAoMTw8MikKLSNkZWZpbmUgQVVUSF9SQURJVVNfU05EICgxPDwzKQotCi10eXBlZGVmIHN0cnVjdCBzZXJ2ZXIgewotCWludCBtYXg7Ci0JY2hhciAqbmFtZVtTRVJWRVJfTUFYXTsKLQl1bnNpZ25lZCBzaG9ydCBwb3J0W1NFUlZFUl9NQVhdOwotfSBTRVJWRVI7Ci0KLXR5cGVkZWYgc3RydWN0IHB3X2F1dGhfaGRyCi17Ci0JdV9jaGFyICAgICAgICAgIGNvZGU7Ci0JdV9jaGFyICAgICAgICAgIGlkOwotCXVfc2hvcnQgICAgICAgICBsZW5ndGg7Ci0JdV9jaGFyICAgICAgICAgIHZlY3RvcltBVVRIX1ZFQ1RPUl9MRU5dOwotCXVfY2hhciAgICAgICAgICBkYXRhWzJdOwotfSBBVVRIX0hEUjsKLQotI2RlZmluZSBBVVRIX0hEUl9MRU4JCQkyMAotI2RlZmluZSBNQVhfU0VDUkVUX0xFTkdUSAkJKDMgKiAxNikgLyogTVVTVCBiZSBtdWx0aXBsZSBvZiAxNiAqLwotI2RlZmluZSBDSEFQX1ZBTFVFX0xFTkdUSAkJMTYKLQotI2RlZmluZSBQV19BVVRIX1VEUF9QT1JUCQkxODEyCi0jZGVmaW5lIFBXX0FDQ1RfVURQX1BPUlQJCTE4MTMKLQotI2RlZmluZSBQV19UWVBFX1NUUklORwkJCTAKLSNkZWZpbmUgUFdfVFlQRV9JTlRFR0VSCQkJMQotI2RlZmluZSBQV19UWVBFX0lQQUREUgkJCTIKLSNkZWZpbmUgUFdfVFlQRV9EQVRFCQkJMwotCi0vKiBzdGFuZGFyZCBSQURJVVMgY29kZXMgKi8KLQotI2RlZmluZQlQV19BQ0NFU1NfUkVRVUVTVAkJMQotI2RlZmluZQlQV19BQ0NFU1NfQUNDRVBUCQkyCi0jZGVmaW5lCVBXX0FDQ0VTU19SRUpFQ1QJCTMKLSNkZWZpbmUJUFdfQUNDT1VOVElOR19SRVFVRVNUCQk0Ci0jZGVmaW5lCVBXX0FDQ09VTlRJTkdfUkVTUE9OU0UJCTUKLSNkZWZpbmUJUFdfQUNDT1VOVElOR19TVEFUVVMJCTYKLSNkZWZpbmUJUFdfUEFTU1dPUkRfUkVRVUVTVAkJNwotI2RlZmluZQlQV19QQVNTV09SRF9BQ0sJCQk4Ci0jZGVmaW5lCVBXX1BBU1NXT1JEX1JFSkVDVAkJOQotI2RlZmluZQlQV19BQ0NPVU5USU5HX01FU1NBR0UJCTEwCi0jZGVmaW5lCVBXX0FDQ0VTU19DSEFMTEVOR0UJCTExCi0jZGVmaW5lCVBXX1NUQVRVU19TRVJWRVIJCTEyCi0jZGVmaW5lCVBXX1NUQVRVU19DTElFTlQJCTEzCi0KLQotLyogc3RhbmRhcmQgUkFESVVTIGF0dHJpYnV0ZS12YWx1ZSBwYWlycyAqLwotCi0jZGVmaW5lCVBXX1VTRVJfTkFNRQkJCTEJLyogc3RyaW5nICovCi0jZGVmaW5lCVBXX1VTRVJfUEFTU1dPUkQJCTIJLyogc3RyaW5nICovCi0jZGVmaW5lCVBXX0NIQVBfUEFTU1dPUkQJCTMJLyogc3RyaW5nICovCi0jZGVmaW5lCVBXX05BU19JUF9BRERSRVNTCQk0CS8qIGlwYWRkciAqLwotI2RlZmluZQlQV19OQVNfUE9SVAkJCTUJLyogaW50ZWdlciAqLwotI2RlZmluZQlQV19TRVJWSUNFX1RZUEUJCQk2CS8qIGludGVnZXIgKi8KLSNkZWZpbmUJUFdfRlJBTUVEX1BST1RPQ09MCQk3CS8qIGludGVnZXIgKi8KLSNkZWZpbmUJUFdfRlJBTUVEX0lQX0FERFJFU1MJCTgJLyogaXBhZGRyICovCi0jZGVmaW5lCVBXX0ZSQU1FRF9JUF9ORVRNQVNLCQk5CS8qIGlwYWRkciAqLwotI2RlZmluZQlQV19GUkFNRURfUk9VVElORwkJMTAJLyogaW50ZWdlciAqLwotI2RlZmluZQlQV19GSUxURVJfSUQJCSAgICAgICAgMTEJLyogc3RyaW5nICovCi0jZGVmaW5lCVBXX0ZSQU1FRF9NVFUJCQkxMgkvKiBpbnRlZ2VyICovCi0jZGVmaW5lCVBXX0ZSQU1FRF9DT01QUkVTU0lPTgkJMTMJLyogaW50ZWdlciAqLwotI2RlZmluZQlQV19MT0dJTl9JUF9IT1NUCQkxNAkvKiBpcGFkZHIgKi8KLSNkZWZpbmUJUFdfTE9HSU5fU0VSVklDRQkJMTUJLyogaW50ZWdlciAqLwotI2RlZmluZQlQV19MT0dJTl9QT1JUCQkJMTYJLyogaW50ZWdlciAqLwotI2RlZmluZQlQV19PTERfUEFTU1dPUkQJCQkxNwkvKiBzdHJpbmcgKi8gLyogZGVwcmVjYXRlZCAqLwotI2RlZmluZQlQV19SRVBMWV9NRVNTQUdFCQkxOAkvKiBzdHJpbmcgKi8KLSNkZWZpbmUJUFdfTE9HSU5fQ0FMTEJBQ0tfTlVNQkVSCTE5CS8qIHN0cmluZyAqLwotI2RlZmluZQlQV19GUkFNRURfQ0FMTEJBQ0tfSUQJCTIwCS8qIHN0cmluZyAqLwotI2RlZmluZQlQV19FWFBJUkFUSU9OCQkJMjEJLyogZGF0ZSAqLyAvKiBkZXByZWNhdGVkICovCi0jZGVmaW5lCVBXX0ZSQU1FRF9ST1VURQkJCTIyCS8qIHN0cmluZyAqLwotI2RlZmluZQlQV19GUkFNRURfSVBYX05FVFdPUksJCTIzCS8qIGludGVnZXIgKi8KLSNkZWZpbmUJUFdfU1RBVEUJCQkyNAkvKiBzdHJpbmcgKi8KLSNkZWZpbmUJUFdfQ0xBU1MJCQkyNQkvKiBzdHJpbmcgKi8KLSNkZWZpbmUJUFdfVkVORE9SX1NQRUNJRklDCQkyNgkvKiBzdHJpbmcgKi8KLSNkZWZpbmUJUFdfU0VTU0lPTl9USU1FT1VUCQkyNwkvKiBpbnRlZ2VyICovCi0jZGVmaW5lCVBXX0lETEVfVElNRU9VVAkJCTI4CS8qIGludGVnZXIgKi8KLSNkZWZpbmUJUFdfVEVSTUlOQVRJT05fQUNUSU9OCQkyOQkvKiBpbnRlZ2VyICovCi0jZGVmaW5lCVBXX0NBTExFRF9TVEFUSU9OX0lEICAgICAgICAgICAgMzAgICAgICAvKiBzdHJpbmcgKi8KLSNkZWZpbmUJUFdfQ0FMTElOR19TVEFUSU9OX0lEICAgICAgICAgICAzMSAgICAgIC8qIHN0cmluZyAqLwotI2RlZmluZQlQV19OQVNfSURFTlRJRklFUgkJMzIJLyogc3RyaW5nICovCi0jZGVmaW5lCVBXX1BST1hZX1NUQVRFCQkJMzMJLyogc3RyaW5nICovCi0jZGVmaW5lCVBXX0xPR0lOX0xBVF9TRVJWSUNFCQkzNAkvKiBzdHJpbmcgKi8KLSNkZWZpbmUJUFdfTE9HSU5fTEFUX05PREUJCTM1CS8qIHN0cmluZyAqLwotI2RlZmluZQlQV19MT0dJTl9MQVRfR1JPVVAJCTM2CS8qIHN0cmluZyAqLwotI2RlZmluZQlQV19GUkFNRURfQVBQTEVUQUxLX0xJTksJMzcJLyogaW50ZWdlciAqLwotI2RlZmluZQlQV19GUkFNRURfQVBQTEVUQUxLX05FVFdPUksJMzgJLyogaW50ZWdlciAqLwotI2RlZmluZQlQV19GUkFNRURfQVBQTEVUQUxLX1pPTkUJMzkJLyogc3RyaW5nICovCi0jZGVmaW5lCVBXX0NIQVBfQ0hBTExFTkdFICAgICAgICAgICAgICAgNjAgICAgICAvKiBzdHJpbmcgKi8KLSNkZWZpbmUJUFdfTkFTX1BPUlRfVFlQRSAgICAgICAgICAgICAgICA2MSAgICAgIC8qIGludGVnZXIgKi8KLSNkZWZpbmUJUFdfUE9SVF9MSU1JVCAgICAgICAgICAgICAgICAgICA2MiAgICAgIC8qIGludGVnZXIgKi8KLSNkZWZpbmUgUFdfTE9HSU5fTEFUX1BPUlQgICAgICAgICAgICAgICA2MyAgICAgIC8qIHN0cmluZyAqLwotCi0vKiBWZW5kb3IgUkFESVVTIGF0dHJpYnV0ZS12YWx1ZSBwYWlycyAqLwotI2RlZmluZSBQV19NU19DSEFQX0NIQUxMRU5HRQkJMTEJLyogc3RyaW5nICovCi0jZGVmaW5lIFBXX01TX0NIQVBfUkVTUE9OU0UJCTEJLyogc3RyaW5nICovCi0jZGVmaW5lIFBXX01TX0NIQVAyX1JFU1BPTlNFCQkyNQkvKiBzdHJpbmcgKi8KLSNkZWZpbmUgUFdfTVNfQ0hBUDJfU1VDQ0VTUwkJMjYJLyogc3RyaW5nICovCi0jZGVmaW5lIFBXX01TX01QUEVfRU5DUllQVElPTl9QT0xJQ1kJNwkvKiBzdHJpbmcgKi8KLSNkZWZpbmUgUFdfTVNfTVBQRV9FTkNSWVBUSU9OX1RZUEUJOAkvKiBzdHJpbmcgKi8KLSNkZWZpbmUgUFdfTVNfTVBQRV9FTkNSWVBUSU9OX1RZUEVTIFBXX01TX01QUEVfRU5DUllQVElPTl9UWVBFCi0jZGVmaW5lIFBXX01TX0NIQVBfTVBQRV9LRVlTCQkxMgkvKiBzdHJpbmcgKi8KLSNkZWZpbmUgUFdfTVNfTVBQRV9TRU5EX0tFWQkJMTYJLyogc3RyaW5nICovCi0jZGVmaW5lIFBXX01TX01QUEVfUkVDVl9LRVkJCTE3CS8qIHN0cmluZyAqLwotI2RlZmluZSBQV19NU19QUklNQVJZX0ROU19TRVJWRVIJMjgJLyogaXBhZGRyICovCi0jZGVmaW5lIFBXX01TX1NFQ09OREFSWV9ETlNfU0VSVkVSCTI5CS8qIGlwYWRkciAqLwotI2RlZmluZSBQV19NU19QUklNQVJZX05CTlNfU0VSVkVSCTMwCS8qIGlwYWRkciAqLwotI2RlZmluZSBQV19NU19TRUNPTkRBUllfTkJOU19TRVJWRVIJMzEJLyogaXBhZGRyICovCi0KLS8qCUFjY291bnRpbmcgKi8KLQotI2RlZmluZQlQV19BQ0NUX1NUQVRVU19UWVBFCQk0MAkvKiBpbnRlZ2VyICovCi0jZGVmaW5lCVBXX0FDQ1RfREVMQVlfVElNRQkJNDEJLyogaW50ZWdlciAqLwotI2RlZmluZQlQV19BQ0NUX0lOUFVUX09DVEVUUwkJNDIJLyogaW50ZWdlciAqLwotI2RlZmluZQlQV19BQ0NUX09VVFBVVF9PQ1RFVFMJCTQzCS8qIGludGVnZXIgKi8KLSNkZWZpbmUJUFdfQUNDVF9TRVNTSU9OX0lECQk0NAkvKiBzdHJpbmcgKi8KLSNkZWZpbmUJUFdfQUNDVF9BVVRIRU5USUMJCTQ1CS8qIGludGVnZXIgKi8KLSNkZWZpbmUJUFdfQUNDVF9TRVNTSU9OX1RJTUUJCTQ2CS8qIGludGVnZXIgKi8KLSNkZWZpbmUJUFdfQUNDVF9JTlBVVF9QQUNLRVRTCQk0NwkvKiBpbnRlZ2VyICovCi0jZGVmaW5lCVBXX0FDQ1RfT1VUUFVUX1BBQ0tFVFMJCTQ4CS8qIGludGVnZXIgKi8KLSNkZWZpbmUgUFdfQUNDVF9URVJNSU5BVEVfQ0FVU0UJCTQ5CS8qIGludGVnZXIgKi8KLSNkZWZpbmUgUFdfQUNDVF9NVUxUSV9TRVNTSU9OX0lECTUwCS8qIHN0cmluZyAqLwotI2RlZmluZSBQV19BQ0NUX0xJTktfQ09VTlQJCTUxCS8qIGludGVnZXIgKi8KLQotLyogRnJvbSBSRkMgMjg2OSAqLwotI2RlZmluZSBQV19BQ0NUX0lOVEVSSU1fSU5URVJWQUwgICAgICAgIDg1CS8qIGludGVnZXIgKi8KLQotLyoJTWVyaXQgRXhwZXJpbWVudGFsIEV4dGVuc2lvbnMgKi8KLQotI2RlZmluZSBQV19VU0VSX0lEICAgICAgICAgICAgICAgICAgICAgIDIyMiAgICAgLyogc3RyaW5nICovCi0jZGVmaW5lIFBXX1VTRVJfUkVBTE0gICAgICAgICAgICAgICAgICAgMjIzICAgICAvKiBzdHJpbmcgKi8KLQotCi0vKiAgICAgIFNlc3Npb24gbGltaXRzICovCi0jZGVmaW5lIFBXX1NFU1NJT05fT0NURVRTX0xJTUlUCQkyMjcgICAgLyogaW50ZWdlciAqLwotI2RlZmluZSBQV19PQ1RFVFNfRElSRUNUSU9OCQkyMjggICAgLyogaW50ZWdlciAqLwotCi0vKglJbnRlZ2VyIFRyYW5zbGF0aW9ucyAqLwotCi0vKglTRVJWSUNFIFRZUEVTCSovCi0KLSNkZWZpbmUJUFdfTE9HSU4JCQkxCi0jZGVmaW5lCVBXX0ZSQU1FRAkJCTIKLSNkZWZpbmUJUFdfQ0FMTEJBQ0tfTE9HSU4JCTMKLSNkZWZpbmUJUFdfQ0FMTEJBQ0tfRlJBTUVECQk0Ci0jZGVmaW5lCVBXX09VVEJPVU5ECQkJNQotI2RlZmluZQlQV19BRE1JTklTVFJBVElWRQkJNgotI2RlZmluZSBQV19OQVNfUFJPTVBUICAgICAgICAgICAgICAgICAgIDcKLSNkZWZpbmUgUFdfQVVUSEVOVElDQVRFX09OTFkJCTgKLSNkZWZpbmUgUFdfQ0FMTEJBQ0tfTkFTX1BST01QVCAgICAgICAgICA5Ci0KLS8qCUZSQU1FRCBQUk9UT0NPTFMJKi8KLQotI2RlZmluZQlQV19QUFAJCQkJMQotI2RlZmluZQlQV19TTElQCQkJCTIKLSNkZWZpbmUgUFdfQVJBICAgICAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIFBXX0dBTkRBTEYgICAgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBQV19YWUxPR0lDUyAgICAgICAgICAgICAgICAgICAgIDUKLQotLyoJRlJBTUVEIFJPVVRJTkcgVkFMVUVTCSovCi0KLSNkZWZpbmUJUFdfTk9ORQkJCQkwCi0jZGVmaW5lCVBXX0JST0FEQ0FTVAkJCTEKLSNkZWZpbmUJUFdfTElTVEVOCQkJMgotI2RlZmluZQlQV19CUk9BRENBU1RfTElTVEVOCQkzCi0KLS8qCUZSQU1FRCBDT01QUkVTU0lPTiBUWVBFUwkqLwotCi0jZGVmaW5lCVBXX1ZBTl9KQUNPQlNPTl9UQ1BfSVAJCTEKLSNkZWZpbmUJUFdfSVBYX0hFQURFUl9DT01QUkVTU0lPTgkyCi0KLS8qCUxPR0lOIFNFUlZJQ0VTCSovCi0KLSNkZWZpbmUgUFdfVEVMTkVUICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFBXX1JMT0dJTiAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBQV19UQ1BfQ0xFQVIgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgUFdfUE9SVE1BU1RFUiAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIFBXX0xBVCAgICAgICAgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBQV19YMjVfUEFEICAgICAgICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgUFdfWDI1X1QzUE9TICAgICAgICAgICAgICAgICAgICA2Ci0KLS8qCVRFUk1JTkFUSU9OIEFDVElPTlMJKi8KLQotI2RlZmluZQlQV19ERUZBVUxUCQkJMAotI2RlZmluZQlQV19SQURJVVNfUkVRVUVTVAkJMQotCi0vKglQUk9ISUJJVCBQUk9UT0NPTCAgKi8KLQotI2RlZmluZSBQV19EVU1CCQkwCS8qIDEgYW5kIDIgYXJlIGRlZmluZWQgaW4gRlJBTUVEIFBST1RPQ09MUyAqLwotI2RlZmluZSBQV19BVVRIX09OTFkJMwotI2RlZmluZSBQV19BTEwJCTI1NQotCi0vKglBQ0NPVU5USU5HIFNUQVRVUyBUWVBFUyAgICAqLwotCi0jZGVmaW5lIFBXX1NUQVRVU19TVEFSVAkJMQotI2RlZmluZSBQV19TVEFUVVNfU1RPUAkJMgotI2RlZmluZSBQV19TVEFUVVNfQUxJVkUJCTMKLSNkZWZpbmUgUFdfU1RBVFVTX01PREVNX1NUQVJUCTQKLSNkZWZpbmUgUFdfU1RBVFVTX01PREVNX1NUT1AJNQotI2RlZmluZSBQV19TVEFUVVNfQ0FOQ0VMCTYKLSNkZWZpbmUgUFdfQUNDT1VOVElOR19PTgk3Ci0jZGVmaW5lIFBXX0FDQ09VTlRJTkdfT0ZGCTgKLQotLyogICAgICBBQ0NPVU5USU5HIFRFUk1JTkFUSU9OIENBVVNFUyAgICovCi0KLSNkZWZpbmUgUFdfVVNFUl9SRVFVRVNUICAgICAgICAgMQotI2RlZmluZSBQV19MT1NUX0NBUlJJRVIgICAgICAgICAyCi0jZGVmaW5lIFBXX0xPU1RfU0VSVklDRSAgICAgICAgIDMKLSNkZWZpbmUgUFdfQUNDVF9JRExFX1RJTUVPVVQgICAgNAotI2RlZmluZSBQV19BQ0NUX1NFU1NJT05fVElNRU9VVCA1Ci0jZGVmaW5lIFBXX0FETUlOX1JFU0VUICAgICAgICAgIDYKLSNkZWZpbmUgUFdfQURNSU5fUkVCT09UICAgICAgICAgNwotI2RlZmluZSBQV19QT1JUX0VSUk9SICAgICAgICAgICA4Ci0jZGVmaW5lIFBXX05BU19FUlJPUiAgICAgICAgICAgIDkKLSNkZWZpbmUgUFdfTkFTX1JFUVVFU1QgICAgICAgICAgMTAKLSNkZWZpbmUgUFdfTkFTX1JFQk9PVCAgICAgICAgICAgMTEKLSNkZWZpbmUgUFdfUE9SVF9VTk5FRURFRCAgICAgICAgMTIKLSNkZWZpbmUgUFdfUE9SVF9QUkVFTVBURUQgICAgICAgMTMKLSNkZWZpbmUgUFdfUE9SVF9TVVNQRU5ERUQgICAgICAgMTQKLSNkZWZpbmUgUFdfU0VSVklDRV9VTkFWQUlMQUJMRSAgMTUKLSNkZWZpbmUgUFdfQ0FMTEJBQ0sgICAgICAgICAgICAgMTYKLSNkZWZpbmUgUFdfVVNFUl9FUlJPUiAgICAgICAgICAgMTcKLSNkZWZpbmUgUFdfSE9TVF9SRVFVRVNUICAgICAgICAgMTgKLQotLyogICAgIE5BUyBQT1JUIFRZUEVTICAgICovCi0KLSNkZWZpbmUgUFdfQVNZTkMJCTAKLSNkZWZpbmUgUFdfU1lOQwkJCTEKLSNkZWZpbmUgUFdfSVNETl9TWU5DCQkyCi0jZGVmaW5lIFBXX0lTRE5fU1lOQ19WMTIwCTMKLSNkZWZpbmUgUFdfSVNETl9TWU5DX1YxMTAJNAotI2RlZmluZSBQV19WSVJUVUFMCQk1Ci0KLS8qCSAgIEFVVEhFTlRJQyBUWVBFUyAqLwotI2RlZmluZSBQV19SQURJVVMJMQotI2RlZmluZSBQV19MT0NBTAkyCi0jZGVmaW5lIFBXX1JFTU9URQkzCi0KLS8qICAgIFNlc3Npb24tT2N0ZXRzLUxpbWl0ICAgICovCi0jZGVmaW5lIFBXX09DVEVUU19ESVJFQ1RJT05fU1VNCTAKLSNkZWZpbmUgUFdfT0NURVRTX0RJUkVDVElPTl9JTgkxCi0jZGVmaW5lIFBXX09DVEVUU19ESVJFQ1RJT05fT1VUCTIKLSNkZWZpbmUgUFdfT0NURVRTX0RJUkVDVElPTl9NQVgJMwotCi0KLS8qIFZlbmRvciBjb2RlcyAqLwotI2RlZmluZSBWRU5ET1JfTk9ORSAgICAgKC0xKQotI2RlZmluZSBWRU5ET1JfTUlDUk9TT0ZUCTMxMQotCi0vKiBTZXJ2ZXIgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLXR5cGVkZWYgc3RydWN0IGRpY3RfYXR0cgotewotCWNoYXIgICAgICAgICAgICAgIG5hbWVbTkFNRV9MRU5HVEggKyAxXTsJLyogYXR0cmlidXRlIG5hbWUgKi8KLQlpbnQgICAgICAgICAgICAgICB2YWx1ZTsJCQkvKiBhdHRyaWJ1dGUgaW5kZXggKi8KLQlpbnQgICAgICAgICAgICAgICB0eXBlOwkJCQkvKiBzdHJpbmcsIGludCwgZXRjLiAqLwotCWludCAgICAgICAgICAgICAgIHZlbmRvcmNvZGU7ICAgICAgICAgICAgICAgICAgIC8qIHZlbmRvciBjb2RlICovCi0Jc3RydWN0IGRpY3RfYXR0ciAqbmV4dDsKLX0gRElDVF9BVFRSOwotCi10eXBlZGVmIHN0cnVjdCBkaWN0X3ZhbHVlCi17Ci0JY2hhciAgICAgICAgICAgICAgIGF0dHJuYW1lW05BTUVfTEVOR1RIICsxXTsKLQljaGFyICAgICAgICAgICAgICAgbmFtZVtOQU1FX0xFTkdUSCArIDFdOwotCWludCAgICAgICAgICAgICAgICB2YWx1ZTsKLQlzdHJ1Y3QgZGljdF92YWx1ZSAqbmV4dDsKLX0gRElDVF9WQUxVRTsKLQotdHlwZWRlZiBzdHJ1Y3QgdmVuZG9yX2RpY3QKLXsKLSAgICBjaGFyIHZlbmRvcm5hbWVbTkFNRV9MRU5HVEggKyAxXTsKLSAgICBpbnQgdmVuZG9yY29kZTsKLSAgICBESUNUX0FUVFIgKmF0dHJpYnV0ZXM7Ci0gICAgc3RydWN0IHZlbmRvcl9kaWN0ICpuZXh0OwotfSBWRU5ET1JfRElDVDsKLQotdHlwZWRlZiBzdHJ1Y3QgdmFsdWVfcGFpcgotewotCWNoYXIgICAgICAgICAgICAgICBuYW1lW05BTUVfTEVOR1RIICsgMV07Ci0JaW50ICAgICAgICAgICAgICAgIGF0dHJpYnV0ZTsKLQlpbnQgICAgICAgICAgICAgICAgdmVuZG9yY29kZTsKLQlpbnQgICAgICAgICAgICAgICAgdHlwZTsKLQlVSU5UNCAgICAgICAgICAgICAgbHZhbHVlOwotCXVfY2hhciAgICAgICAgICAgICBzdHJ2YWx1ZVtBVVRIX1NUUklOR19MRU4gKyAxXTsKLQlzdHJ1Y3QgdmFsdWVfcGFpciAqbmV4dDsKLX0gVkFMVUVfUEFJUjsKLQotLyogZG9uJ3QgY2hhbmdlIHRoaXMsIGFzIGl0IGhhcyB0byBiZSB0aGUgc2FtZSBhcyBpbiB0aGUgTWVyaXQgcmFkaXVzZCBjb2RlICovCi0jZGVmaW5lIE1HTVRfUE9MTF9TRUNSRVQJIkhhcmRseWFzZWNyZXQiCi0KLS8qCURlZmluZSByZXR1cm4gY29kZXMgZnJvbSAiU2VuZFNlcnZlciIgdXRpbGl0eSAqLwotCi0jZGVmaW5lIEJBRFJFU1BfUkMJLTIKLSNkZWZpbmUgRVJST1JfUkMJLTEKLSNkZWZpbmUgT0tfUkMJCTAKLSNkZWZpbmUgVElNRU9VVF9SQwkxCi0KLXR5cGVkZWYgc3RydWN0IHNlbmRfZGF0YSAvKiBVc2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gc2VuZHNlcnZlcigpIGZ1bmN0aW9uICovCi17Ci0JdV9jaGFyICAgICAgICAgIGNvZGU7CQkvKiBSQURJVVMgcGFja2V0IGNvZGUgKi8KLQl1X2NoYXIgICAgICAgICAgc2VxX25icjsJLyogUGFja2V0IHNlcXVlbmNlIG51bWJlciAqLwotCWNoYXIgICAgICAgICAgICpzZXJ2ZXI7CQkvKiBOYW1lL2FkZHJyZXNzIG9mIFJBRElVUyBzZXJ2ZXIgKi8KLQlpbnQgICAgICAgICAgICAgc3ZjX3BvcnQ7CS8qIFJBRElVUyBwcm90b2NvbCBkZXN0aW5hdGlvbiBwb3J0ICovCi0JaW50ICAgICAgICAgICAgIHRpbWVvdXQ7CS8qIFNlc3Npb24gdGltZW91dCBpbiBzZWNvbmRzICovCi0JaW50CQlyZXRyaWVzOwotCVZBTFVFX1BBSVIgICAgICpzZW5kX3BhaXJzOyAgICAgLyogTW9yZSBhL3YgcGFpcnMgdG8gc2VuZCAqLwotCVZBTFVFX1BBSVIgICAgICpyZWNlaXZlX3BhaXJzOyAgLyogV2hlcmUgdG8gcGxhY2UgcmVjZWl2ZWQgYS92IHBhaXJzICovCi19IFNFTkRfREFUQTsKLQotdHlwZWRlZiBzdHJ1Y3QgcmVxdWVzdF9pbmZvCi17Ci0JY2hhcgkJc2VjcmV0W01BWF9TRUNSRVRfTEVOR1RIICsgMV07Ci0JdV9jaGFyCQlyZXF1ZXN0X3ZlY3RvcltBVVRIX1ZFQ1RPUl9MRU5dOwotfSBSRVFVRVNUX0lORk87Ci0KLSNpZm5kZWYgTUlOCi0jZGVmaW5lIE1JTihhLCBiKSAgICAgKChhKSA8IChiKSA/IChhKSA6IChiKSkKLSNlbmRpZgotI2lmbmRlZiBNQVgKLSNkZWZpbmUgTUFYKGEsIGIpICAgICAoKGEpID4gKGIpID8gKGEpIDogKGIpKQotI2VuZGlmCi0KLSNpZm5kZWYgUEFUSF9NQVgKLSNkZWZpbmUgUEFUSF9NQVgJMTAyNAotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IGVudgotewotCWludCBtYXhzaXplLCBzaXplOwotCWNoYXIgKiplbnY7Ci19IEVOVjsKLQotI2RlZmluZSBFTlZfU0laRQkxMjgKLQotLyoJRnVuY3Rpb24gcHJvdG90eXBlcwkqLwotCi0vKglhdnBhaXIuYwkJKi8KLQotVkFMVUVfUEFJUiAqcmNfYXZwYWlyX2FkZCBfX1AoKFZBTFVFX1BBSVIgKiosIGludCwgdm9pZCAqLCBpbnQsIGludCkpOwotaW50IHJjX2F2cGFpcl9hc3NpZ24gX19QKChWQUxVRV9QQUlSICosIHZvaWQgKiwgaW50KSk7Ci1WQUxVRV9QQUlSICpyY19hdnBhaXJfbmV3IF9fUCgoaW50LCB2b2lkICosIGludCwgaW50KSk7Ci1WQUxVRV9QQUlSICpyY19hdnBhaXJfZ2VuIF9fUCgoQVVUSF9IRFIgKikpOwotVkFMVUVfUEFJUiAqcmNfYXZwYWlyX2dldCBfX1AoKFZBTFVFX1BBSVIgKiwgVUlOVDQpKTsKLVZBTFVFX1BBSVIgKnJjX2F2cGFpcl9jb3B5IF9fUCgoVkFMVUVfUEFJUiAqKSk7Ci12b2lkIHJjX2F2cGFpcl9pbnNlcnQgX19QKChWQUxVRV9QQUlSICoqLCBWQUxVRV9QQUlSICosIFZBTFVFX1BBSVIgKikpOwotdm9pZCByY19hdnBhaXJfZnJlZSBfX1AoKFZBTFVFX1BBSVIgKikpOwotaW50IHJjX2F2cGFpcl9wYXJzZSBfX1AoKGNoYXIgKiwgVkFMVUVfUEFJUiAqKikpOwotaW50IHJjX2F2cGFpcl90b3N0ciBfX1AoKFZBTFVFX1BBSVIgKiwgY2hhciAqLCBpbnQsIGNoYXIgKiwgaW50KSk7Ci1WQUxVRV9QQUlSICpyY19hdnBhaXJfcmVhZGluIF9fUCgoRklMRSAqKSk7Ci0KLS8qCWJ1aWxkcmVxLmMJCSovCi0KLXZvaWQgcmNfYnVpbGRyZXEgX19QKChTRU5EX0RBVEEgKiwgaW50LCBjaGFyICosIHVuc2lnbmVkIHNob3J0LCBpbnQsIGludCkpOwotdW5zaWduZWQgY2hhciByY19nZXRfc2VxbmJyIF9fUCgodm9pZCkpOwotaW50IHJjX2F1dGggX19QKChVSU5UNCwgVkFMVUVfUEFJUiAqLCBWQUxVRV9QQUlSICoqLCBjaGFyICosIFJFUVVFU1RfSU5GTyAqKSk7Ci1pbnQgcmNfYXV0aF91c2luZ19zZXJ2ZXIgX19QKChTRVJWRVIgKiwgVUlOVDQsIFZBTFVFX1BBSVIgKiwgVkFMVUVfUEFJUiAqKiwKLQkJCSAgICAgIGNoYXIgKiwgUkVRVUVTVF9JTkZPICopKTsKLWludCByY19hdXRoX3Byb3h5IF9fUCgoVkFMVUVfUEFJUiAqLCBWQUxVRV9QQUlSICoqLCBjaGFyICopKTsKLWludCByY19hY2N0IF9fUCgoVUlOVDQsIFZBTFVFX1BBSVIgKikpOwotaW50IHJjX2FjY3RfdXNpbmdfc2VydmVyIF9fUCgoU0VSVkVSICosIFVJTlQ0LCBWQUxVRV9QQUlSICopKTsKLWludCByY19hY2N0X3Byb3h5IF9fUCgoVkFMVUVfUEFJUiAqKSk7Ci1pbnQgcmNfY2hlY2sgX19QKChjaGFyICosIHVuc2lnbmVkIHNob3J0LCBjaGFyICopKTsKLQotLyoJY2xpZW50aWQuYwkJKi8KLQotaW50IHJjX3JlYWRfbWFwZmlsZSBfX1AoKGNoYXIgKikpOwotVUlOVDQgcmNfbWFwMmlkIF9fUCgoY2hhciAqKSk7Ci0KLS8qCWNvbmZpZy5jCQkqLwotCi1pbnQgcmNfcmVhZF9jb25maWcgX19QKChjaGFyICopKTsKLWNoYXIgKnJjX2NvbmZfc3RyIF9fUCgoY2hhciAqKSk7Ci1pbnQgcmNfY29uZl9pbnQgX19QKChjaGFyICopKTsKLVNFUlZFUiAqcmNfY29uZl9zcnYgX19QKChjaGFyICopKTsKLWludCByY19maW5kX3NlcnZlciBfX1AoKGNoYXIgKiwgVUlOVDQgKiwgY2hhciAqKSk7Ci0KLS8qCWRpY3QuYwkJCSovCi0KLWludCByY19yZWFkX2RpY3Rpb25hcnkgX19QKChjaGFyICopKTsKLURJQ1RfQVRUUiAqcmNfZGljdF9nZXRhdHRyIF9fUCgoaW50LCBpbnQpKTsKLURJQ1RfQVRUUiAqcmNfZGljdF9maW5kYXR0ciBfX1AoKGNoYXIgKikpOwotRElDVF9WQUxVRSAqcmNfZGljdF9maW5kdmFsIF9fUCgoY2hhciAqKSk7Ci1ESUNUX1ZBTFVFICogcmNfZGljdF9nZXR2YWwgX19QKChVSU5UNCwgY2hhciAqKSk7Ci1WRU5ET1JfRElDVCAqIHJjX2RpY3RfZmluZHZlbmRvciBfX1AoKGNoYXIgKikpOwotVkVORE9SX0RJQ1QgKiByY19kaWN0X2dldHZlbmRvciBfX1AoKGludCkpOwotCi0vKglpcF91dGlsLmMJCSovCi0KLVVJTlQ0IHJjX2dldF9pcGFkZHIgX19QKChjaGFyICopKTsKLWludCByY19nb29kX2lwYWRkciBfX1AoKGNoYXIgKikpOwotY29uc3QgY2hhciAqcmNfaXBfaG9zdG5hbWUgX19QKChVSU5UNCkpOwotVUlOVDQgcmNfb3duX2lwYWRkcmVzcyBfX1AoKHZvaWQpKTsKLQotCi0vKglzZW5kc2VydmVyLmMJCSovCi0KLWludCByY19zZW5kX3NlcnZlciBfX1AoKFNFTkRfREFUQSAqLCBjaGFyICosIFJFUVVFU1RfSU5GTyAqKSk7Ci0KLS8qCXV0aWwuYwkJCSovCi0KLXZvaWQgcmNfc3RyMnRtIF9fUCgoY2hhciAqLCBzdHJ1Y3QgdG0gKikpOwotY2hhciAqcmNfbWtzaWQgX19QKCh2b2lkKSk7Ci12b2lkIHJjX21kZWxheSBfX1AoKGludCkpOwotCi0vKiBtZDUuYwkJCSovCi0KLXZvaWQgcmNfbWQ1X2NhbGMgX19QKCh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50KSk7Ci0KLSNlbmRpZiAvKiBSQURJVVNDTElFTlRfSCAqLwpkaWZmIC0tZ2l0IGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9yYWRyZWFsbXMuYyBiL3BwcGQvcGx1Z2lucy9yYWRpdXMvcmFkcmVhbG1zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMzAzNzAuLjAwMDAwMDAKLS0tIGEvcHBwZC9wbHVnaW5zL3JhZGl1cy9yYWRyZWFsbXMuYworKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKgotKgotKiByYWRyZWFsbXMuYwotKgotKiBBIHBwcGQgcGx1Z2luIHdoaWNoIGlzIHN0YWNrZWQgb24gdG9wIG9mIHJhZGl1cy5zby4gIFRoaXMgcGx1Z2luCi0qIGFsbG93cyBzZWxlY3Rpb24gb2YgYWx0ZXJuYXRlIHNldCBvZiBzZXJ2ZXJzIGJhc2VkIG9uIHRoZSB1c2VyJ3MgcmVhbG0uCi0qCi0qIEF1dGhvcjogQmVuIE1jS2VlZ2FuICBiZW5AbmV0c2VydmVycy5jby51awotKgotKiBDb3B5cmlnaHQgKEMpIDIwMDIgTmV0c2VydmVycwotKgotKiBUaGlzIHBsdWdpbiBtYXkgYmUgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VCi0qIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotKgotKi8KLQotc3RhdGljIGNoYXIgY29uc3QgUkNTSURbXSA9Ci0gICAgIiRJZDogcmFkcmVhbG1zLmMsdiAxLjIgMjAwNC8xMS8xNCAwNzoyNjoyNiBwYXVsdXMgRXhwICQiOwotCi0jaW5jbHVkZSAicHBwZC5oIgotI2luY2x1ZGUgInJhZGl1c2NsaWVudC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLWNoYXIgcHBwZF92ZXJzaW9uW10gPSBWRVJTSU9OOwotCi1jaGFyIHJhZHJlYWxtc19jb25maWdbTUFYUEFUSExFTl0gPSAiL2V0Yy9yYWRpdXNjbGllbnQvcmVhbG1zIjsKLQotc3RhdGljIG9wdGlvbl90IE9wdGlvbnNbXSA9IHsKLSAgICB7ICJyZWFsbXMtY29uZmlnLWZpbGUiLCBvX3N0cmluZywgJnJhZHJlYWxtc19jb25maWcsCi0gICAgICAiQ29uZmlndXJhdGlvbiBmaWxlIGZvciBSQURJVVMgcmVhbG1zIiwgT1BUX1NUQVRJQywgTlVMTCwgTUFYUEFUSExFTiB9LAotICAgIHsgTlVMTCB9Ci19OwotCi1leHRlcm4gdm9pZCAoKnJhZGl1c19wcmVfYXV0aF9ob29rKShjaGFyIGNvbnN0ICp1c2VyLAotCQkJCSAgICBTRVJWRVIgKiphdXRoc2VydmVyLAotCQkJCSAgICBTRVJWRVIgKiphY2N0c2VydmVyKTsKLQotc3RhdGljIHZvaWQKLWxvb2t1cF9yZWFsbShjaGFyIGNvbnN0ICp1c2VyLAotCSAgICAgU0VSVkVSICoqYXV0aHNlcnZlciwKLQkgICAgIFNFUlZFUiAqKmFjY3RzZXJ2ZXIpCi17Ci0gICAgY2hhciAqcmVhbG07Ci0gICAgRklMRSAqZmQ7Ci0gICAgU0VSVkVSICphY2N0cywgKmF1dGhzLCAqczsKLSAgICBjaGFyIGJ1ZmZlcls1MTJdLCAqcDsKLSAgICBpbnQgbGluZSA9IDA7Ci0gICAgCi0gICAgYXV0aHMgPSAoU0VSVkVSICopIG1hbGxvYyhzaXplb2YoU0VSVkVSKSk7Ci0gICAgYXV0aHMtPm1heCA9IDA7Ci0gICAgYWNjdHMgPSAoU0VSVkVSICopIG1hbGxvYyhzaXplb2YoU0VSVkVSKSk7Ci0gICAgYWNjdHMtPm1heCA9IDA7Ci0gICAgCi0gICAgcmVhbG0gPSBzdHJyY2hyKHVzZXIsICdAJyk7Ci0gICAgCi0gICAgaWYgKHJlYWxtKSB7Ci0JaW5mbygiTG9va2luZyB1cCBzZXJ2ZXJzIGZvciByZWFsbSAnJXMnIiwgcmVhbG0pOwotICAgIH0gZWxzZSB7Ci0JaW5mbygiTG9va2luZyB1cCBzZXJ2ZXJzIGZvciBERUZBVUxUIHJlYWxtIik7Ci0gICAgfQotICAgIGlmIChyZWFsbSkgewotCWlmICgqKCsrcmVhbG0pID09ICdcMCcpIHsKLQkgICAgcmVhbG0gPSBOVUxMOwotCX0KLSAgICB9Ci0gICAgCi0gICAgaWYgKChmZCA9IGZvcGVuKHJhZHJlYWxtc19jb25maWcsICJyIikpID09IE5VTEwpIHsKLQlvcHRpb25fZXJyb3IoImNhbm5vdCBvcGVuICVzIiwgcmFkcmVhbG1zX2NvbmZpZyk7Ci0JcmV0dXJuOwotICAgIH0gCi0gICAgaW5mbygiUmVhZGluZyAlcyIsIHJhZHJlYWxtc19jb25maWcpOwotICAgIAotICAgIHdoaWxlICgoZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgZmQpICE9IE5VTEwpKSB7Ci0JbGluZSsrOwotCi0JaWYgKCgqYnVmZmVyID09ICdcbicpIHx8ICgqYnVmZmVyID09ICcjJykgfHwgKCpidWZmZXIgPT0gJ1wwJykpCi0JICAgIGNvbnRpbnVlOwotCi0JYnVmZmVyW3N0cmxlbihidWZmZXIpLTFdID0gJ1wwJzsKLQotCXAgPSBzdHJ0b2soYnVmZmVyLCAiXHQgIik7Ci0KLQlpZiAocCA9PSBOVUxMIHx8IChzdHJjbXAocCwgImF1dGhzZXJ2ZXIiKSAhPTAKLQkgICAgJiYgc3RyY21wKHAsICJhY2N0c2VydmVyIikpKSB7Ci0JICAgIGZjbG9zZShmZCk7Ci0JICAgIG9wdGlvbl9lcnJvcigiJXM6IGludmFsaWQgbGluZSAlZDogJXMiLCByYWRyZWFsbXNfY29uZmlnLAotCQkJIGxpbmUsIGJ1ZmZlcik7Ci0JICAgIHJldHVybjsKLQl9Ci0JaW5mbygiUGFyc2luZyAnJXMnIGVudHJ5OiIsIHApOwotCXMgPSBhdXRoczsKLQlpZiAocFsxXSA9PSAnYycpIHsKLQkgICAgcyA9IGFjY3RzOwotCX0KLQlpZiAocy0+bWF4ID49IFNFUlZFUl9NQVgpCi0JICAgIGNvbnRpbnVlOwotCi0JaWYgKChwID0gc3RydG9rKE5VTEwsICJcdCAiKSkgPT0gTlVMTCkgewotCSAgICBmY2xvc2UoZmQpOwotCSAgICBvcHRpb25fZXJyb3IoIiVzOiByZWFsbSBuYW1lIG1pc3Npbmcgb24gbGluZSAlZDogJXMiLAotCQkJIHJhZHJlYWxtc19jb25maWcsIGxpbmUsIGJ1ZmZlcik7Ci0JICAgIHJldHVybjsKLQl9Ci0KLQlpZiAoKHJlYWxtICE9IE5VTEwgJiYgc3RyY21wKHAsIHJlYWxtKSA9PSAwKSB8fAotCSAgICAocmVhbG0gPT0gTlVMTCAmJiBzdHJjbXAocCwgIkRFRkFVTFQiKSA9PSAwKSApIHsKLQkgICAgaW5mbygiIC0gTWF0Y2hlZCByZWFsbSAlcyIsIHApOwotCSAgICBpZiAoKHAgPSBzdHJ0b2soTlVMTCwgIjoiKSkgPT0gTlVMTCkgewotCQlmY2xvc2UoZmQpOwotCQlvcHRpb25fZXJyb3IoIiVzOiBzZXJ2ZXIgYWRkcmVzcyBtaXNzaW5nIG9uIGxpbmUgJWQ6ICVzIiwKLQkJCSAgICAgcmFkcmVhbG1zX2NvbmZpZywgbGluZSwgYnVmZmVyKTsKLQkJcmV0dXJuOwotCSAgICB9Ci0JICAgIHMtPm5hbWVbcy0+bWF4XSA9IHN0cmR1cChwKTsKLQkgICAgaW5mbygiIC0gQWRkcmVzcyBpcyAnJXMnIixwKTsKLQkgICAgaWYgKChwID0gc3RydG9rKE5VTEwsICJcdCAiKSkgPT0gTlVMTCkgewotCQlmY2xvc2UoZmQpOwotCQlvcHRpb25fZXJyb3IoIiVzOiBzZXJ2ZXIgcG9ydCBtaXNzaW5nIG9uIGxpbmUgJWQ6ICAlcyIsCi0JCQkgICAgIHJhZHJlYWxtc19jb25maWcsIGxpbmUsIGJ1ZmZlcik7Ci0JCXJldHVybjsKLQkgICAgfQotCSAgICBzLT5wb3J0W3MtPm1heF0gPSBhdG9pKHApOwotCSAgICBpbmZvKCIgLSBQb3J0IGlzICclZCciLCBzLT5wb3J0W3MtPm1heF0pOwotCSAgICBzLT5tYXgrKzsKLQl9IGVsc2UgCi0JICAgIGluZm8oIiAtIFNraXBwaW5nIHJlYWxtICclcyciLCBwKTsKLSAgICB9Ci0gICAgZmNsb3NlKGZkKTsKLQotICAgIGlmIChhY2N0cy0+bWF4KQotCSphY2N0c2VydmVyID0gYWNjdHM7Ci0KLSAgICBpZiAoYXV0aHMtPm1heCkKLQkqYXV0aHNlcnZlciA9IGF1dGhzOwotCi0gICAgcmV0dXJuOwotfQotCi12b2lkCi1wbHVnaW5faW5pdCh2b2lkKQotewotICAgIHJhZGl1c19wcmVfYXV0aF9ob29rID0gbG9va3VwX3JlYWxtOwotCi0gICAgYWRkX29wdGlvbnMoT3B0aW9ucyk7Ci0gICAgaW5mbygiUkFESVVTIFJlYWxtcyBwbHVnaW4gaW5pdGlhbGl6ZWQuIik7Ci19CmRpZmYgLS1naXQgYS9wcHBkL3BsdWdpbnMvcmFkaXVzL3NlbmRzZXJ2ZXIuYyBiL3BwcGQvcGx1Z2lucy9yYWRpdXMvc2VuZHNlcnZlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjhhYTY3Li4wMDAwMDAwCi0tLSBhL3BwcGQvcGx1Z2lucy9yYWRpdXMvc2VuZHNlcnZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIwICswLDAgQEAKLS8qCi0gKiAkSWQ6IHNlbmRzZXJ2ZXIuYyx2IDEuMSAyMDA0LzExLzE0IDA3OjI2OjI2IHBhdWx1cyBFeHAgJAotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NSwxOTk2LDE5OTcgTGFycyBGZW5uZWJlcmcKLSAqCi0gKiBDb3B5cmlnaHQgMTk5MiBMaXZpbmdzdG9uIEVudGVycHJpc2VzLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IDE5OTIsMTk5MywgMTk5NCwxOTk1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuCi0gKiBhbmQgTWVyaXQgTmV0d29yaywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkCi0gKgotICogU2VlIHRoZSBmaWxlIENPUFlSSUdIVCBmb3IgdGhlIHJlc3BlY3RpdmUgdGVybXMgYW5kIGNvbmRpdGlvbnMuCi0gKiBJZiB0aGUgZmlsZSBpcyBtaXNzaW5nIGNvbnRhY3QgbWUgYXQgbGZAZWxlbWVudGFsLm5ldAotICogYW5kIEknbGwgc2VuZCB5b3UgYSBjb3B5LgotICoKLSAqLwotCi0jaW5jbHVkZSA8aW5jbHVkZXMuaD4KLSNpbmNsdWRlIDxyYWRpdXNjbGllbnQuaD4KLSNpbmNsdWRlIDxwYXRobmFtZXMuaD4KLQotc3RhdGljIHZvaWQgcmNfcmFuZG9tX3ZlY3RvciAodW5zaWduZWQgY2hhciAqKTsKLXN0YXRpYyBpbnQgcmNfY2hlY2tfcmVwbHkgKEFVVEhfSERSICosIGludCwgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIpOwotCi0vKgotICogRnVuY3Rpb246IHJjX3BhY2tfbGlzdAotICoKLSAqIFB1cnBvc2U6IFBhY2tzIGFuIGF0dHJpYnV0ZSB2YWx1ZSBwYWlyIGxpc3QgaW50byBhIGJ1ZmZlci4KLSAqCi0gKiBSZXR1cm5zOiBOdW1iZXIgb2Ygb2N0ZXRzIHBhY2tlZC4KLSAqCi0gKi8KLQotc3RhdGljIGludCByY19wYWNrX2xpc3QgKFZBTFVFX1BBSVIgKnZwLCBjaGFyICpzZWNyZXQsIEFVVEhfSERSICphdXRoKQotewotICAgIGludCAgICAgICAgICAgICBsZW5ndGgsIGksIHBjLCBzZWNyZXRsZW4sIHBhZGRlZF9sZW5ndGg7Ci0gICAgaW50ICAgICAgICAgICAgIHRvdGFsX2xlbmd0aCA9IDA7Ci0gICAgVUlOVDQgICAgICAgICAgIGx2YWx1ZTsKLSAgICB1bnNpZ25lZCBjaGFyICAgcGFzc2J1ZltNQVgoQVVUSF9QQVNTX0xFTiwgQ0hBUF9WQUxVRV9MRU5HVEgpXTsKLSAgICB1bnNpZ25lZCBjaGFyICAgbWQ1YnVmWzI1Nl07Ci0gICAgdW5zaWduZWQgY2hhciAgICpidWYsICp2ZWN0b3IsICpsZW5wdHI7Ci0KLSAgICBidWYgPSBhdXRoLT5kYXRhOwotCi0gICAgd2hpbGUgKHZwICE9IChWQUxVRV9QQUlSICopIE5VTEwpCi0JewotCi0JICAgIGlmICh2cC0+dmVuZG9yY29kZSAhPSBWRU5ET1JfTk9ORSkgewotCQkqYnVmKysgPSBQV19WRU5ET1JfU1BFQ0lGSUM7Ci0KLQkJLyogUGxhY2UtaG9sZGVyIGZvciB3aGVyZSB0byBwdXQgbGVuZ3RoICovCi0JCWxlbnB0ciA9IGJ1ZisrOwotCi0JCS8qIEluc2VydCB2ZW5kb3IgY29kZSAqLwotCQkqYnVmKysgPSAwOwotCQkqYnVmKysgPSAoKCh1bnNpZ25lZCBpbnQpIHZwLT52ZW5kb3Jjb2RlKSA+PiAxNikgJiAyNTU7Ci0JCSpidWYrKyA9ICgoKHVuc2lnbmVkIGludCkgdnAtPnZlbmRvcmNvZGUpID4+IDgpICYgMjU1OwotCQkqYnVmKysgPSAoKHVuc2lnbmVkIGludCkgdnAtPnZlbmRvcmNvZGUpICYgMjU1OwotCi0JCS8qIEluc2VydCB2ZW5kb3ItdHlwZSAqLwotCQkqYnVmKysgPSB2cC0+YXR0cmlidXRlOwotCi0JCS8qIEluc2VydCB2YWx1ZSAqLwotCQlzd2l0Y2godnAtPnR5cGUpIHsKLQkJY2FzZSBQV19UWVBFX1NUUklORzoKLQkJICAgIGxlbmd0aCA9IHZwLT5sdmFsdWU7Ci0JCSAgICAqbGVucHRyID0gbGVuZ3RoICsgODsKLQkJICAgICpidWYrKyA9IGxlbmd0aCsyOwotCQkgICAgbWVtY3B5KGJ1ZiwgdnAtPnN0cnZhbHVlLCAoc2l6ZV90KSBsZW5ndGgpOwotCQkgICAgYnVmICs9IGxlbmd0aDsKLQkJICAgIHRvdGFsX2xlbmd0aCArPSBsZW5ndGgrODsKLQkJICAgIGJyZWFrOwotCQljYXNlIFBXX1RZUEVfSU5URUdFUjoKLQkJY2FzZSBQV19UWVBFX0lQQUREUjoKLQkJICAgIGxlbmd0aCA9IHNpemVvZihVSU5UNCk7Ci0JCSAgICAqbGVucHRyID0gbGVuZ3RoICsgODsKLQkJICAgICpidWYrKyA9IGxlbmd0aCsyOwotCQkgICAgbHZhbHVlID0gaHRvbmwodnAtPmx2YWx1ZSk7Ci0JCSAgICBtZW1jcHkoYnVmLCAoY2hhciAqKSAmbHZhbHVlLCBzaXplb2YoVUlOVDQpKTsKLQkJICAgIGJ1ZiArPSBsZW5ndGg7Ci0JCSAgICB0b3RhbF9sZW5ndGggKz0gbGVuZ3RoKzg7Ci0JCSAgICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICAgIGJyZWFrOwotCQl9Ci0JICAgIH0gZWxzZSB7Ci0JCSpidWYrKyA9IHZwLT5hdHRyaWJ1dGU7Ci0JCXN3aXRjaCAodnAtPmF0dHJpYnV0ZSkgewotCQljYXNlIFBXX1VTRVJfUEFTU1dPUkQ6Ci0KLQkJICAgIC8qIEVuY3J5cHQgdGhlIHBhc3N3b3JkICovCi0KLQkJICAgIC8qIENob3Agb2ZmIHBhc3N3b3JkIGF0IEFVVEhfUEFTU19MRU4gKi8KLQkJICAgIGxlbmd0aCA9IHZwLT5sdmFsdWU7Ci0JCSAgICBpZiAobGVuZ3RoID4gQVVUSF9QQVNTX0xFTikgbGVuZ3RoID0gQVVUSF9QQVNTX0xFTjsKLQotCQkgICAgLyogQ2FsY3VsYXRlIHRoZSBwYWRkZWQgbGVuZ3RoICovCi0JCSAgICBwYWRkZWRfbGVuZ3RoID0gKGxlbmd0aCsoQVVUSF9WRUNUT1JfTEVOLTEpKSAmIH4oQVVUSF9WRUNUT1JfTEVOLTEpOwotCi0JCSAgICAvKiBSZWNvcmQgdGhlIGF0dHJpYnV0ZSBsZW5ndGggKi8KLQkJICAgICpidWYrKyA9IHBhZGRlZF9sZW5ndGggKyAyOwotCi0JCSAgICAvKiBQYWQgdGhlIHBhc3N3b3JkIHdpdGggemVyb3MgKi8KLQkJICAgIG1lbXNldCAoKGNoYXIgKikgcGFzc2J1ZiwgJ1wwJywgQVVUSF9QQVNTX0xFTik7Ci0JCSAgICBtZW1jcHkgKChjaGFyICopIHBhc3NidWYsIHZwLT5zdHJ2YWx1ZSwgKHNpemVfdCkgbGVuZ3RoKTsKLQotCQkgICAgc2VjcmV0bGVuID0gc3RybGVuIChzZWNyZXQpOwotCQkgICAgdmVjdG9yID0gKGNoYXIgKilhdXRoLT52ZWN0b3I7Ci0JCSAgICBmb3IoaSA9IDA7IGkgPCBwYWRkZWRfbGVuZ3RoOyBpICs9IEFVVEhfVkVDVE9SX0xFTikgewotCQkJLyogQ2FsY3VsYXRlIHRoZSBNRDUgZGlnZXN0Ki8KLQkJCXN0cmNweSAoKGNoYXIgKikgbWQ1YnVmLCBzZWNyZXQpOwotCQkJbWVtY3B5ICgoY2hhciAqKSBtZDVidWYgKyBzZWNyZXRsZW4sIHZlY3RvciwKLQkJCQlBVVRIX1ZFQ1RPUl9MRU4pOwotCQkJcmNfbWQ1X2NhbGMgKGJ1ZiwgbWQ1YnVmLCBzZWNyZXRsZW4gKyBBVVRIX1ZFQ1RPUl9MRU4pOwotCi0JCQkvKiBSZW1lYmVyIHRoZSBzdGFydCBvZiB0aGUgZGlnZXN0ICovCi0JCQl2ZWN0b3IgPSBidWY7Ci0KLQkJCS8qIFhvciB0aGUgcGFzc3dvcmQgaW50byB0aGUgTUQ1IGRpZ2VzdCAqLwotCQkJZm9yIChwYyA9IGk7IHBjIDwgKGkgKyBBVVRIX1ZFQ1RPUl9MRU4pOyBwYysrKSB7Ci0JCQkgICAgKmJ1ZisrIF49IHBhc3NidWZbcGNdOwotCQkJfQotCQkgICAgfQotCi0JCSAgICB0b3RhbF9sZW5ndGggKz0gcGFkZGVkX2xlbmd0aCArIDI7Ci0KLQkJICAgIGJyZWFrOwotI2lmIDAKLQkJY2FzZSBQV19DSEFQX1BBU1NXT1JEOgotCi0JCSAgICAqYnVmKysgPSBDSEFQX1ZBTFVFX0xFTkdUSCArIDI7Ci0KLQkJICAgIC8qIEVuY3J5cHQgdGhlIFBhc3N3b3JkICovCi0JCSAgICBsZW5ndGggPSB2cC0+bHZhbHVlOwotCQkgICAgaWYgKGxlbmd0aCA+IENIQVBfVkFMVUVfTEVOR1RIKSB7Ci0JCQlsZW5ndGggPSBDSEFQX1ZBTFVFX0xFTkdUSDsKLQkJICAgIH0KLQkJICAgIG1lbXNldCAoKGNoYXIgKikgcGFzc2J1ZiwgJ1wwJywgQ0hBUF9WQUxVRV9MRU5HVEgpOwotCQkgICAgbWVtY3B5ICgoY2hhciAqKSBwYXNzYnVmLCB2cC0+c3RydmFsdWUsIChzaXplX3QpIGxlbmd0aCk7Ci0KLQkJICAgIC8qIENhbGN1bGF0ZSB0aGUgTUQ1IERpZ2VzdCAqLwotCQkgICAgc2VjcmV0bGVuID0gc3RybGVuIChzZWNyZXQpOwotCQkgICAgc3RyY3B5ICgoY2hhciAqKSBtZDVidWYsIHNlY3JldCk7Ci0JCSAgICBtZW1jcHkgKChjaGFyICopIG1kNWJ1ZiArIHNlY3JldGxlbiwgKGNoYXIgKikgYXV0aC0+dmVjdG9yLAotCQkJICAgIEFVVEhfVkVDVE9SX0xFTik7Ci0JCSAgICByY19tZDVfY2FsYyAoYnVmLCBtZDVidWYsIHNlY3JldGxlbiArIEFVVEhfVkVDVE9SX0xFTik7Ci0KLQkJICAgIC8qIFhvciB0aGUgcGFzc3dvcmQgaW50byB0aGUgTUQ1IGRpZ2VzdCAqLwotCQkgICAgZm9yIChpID0gMDsgaSA8IENIQVBfVkFMVUVfTEVOR1RIOyBpKyspIHsKLQkJCSpidWYrKyBePSBwYXNzYnVmW2ldOwotCQkgICAgfQotCQkgICAgdG90YWxfbGVuZ3RoICs9IENIQVBfVkFMVUVfTEVOR1RIICsgMjsKLQotCQkgICAgYnJlYWs7Ci0jZW5kaWYKLQkJZGVmYXVsdDoKLQkJICAgIHN3aXRjaCAodnAtPnR5cGUpIHsKLQkJICAgIGNhc2UgUFdfVFlQRV9TVFJJTkc6Ci0JCQlsZW5ndGggPSB2cC0+bHZhbHVlOwotCQkJKmJ1ZisrID0gbGVuZ3RoICsgMjsKLQkJCW1lbWNweSAoYnVmLCB2cC0+c3RydmFsdWUsIChzaXplX3QpIGxlbmd0aCk7Ci0JCQlidWYgKz0gbGVuZ3RoOwotCQkJdG90YWxfbGVuZ3RoICs9IGxlbmd0aCArIDI7Ci0JCQlicmVhazsKLQotCQkgICAgY2FzZSBQV19UWVBFX0lOVEVHRVI6Ci0JCSAgICBjYXNlIFBXX1RZUEVfSVBBRERSOgotCQkJKmJ1ZisrID0gc2l6ZW9mIChVSU5UNCkgKyAyOwotCQkJbHZhbHVlID0gaHRvbmwgKHZwLT5sdmFsdWUpOwotCQkJbWVtY3B5IChidWYsIChjaGFyICopICZsdmFsdWUsIHNpemVvZiAoVUlOVDQpKTsKLQkJCWJ1ZiArPSBzaXplb2YgKFVJTlQ0KTsKLQkJCXRvdGFsX2xlbmd0aCArPSBzaXplb2YgKFVJTlQ0KSArIDI7Ci0JCQlicmVhazsKLQotCQkgICAgZGVmYXVsdDoKLQkJCWJyZWFrOwotCQkgICAgfQotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgICB2cCA9IHZwLT5uZXh0OwotCX0KLSAgICByZXR1cm4gdG90YWxfbGVuZ3RoOwotfQotCi0vKgotICogRnVuY3Rpb246IHJjX3NlbmRfc2VydmVyCi0gKgotICogUHVycG9zZTogc2VuZCBhIHJlcXVlc3QgdG8gYSBSQURJVVMgc2VydmVyIGFuZCB3YWl0IGZvciB0aGUgcmVwbHkKLSAqCi0gKi8KLQotaW50IHJjX3NlbmRfc2VydmVyIChTRU5EX0RBVEEgKmRhdGEsIGNoYXIgKm1zZywgUkVRVUVTVF9JTkZPICppbmZvKQotewotCWludCAgICAgICAgICAgICBzb2NrZmQ7Ci0Jc3RydWN0IHNvY2thZGRyIHNhbG9jYWw7Ci0Jc3RydWN0IHNvY2thZGRyIHNhcmVtb3RlOwotCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luOwotCXN0cnVjdCB0aW1ldmFsICBhdXRodGltZTsKLQlmZF9zZXQgICAgICAgICAgcmVhZGZkczsKLQlBVVRIX0hEUiAgICAgICAqYXV0aCwgKnJlY3ZfYXV0aDsKLQlVSU5UNCAgICAgICAgICAgYXV0aF9pcGFkZHI7Ci0JY2hhciAgICAgICAgICAgKnNlcnZlcl9uYW1lOwkvKiBOYW1lIG9mIHNlcnZlciB0byBxdWVyeSAqLwotCWludCAgICAgICAgICAgICBzYWxlbjsKLQlpbnQgICAgICAgICAgICAgcmVzdWx0OwotCWludCAgICAgICAgICAgICB0b3RhbF9sZW5ndGg7Ci0JaW50ICAgICAgICAgICAgIGxlbmd0aDsKLQlpbnQgICAgICAgICAgICAgcmV0cnlfbWF4OwotCWludAkJc2VjcmV0bGVuOwotCWNoYXIgICAgICAgICAgICBzZWNyZXRbTUFYX1NFQ1JFVF9MRU5HVEggKyAxXTsKLQl1bnNpZ25lZCBjaGFyICAgdmVjdG9yW0FVVEhfVkVDVE9SX0xFTl07Ci0JY2hhciAgICAgICAgICAgIHJlY3ZfYnVmZmVyW0JVRkZFUl9MRU5dOwotCWNoYXIgICAgICAgICAgICBzZW5kX2J1ZmZlcltCVUZGRVJfTEVOXTsKLQlpbnQJCXJldHJpZXM7Ci0JVkFMVUVfUEFJUgkqdnA7Ci0KLQlzZXJ2ZXJfbmFtZSA9IGRhdGEtPnNlcnZlcjsKLQlpZiAoc2VydmVyX25hbWUgPT0gKGNoYXIgKikgTlVMTCB8fCBzZXJ2ZXJfbmFtZVswXSA9PSAnXDAnKQotCQlyZXR1cm4gKEVSUk9SX1JDKTsKLQotCWlmICgodnAgPSByY19hdnBhaXJfZ2V0KGRhdGEtPnNlbmRfcGFpcnMsIFBXX1NFUlZJQ0VfVFlQRSkpICYmIFwKLQkgICAgKHZwLT5sdmFsdWUgPT0gUFdfQURNSU5JU1RSQVRJVkUpKQotCXsKLQkJc3RyY3B5KHNlY3JldCwgTUdNVF9QT0xMX1NFQ1JFVCk7Ci0JCWlmICgoYXV0aF9pcGFkZHIgPSByY19nZXRfaXBhZGRyKHNlcnZlcl9uYW1lKSkgPT0gMCkKLQkJCXJldHVybiAoRVJST1JfUkMpOwotCX0KLQllbHNlCi0JewotCQlpZiAocmNfZmluZF9zZXJ2ZXIgKHNlcnZlcl9uYW1lLCAmYXV0aF9pcGFkZHIsIHNlY3JldCkgIT0gMCkKLQkJewotCQkJcmV0dXJuIChFUlJPUl9SQyk7Ci0JCX0KLQl9Ci0KLQlzb2NrZmQgPSBzb2NrZXQgKEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOwotCWlmIChzb2NrZmQgPCAwKQotCXsKLQkJbWVtc2V0IChzZWNyZXQsICdcMCcsIHNpemVvZiAoc2VjcmV0KSk7Ci0JCWVycm9yKCJyY19zZW5kX3NlcnZlcjogc29ja2V0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAoRVJST1JfUkMpOwotCX0KLQotCWxlbmd0aCA9IHNpemVvZiAoc2Fsb2NhbCk7Ci0Jc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmIHNhbG9jYWw7Ci0JbWVtc2V0ICgoY2hhciAqKSBzaW4sICdcMCcsIChzaXplX3QpIGxlbmd0aCk7Ci0Jc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKHJjX293bl9iaW5kX2lwYWRkcmVzcygpKTsKLQlzaW4tPnNpbl9wb3J0ID0gaHRvbnMgKCh1bnNpZ25lZCBzaG9ydCkgMCk7Ci0JaWYgKGJpbmQgKHNvY2tmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSBzaW4sIGxlbmd0aCkgPCAwIHx8Ci0JCSAgIGdldHNvY2tuYW1lIChzb2NrZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgc2luLCAmbGVuZ3RoKSA8IDApCi0JewotCQljbG9zZSAoc29ja2ZkKTsKLQkJbWVtc2V0IChzZWNyZXQsICdcMCcsIHNpemVvZiAoc2VjcmV0KSk7Ci0JCWVycm9yKCJyY19zZW5kX3NlcnZlcjogYmluZDogJXM6ICVtIiwgc2VydmVyX25hbWUpOwotCQlyZXR1cm4gKEVSUk9SX1JDKTsKLQl9Ci0KLQlyZXRyeV9tYXggPSBkYXRhLT5yZXRyaWVzOwkvKiBNYXguIG51bWJlcnMgdG8gdHJ5IGZvciByZXBseSAqLwotCXJldHJpZXMgPSAwOwkJCS8qIEluaXQgcmV0cnkgY250IGZvciBibG9ja2luZyBjYWxsICovCi0KLQkvKiBCdWlsZCBhIHJlcXVlc3QgKi8KLQlhdXRoID0gKEFVVEhfSERSICopIHNlbmRfYnVmZmVyOwotCWF1dGgtPmNvZGUgPSBkYXRhLT5jb2RlOwotCWF1dGgtPmlkID0gZGF0YS0+c2VxX25icjsKLQotCWlmIChkYXRhLT5jb2RlID09IFBXX0FDQ09VTlRJTkdfUkVRVUVTVCkKLQl7Ci0JCXRvdGFsX2xlbmd0aCA9IHJjX3BhY2tfbGlzdChkYXRhLT5zZW5kX3BhaXJzLCBzZWNyZXQsIGF1dGgpICsgQVVUSF9IRFJfTEVOOwotCi0JCWF1dGgtPmxlbmd0aCA9IGh0b25zICgodW5zaWduZWQgc2hvcnQpIHRvdGFsX2xlbmd0aCk7Ci0KLQkJbWVtc2V0KChjaGFyICopIGF1dGgtPnZlY3RvciwgMCwgQVVUSF9WRUNUT1JfTEVOKTsKLQkJc2VjcmV0bGVuID0gc3RybGVuIChzZWNyZXQpOwotCQltZW1jcHkgKChjaGFyICopIGF1dGggKyB0b3RhbF9sZW5ndGgsIHNlY3JldCwgc2VjcmV0bGVuKTsKLQkJcmNfbWQ1X2NhbGMgKHZlY3RvciwgKGNoYXIgKikgYXV0aCwgdG90YWxfbGVuZ3RoICsgc2VjcmV0bGVuKTsKLQkJbWVtY3B5ICgoY2hhciAqKSBhdXRoLT52ZWN0b3IsIChjaGFyICopIHZlY3RvciwgQVVUSF9WRUNUT1JfTEVOKTsKLQl9Ci0JZWxzZQotCXsKLQkJcmNfcmFuZG9tX3ZlY3RvciAodmVjdG9yKTsKLQkJbWVtY3B5IChhdXRoLT52ZWN0b3IsIHZlY3RvciwgQVVUSF9WRUNUT1JfTEVOKTsKLQotCQl0b3RhbF9sZW5ndGggPSByY19wYWNrX2xpc3QoZGF0YS0+c2VuZF9wYWlycywgc2VjcmV0LCBhdXRoKSArIEFVVEhfSERSX0xFTjsKLQotCQlhdXRoLT5sZW5ndGggPSBodG9ucyAoKHVuc2lnbmVkIHNob3J0KSB0b3RhbF9sZW5ndGgpOwotCX0KLQotCXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJiBzYXJlbW90ZTsKLQltZW1zZXQgKChjaGFyICopIHNpbiwgJ1wwJywgc2l6ZW9mIChzYXJlbW90ZSkpOwotCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0Jc2luLT5zaW5fYWRkci5zX2FkZHIgPSBodG9ubCAoYXV0aF9pcGFkZHIpOwotCXNpbi0+c2luX3BvcnQgPSBodG9ucyAoKHVuc2lnbmVkIHNob3J0KSBkYXRhLT5zdmNfcG9ydCk7Ci0KLQlmb3IgKDs7KQotCXsKLQkJc2VuZHRvIChzb2NrZmQsIChjaGFyICopIGF1dGgsICh1bnNpZ25lZCBpbnQpIHRvdGFsX2xlbmd0aCwgKGludCkgMCwKLQkJCShzdHJ1Y3Qgc29ja2FkZHIgKikgc2luLCBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9pbikpOwotCi0JCWF1dGh0aW1lLnR2X3VzZWMgPSAwTDsKLQkJYXV0aHRpbWUudHZfc2VjID0gKGxvbmcpIGRhdGEtPnRpbWVvdXQ7Ci0JCUZEX1pFUk8gKCZyZWFkZmRzKTsKLQkJRkRfU0VUIChzb2NrZmQsICZyZWFkZmRzKTsKLQkJaWYgKHNlbGVjdCAoc29ja2ZkICsgMSwgJnJlYWRmZHMsIE5VTEwsIE5VTEwsICZhdXRodGltZSkgPCAwKQotCQl7Ci0JCQlpZiAoZXJybm8gPT0gRUlOVFIpCi0JCQkJY29udGludWU7Ci0JCQllcnJvcigicmNfc2VuZF9zZXJ2ZXI6IHNlbGVjdDogJW0iKTsKLQkJCW1lbXNldCAoc2VjcmV0LCAnXDAnLCBzaXplb2YgKHNlY3JldCkpOwotCQkJY2xvc2UgKHNvY2tmZCk7Ci0JCQlyZXR1cm4gKEVSUk9SX1JDKTsKLQkJfQotCQlpZiAoRkRfSVNTRVQgKHNvY2tmZCwgJnJlYWRmZHMpKQotCQkJYnJlYWs7Ci0KLQkJLyoKLQkJICogVGltZWQgb3V0IHdhaXRpbmcgZm9yIHJlc3BvbnNlLiAgUmV0cnkgInJldHJ5X21heCIgdGltZXMKLQkJICogYmVmb3JlIGdpdmluZyB1cC4gIElmIHJldHJ5X21heCA9IDAsIGRvbid0IHJldHJ5IGF0IGFsbC4KLQkJICovCi0JCWlmICgrK3JldHJpZXMgPj0gcmV0cnlfbWF4KQotCQl7Ci0JCQllcnJvcigicmNfc2VuZF9zZXJ2ZXI6IG5vIHJlcGx5IGZyb20gUkFESVVTIHNlcnZlciAlczoldSIsCi0JCQkgICAgICByY19pcF9ob3N0bmFtZSAoYXV0aF9pcGFkZHIpLCBkYXRhLT5zdmNfcG9ydCk7Ci0JCQljbG9zZSAoc29ja2ZkKTsKLQkJCW1lbXNldCAoc2VjcmV0LCAnXDAnLCBzaXplb2YgKHNlY3JldCkpOwotCQkJcmV0dXJuIChUSU1FT1VUX1JDKTsKLQkJfQotCX0KLQlzYWxlbiA9IHNpemVvZiAoc2FyZW1vdGUpOwotCWxlbmd0aCA9IHJlY3Zmcm9tIChzb2NrZmQsIChjaGFyICopIHJlY3ZfYnVmZmVyLAotCQkJICAgKGludCkgc2l6ZW9mIChyZWN2X2J1ZmZlciksCi0JCQkgICAoaW50KSAwLCAmc2FyZW1vdGUsICZzYWxlbik7Ci0KLQlpZiAobGVuZ3RoIDw9IDApCi0JewotCQllcnJvcigicmNfc2VuZF9zZXJ2ZXI6IHJlY3Zmcm9tOiAlczolZDogJW0iLCBzZXJ2ZXJfbmFtZSxcCi0JCSAgICAgIGRhdGEtPnN2Y19wb3J0KTsKLQkJY2xvc2UgKHNvY2tmZCk7Ci0JCW1lbXNldCAoc2VjcmV0LCAnXDAnLCBzaXplb2YgKHNlY3JldCkpOwotCQlyZXR1cm4gKEVSUk9SX1JDKTsKLQl9Ci0KLQlyZWN2X2F1dGggPSAoQVVUSF9IRFIgKilyZWN2X2J1ZmZlcjsKLQotCXJlc3VsdCA9IHJjX2NoZWNrX3JlcGx5IChyZWN2X2F1dGgsIEJVRkZFUl9MRU4sIHNlY3JldCwgdmVjdG9yLCBkYXRhLT5zZXFfbmJyKTsKLQotCWRhdGEtPnJlY2VpdmVfcGFpcnMgPSByY19hdnBhaXJfZ2VuKHJlY3ZfYXV0aCk7Ci0KLQljbG9zZSAoc29ja2ZkKTsKLQlpZiAoaW5mbykKLQl7Ci0JCW1lbWNweShpbmZvLT5zZWNyZXQsIHNlY3JldCwgc2l6ZW9mKGluZm8tPnNlY3JldCkpOwotCQltZW1jcHkoaW5mby0+cmVxdWVzdF92ZWN0b3IsIHZlY3RvciwKLQkJICAgICAgIHNpemVvZihpbmZvLT5yZXF1ZXN0X3ZlY3RvcikpOwotCX0KLQltZW1zZXQgKHNlY3JldCwgJ1wwJywgc2l6ZW9mIChzZWNyZXQpKTsKLQotCWlmIChyZXN1bHQgIT0gT0tfUkMpIHJldHVybiAocmVzdWx0KTsKLQotCSptc2cgPSAnXDAnOwotCXZwID0gZGF0YS0+cmVjZWl2ZV9wYWlyczsKLQl3aGlsZSAodnApCi0JewotCQlpZiAoKHZwID0gcmNfYXZwYWlyX2dldCh2cCwgUFdfUkVQTFlfTUVTU0FHRSkpKQotCQl7Ci0JCQlzdHJjYXQobXNnLCB2cC0+c3RydmFsdWUpOwotCQkJc3RyY2F0KG1zZywgIlxuIik7Ci0JCQl2cCA9IHZwLT5uZXh0OwotCQl9Ci0JfQotCi0JaWYgKChyZWN2X2F1dGgtPmNvZGUgPT0gUFdfQUNDRVNTX0FDQ0VQVCkgfHwKLQkJKHJlY3ZfYXV0aC0+Y29kZSA9PSBQV19QQVNTV09SRF9BQ0spIHx8Ci0JCShyZWN2X2F1dGgtPmNvZGUgPT0gUFdfQUNDT1VOVElOR19SRVNQT05TRSkpCi0JewotCQlyZXN1bHQgPSBPS19SQzsKLQl9Ci0JZWxzZQotCXsKLQkJcmVzdWx0ID0gQkFEUkVTUF9SQzsKLQl9Ci0KLQlyZXR1cm4gKHJlc3VsdCk7Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbjogcmNfY2hlY2tfcmVwbHkKLSAqCi0gKiBQdXJwb3NlOiB2ZXJpZnkgaXRlbXMgaW4gcmV0dXJuZWQgcGFja2V0LgotICoKLSAqIFJldHVybnM6CU9LX1JDICAgICAgIC0tIHVwb24gc3VjY2VzcywKLSAqCQlCQURSRVNQX1JDICAtLSBpZiBhbnl0aGluZyBsb29rcyBmdW5ueS4KLSAqCi0gKi8KLQotc3RhdGljIGludCByY19jaGVja19yZXBseSAoQVVUSF9IRFIgKmF1dGgsIGludCBidWZmZXJsZW4sIGNoYXIgKnNlY3JldCwKLQkJCSAgIHVuc2lnbmVkIGNoYXIgKnZlY3RvciwgdW5zaWduZWQgY2hhciBzZXFfbmJyKQotewotCWludCAgICAgICAgICAgICBzZWNyZXRsZW47Ci0JaW50ICAgICAgICAgICAgIHRvdGFsbGVuOwotCXVuc2lnbmVkIGNoYXIgICBjYWxjX2RpZ2VzdFtBVVRIX1ZFQ1RPUl9MRU5dOwotCXVuc2lnbmVkIGNoYXIgICByZXBseV9kaWdlc3RbQVVUSF9WRUNUT1JfTEVOXTsKLQotCXRvdGFsbGVuID0gbnRvaHMgKGF1dGgtPmxlbmd0aCk7Ci0KLQlzZWNyZXRsZW4gPSBzdHJsZW4gKHNlY3JldCk7Ci0KLQkvKiBEbyBzYW5pdHkgY2hlY2tzIG9uIHBhY2tldCBsZW5ndGggKi8KLQlpZiAoKHRvdGFsbGVuIDwgMjApIHx8ICh0b3RhbGxlbiA+IDQwOTYpKQotCXsKLQkJZXJyb3IoInJjX2NoZWNrX3JlcGx5OiByZWNlaXZlZCBSQURJVVMgc2VydmVyIHJlc3BvbnNlIHdpdGggaW52YWxpZCBsZW5ndGgiKTsKLQkJcmV0dXJuIChCQURSRVNQX1JDKTsKLQl9Ci0KLQkvKiBWZXJpZnkgYnVmZmVyIHNwYWNlLCBzaG91bGQgbmV2ZXIgdHJpZ2dlciB3aXRoIGN1cnJlbnQgYnVmZmVyIHNpemUgYW5kIGNoZWNrIGFib3ZlICovCi0JaWYgKCh0b3RhbGxlbiArIHNlY3JldGxlbikgPiBidWZmZXJsZW4pCi0JewotCQllcnJvcigicmNfY2hlY2tfcmVwbHk6IG5vdCBlbm91Z2ggYnVmZmVyIHNwYWNlIHRvIHZlcmlmeSBSQURJVVMgc2VydmVyIHJlc3BvbnNlIik7Ci0JCXJldHVybiAoQkFEUkVTUF9SQyk7Ci0JfQotCS8qIFZlcmlmeSB0aGF0IGlkIChzZXEuIG51bWJlcikgbWF0Y2hlcyB3aGF0IHdlIHNlbnQgKi8KLQlpZiAoYXV0aC0+aWQgIT0gc2VxX25icikKLQl7Ci0JCWVycm9yKCJyY19jaGVja19yZXBseTogcmVjZWl2ZWQgbm9uLW1hdGNoaW5nIGlkIGluIFJBRElVUyBzZXJ2ZXIgcmVzcG9uc2UiKTsKLQkJcmV0dXJuIChCQURSRVNQX1JDKTsKLQl9Ci0KLQkvKiBWZXJpZnkgdGhlIHJlcGx5IGRpZ2VzdCAqLwotCW1lbWNweSAoKGNoYXIgKikgcmVwbHlfZGlnZXN0LCAoY2hhciAqKSBhdXRoLT52ZWN0b3IsIEFVVEhfVkVDVE9SX0xFTik7Ci0JbWVtY3B5ICgoY2hhciAqKSBhdXRoLT52ZWN0b3IsIChjaGFyICopIHZlY3RvciwgQVVUSF9WRUNUT1JfTEVOKTsKLQltZW1jcHkgKChjaGFyICopIGF1dGggKyB0b3RhbGxlbiwgc2VjcmV0LCBzZWNyZXRsZW4pOwotCXJjX21kNV9jYWxjIChjYWxjX2RpZ2VzdCwgKGNoYXIgKikgYXV0aCwgdG90YWxsZW4gKyBzZWNyZXRsZW4pOwotCi0jaWZkZWYgRElHRVNUX0RFQlVHCi0JewotCQlpbnQgaTsKLQotCQlmcHV0cygicmVwbHlfZGlnZXN0OiAiLCBzdGRlcnIpOwotCQlmb3IgKGkgPSAwOyBpIDwgQVVUSF9WRUNUT1JfTEVOOyBpKyspCi0JCXsKLQkJCWZwcmludGYoc3RkZXJyLCIlLjJ4ICIsIChpbnQpIHJlcGx5X2RpZ2VzdFtpXSk7Ci0JCX0KLQkJZnB1dHMoIlxuY2FsY19kaWdlc3Q6ICAiLCBzdGRlcnIpOwotCQlmb3IgKGkgPSAwOyBpIDwgQVVUSF9WRUNUT1JfTEVOOyBpKyspCi0JCXsKLQkJCWZwcmludGYoc3RkZXJyLCIlLjJ4ICIsIChpbnQpIGNhbGNfZGlnZXN0W2ldKTsKLQkJfQotCQlmcHV0cygiXG4iLCBzdGRlcnIpOwotCX0KLSNlbmRpZgotCi0JaWYgKG1lbWNtcCAoKGNoYXIgKikgcmVwbHlfZGlnZXN0LCAoY2hhciAqKSBjYWxjX2RpZ2VzdCwKLQkJICAgIEFVVEhfVkVDVE9SX0xFTikgIT0gMCkKLQl7Ci0jaWZkZWYgUkFESVVTXzExNgotCQkvKiB0aGUgb3JpZ2luYWwgTGl2aW5nc3RvbiByYWRpdXNkIHYxLjE2IHNlZW1zIHRvIGhhdmUKLQkJICAgYSBidWcgaW4gZGlnZXN0IGNhbGN1bGF0aW9uIHdpdGggYWNjb3VudGluZyByZXF1ZXN0cywKLQkJICAgYXV0aGVudGljYXRpb24gcmVxdWVzdCBhcmUgb2suIGkgbG9va2VkIGF0IHRoZSBjb2RlCi0JCSAgIGJ1dCBjb3VsZG4ndCBmaW5kIGFueSBidWdzLiBhbnkgaGVscCB0byBnZXQgdGhpcwotCQkgICBrbHVkZ2Ugb3V0IGFyZSB3ZWxjb21lLiBwcmVmZXJhYmx5IGkgd2FudCB0bwotCQkgICByZXByb2R1Y2UgdGhlIGNhbGN1bGF0aW9uIGJ1ZyBoZXJlIHRvIGJlIGNvbXBhdGlibGUKLQkJICAgdG8gc3RvY2sgTGl2aW5nc3RvbiByYWRpdXNkIHYxLjE2LgktbGYsIDAzLzE0Lzk2Ci0JCSAqLwotCQlpZiAoYXV0aC0+Y29kZSA9PSBQV19BQ0NPVU5USU5HX1JFU1BPTlNFKQotCQkJcmV0dXJuIChPS19SQyk7Ci0jZW5kaWYKLQkJZXJyb3IoInJjX2NoZWNrX3JlcGx5OiByZWNlaXZlZCBpbnZhbGlkIHJlcGx5IGRpZ2VzdCBmcm9tIFJBRElVUyBzZXJ2ZXIiKTsKLQkJcmV0dXJuIChCQURSRVNQX1JDKTsKLQl9Ci0KLQlyZXR1cm4gKE9LX1JDKTsKLQotfQotCi0vKgotICogRnVuY3Rpb246IHJjX3JhbmRvbV92ZWN0b3IKLSAqCi0gKiBQdXJwb3NlOiBnZW5lcmF0ZXMgYSByYW5kb20gdmVjdG9yIG9mIEFVVEhfVkVDVE9SX0xFTiBvY3RldHMuCi0gKgotICogUmV0dXJuczogdGhlIHZlY3RvciAoY2FsbCBieSByZWZlcmVuY2UpCi0gKgotICovCi0KLXN0YXRpYyB2b2lkIHJjX3JhbmRvbV92ZWN0b3IgKHVuc2lnbmVkIGNoYXIgKnZlY3RvcikKLXsKLQlpbnQgICAgICAgICAgICAgcmFuZG5vOwotCWludCAgICAgICAgICAgICBpOwotCWludAkJZmQ7Ci0KLS8qIHdlbGwsIEkgYWRkZWQgdGhpcyB0byBpbmNyZWFzZSB0aGUgc2VjdXJpdHkgZm9yIHVzZXIgcGFzc3dvcmRzLgotICAgd2UgdXNlIC9kZXYvdXJhbmRvbSBoZXJlLCBhcyAvZGV2L3JhbmRvbSBtaWdodCBibG9jayBhbmQgd2UgZG9uJ3QKLSAgIG5lZWQgdGhhdCBtdWNoIHJhbmRvbW5lc3MuIEJUVywgZ3JlYXQgaWRlYSwgVGVkISAgICAgLWxmLCAwMy8xOC85NQkqLwotCi0JaWYgKChmZCA9IG9wZW4oX1BBVEhfREVWX1VSQU5ET00sIE9fUkRPTkxZKSkgPj0gMCkKLQl7Ci0JCXVuc2lnbmVkIGNoYXIgKnBvczsKLQkJaW50IHJlYWRjb3VudDsKLQotCQlpID0gQVVUSF9WRUNUT1JfTEVOOwotCQlwb3MgPSB2ZWN0b3I7Ci0JCXdoaWxlIChpID4gMCkKLQkJewotCQkJcmVhZGNvdW50ID0gcmVhZChmZCwgKGNoYXIgKilwb3MsIGkpOwotCQkJcG9zICs9IHJlYWRjb3VudDsKLQkJCWkgLT0gcmVhZGNvdW50OwotCQl9Ci0KLQkJY2xvc2UoZmQpOwotCQlyZXR1cm47Ci0JfSAvKiBlbHNlIGZhbGwgdGhyb3VnaCAqLwotCi0JZm9yIChpID0gMDsgaSA8IEFVVEhfVkVDVE9SX0xFTjspCi0JewotCQlyYW5kbm8gPSBtYWdpYygpOwotCQltZW1jcHkgKChjaGFyICopIHZlY3RvciwgKGNoYXIgKikgJnJhbmRubywgc2l6ZW9mIChpbnQpKTsKLQkJdmVjdG9yICs9IHNpemVvZiAoaW50KTsKLQkJaSArPSBzaXplb2YgKGludCk7Ci0JfQotCi0JcmV0dXJuOwotfQpkaWZmIC0tZ2l0IGEvcHBwZC9wbHVnaW5zL3JhZGl1cy91dGlsLmMgYi9wcHBkL3BsdWdpbnMvcmFkaXVzL3V0aWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY5NzZhNy4uMDAwMDAwMAotLS0gYS9wcHBkL3BsdWdpbnMvcmFkaXVzL3V0aWwuYworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiAkSWQ6IHV0aWwuYyx2IDEuMSAyMDA0LzExLzE0IDA3OjI2OjI2IHBhdWx1cyBFeHAgJAotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NSwxOTk2LDE5OTcgTGFycyBGZW5uZWJlcmcKLSAqCi0gKiBDb3B5cmlnaHQgMTk5MiBMaXZpbmdzdG9uIEVudGVycHJpc2VzLCBJbmMuCi0gKgotICogQ29weXJpZ2h0IDE5OTIsMTk5MywgMTk5NCwxOTk1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuCi0gKiBhbmQgTWVyaXQgTmV0d29yaywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkCi0gKgotICogU2VlIHRoZSBmaWxlIENPUFlSSUdIVCBmb3IgdGhlIHJlc3BlY3RpdmUgdGVybXMgYW5kIGNvbmRpdGlvbnMuCi0gKiBJZiB0aGUgZmlsZSBpcyBtaXNzaW5nIGNvbnRhY3QgbWUgYXQgbGZAZWxlbWVudGFsLm5ldAotICogYW5kIEknbGwgc2VuZCB5b3UgYSBjb3B5LgotICoKLSAqLwotCi0jaW5jbHVkZSA8aW5jbHVkZXMuaD4KLSNpbmNsdWRlIDxyYWRpdXNjbGllbnQuaD4KLQotLyoKLSAqIEZ1bmN0aW9uOiByY19zdHIydG0KLSAqCi0gKiBQdXJwb3NlOiBUdXJucyBwcmludGFibGUgc3RyaW5nIGludG8gY29ycmVjdCB0bSBzdHJ1Y3QgZW50cmllcy4KLSAqCi0gKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBtb250aHNbXSA9Ci0JCXsKLQkJCSJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCi0JCQkiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiCi0JCX07Ci0KLXZvaWQgcmNfc3RyMnRtIChjaGFyICp2YWxzdHIsIHN0cnVjdCB0bSAqdG0pCi17Ci0JaW50ICAgICAgICAgICAgIGk7Ci0KLQkvKiBHZXQgdGhlIG1vbnRoICovCi0JZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCi0JewotCQlpZiAoc3RybmNtcCAobW9udGhzW2ldLCB2YWxzdHIsIDMpID09IDApCi0JCXsKLQkJCXRtLT50bV9tb24gPSBpOwotCQkJaSA9IDEzOwotCQl9Ci0JfQotCi0JLyogR2V0IHRoZSBEYXkgKi8KLQl0bS0+dG1fbWRheSA9IGF0b2kgKCZ2YWxzdHJbNF0pOwotCi0JLyogTm93IHRoZSB5ZWFyICovCi0JdG0tPnRtX3llYXIgPSBhdG9pICgmdmFsc3RyWzddKSAtIDE5MDA7Ci19Ci0KLXZvaWQgcmNfbWRlbGF5KGludCBtc2VjcykKLXsKLQlzdHJ1Y3QgdGltZXZhbCB0djsKLQotCXR2LnR2X3NlYyA9IChpbnQpIG1zZWNzIC8gMTAwMDsKLQl0di50dl91c2VjID0gKG1zZWNzICUgMTAwMCkgKiAxMDAwOwotCi0Jc2VsZWN0KDAsKGZkX3NldCAqKU5VTEwsKGZkX3NldCAqKU5VTEwsKGZkX3NldCAqKU5VTEwsICZ0dik7Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbjogcmNfbWtzaWQKLSAqCi0gKiBQdXJwb3NlOiBnZW5lcmF0ZSBhIHF1aXRlIHVuaXF1ZSBzdHJpbmcKLSAqCi0gKiBSZW1hcmtzOiBub3QgdGhhdCB1bmlxdWUgYXQgYWxsLi4uCi0gKgotICovCi0KLWNoYXIgKgotcmNfbWtzaWQgKHZvaWQpCi17Ci0gIHN0YXRpYyBjaGFyIGJ1ZlsxNV07Ci0gIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBpbnQgY250ID0gMDsKLSAgc3ByaW50ZiAoYnVmLCAiJTA4bFglMDRYJTAyaFgiLAotCSAgICh1bnNpZ25lZCBsb25nIGludCkgdGltZSAoTlVMTCksCi0JICAgKHVuc2lnbmVkIGludCkgZ2V0cGlkICgpLAotCSAgIGNudCAmIDB4RkYpOwotICBjbnQrKzsKLSAgcmV0dXJuIGJ1ZjsKLX0KZGlmZiAtLWdpdCBhL3BwcGQvcGx1Z2lucy9ycC1wcHBvZS9NYWtlZmlsZS5saW51eCBiL3BwcGQvcGx1Z2lucy9ycC1wcHBvZS9NYWtlZmlsZS5saW51eApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ3YTI3MS4uMDAwMDAwMAotLS0gYS9wcHBkL3BsdWdpbnMvcnAtcHBwb2UvTWFrZWZpbGUubGludXgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gTWFrZWZpbGUuaW4gYnkgY29uZmlndXJlLgotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jCi0jIE1ha2VmaWxlCi0jCi0jIE1ha2VmaWxlIGZvciBSb2FyaW5nIFBlbmd1aW4ncyBMaW51eCBQUFBvRSBwbHVnaW4uCi0jIE1vZGlmaWVkIGZvciBpbnRlZ3JhdGlvbiB3aXRoIHBwcGQgc291cmNlcyBieSBQYXVsIE1hY2tlcnJhcy4KLSMKLSMgQ29weXJpZ2h0IChDKSAyMDAxIFJvYXJpbmcgUGVuZ3VpbiBTb2Z0d2FyZSBJbmMuCi0jCi0jIFRoaXMgcHJvZ3JhbSBtYXkgYmUgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyAkSWQ6IE1ha2VmaWxlLmxpbnV4LHYgMS44IDIwMDgvMDYvMDkgMDg6MzQ6MjMgcGF1bHVzIEV4cCAkCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotREVTVERJUiA9ICQoSU5TVFJPT1QpQERFU1RESVJACi1CSU5ESVIgPSAkKERFU1RESVIpL3NiaW4KLUxJQkRJUiA9ICQoREVTVERJUikvbGliL3BwcGQvJChQUFBEVkVSU0lPTikKLQotUFBQRFZFUlNJT04gPSAkKHNoZWxsIGF3ayAtRiAnIicgJy9WRVJTSU9OLyB7IHByaW50ICQkMjsgfScgLi4vLi4vcGF0Y2hsZXZlbC5oKQotCi1JTlNUQUxMCT0gaW5zdGFsbAotCi0jIFZlcnNpb24gaXMgc2V0IE9OTFkgSU4gVEhFIE1BS0VGSUxFISAgRG9uJ3QgZGVsZXRlIHRoaXMhCi1SUF9WRVJTSU9OPTMuOHAKLQotQ09QVFM9LU8yIC1nCi1DRkxBR1M9JChDT1BUUykgLUkuLi8uLi8uLi9pbmNsdWRlICctRFJQX1ZFUlNJT049IiQoUlBfVkVSU0lPTikiJwotYWxsOiBycC1wcHBvZS5zbyBwcHBvZS1kaXNjb3ZlcnkKLQotcHBwb2UtZGlzY292ZXJ5OiBwcHBvZS1kaXNjb3ZlcnkubyBkZWJ1Zy5vCi0JJChDQykgLW8gcHBwb2UtZGlzY292ZXJ5IHBwcG9lLWRpc2NvdmVyeS5vIGRlYnVnLm8KLQotcHBwb2UtZGlzY292ZXJ5Lm86IHBwcG9lLWRpc2NvdmVyeS5jCi0JJChDQykgJChDRkxBR1MpIC1jIC1vIHBwcG9lLWRpc2NvdmVyeS5vIHBwcG9lLWRpc2NvdmVyeS5jCi0KLWRlYnVnLm86IGRlYnVnLmMKLQkkKENDKSAkKENGTEFHUykgLWMgLW8gZGVidWcubyBkZWJ1Zy5jCi0KLXJwLXBwcG9lLnNvOiBwbHVnaW4ubyBkaXNjb3ZlcnkubyBpZi5vIGNvbW1vbi5vCi0JJChDQykgLW8gcnAtcHBwb2Uuc28gLXNoYXJlZCBwbHVnaW4ubyBkaXNjb3ZlcnkubyBpZi5vIGNvbW1vbi5vCi0KLWluc3RhbGw6IGFsbAotCSQoSU5TVEFMTCkgLWQgLW0gNzU1ICQoTElCRElSKQotCSQoSU5TVEFMTCkgLXMgLWMgLW0gNDU1MCBycC1wcHBvZS5zbyAkKExJQkRJUikKLQkkKElOU1RBTEwpIC1kIC1tIDc1NSAkKEJJTkRJUikKLQkkKElOU1RBTEwpIC1zIC1jIC1tIDU1NSBwcHBvZS1kaXNjb3ZlcnkgJChCSU5ESVIpCi0KLWNsZWFuOgotCXJtIC1mICoubyAqLnNvIHBwcG9lLWRpc2NvdmVyeQotCi1wbHVnaW4ubzogcGx1Z2luLmMKLQkkKENDKSAkKENGTEFHUykgLUkuLi8uLi8uLiAtYyAtbyBwbHVnaW4ubyAtZlBJQyBwbHVnaW4uYwotCi1kaXNjb3ZlcnkubzogZGlzY292ZXJ5LmMKLQkkKENDKSAkKENGTEFHUykgLUkuLi8uLi8uLiAtYyAtbyBkaXNjb3ZlcnkubyAtZlBJQyBkaXNjb3ZlcnkuYwotCi1pZi5vOiBpZi5jCi0JJChDQykgJChDRkxBR1MpIC1JLi4vLi4vLi4gLWMgLW8gaWYubyAtZlBJQyBpZi5jCi0KLWNvbW1vbi5vOiBjb21tb24uYwotCSQoQ0MpICQoQ0ZMQUdTKSAtSS4uLy4uLy4uIC1jIC1vIGNvbW1vbi5vIC1mUElDIGNvbW1vbi5jCi0KZGlmZiAtLWdpdCBhL3BwcGQvcGx1Z2lucy9ycC1wcHBvZS9jb21tb24uYyBiL3BwcGQvcGx1Z2lucy9ycC1wcHBvZS9jb21tb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljNjMzYy4uMDAwMDAwMAotLS0gYS9wcHBkL3BsdWdpbnMvcnAtcHBwb2UvY29tbW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGNvbW1vbi5jCi0qCi0qIEltcGxlbWVudGF0aW9uIG9mIHVzZXItc3BhY2UgUFBQb0UgcmVkaXJlY3RvciBmb3IgTGludXguCi0qCi0qIENvbW1vbiBmdW5jdGlvbnMgdXNlZCBieSBQUFBvRSBjbGllbnQgYW5kIHNlcnZlcgotKgotKiBDb3B5cmlnaHQgKEMpIDIwMDAgYnkgUm9hcmluZyBQZW5ndWluIFNvZnR3YXJlIEluYy4KLSoKLSogVGhpcyBwcm9ncmFtIG1heSBiZSBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUKLSogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGNoYXIgY29uc3QgUkNTSURbXSA9Ci0iJElkOiBjb21tb24uYyx2IDEuMyAyMDA4LzA2LzA5IDA4OjM0OjIzIHBhdWx1cyBFeHAgJCI7Ci0KLSNkZWZpbmUgX0dOVV9TT1VSQ0UgMQotI2luY2x1ZGUgInBwcG9lLmgiCi0jaW5jbHVkZSAicHBwZC9wcHBkLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5c2xvZy5oPgkvKiBmb3IgTE9HX0RFQlVHICovCi0KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSolRlVOQ1RJT046IHBhcnNlUGFja2V0Ci0qJUFSR1VNRU5UUzoKLSogcGFja2V0IC0tIHRoZSBQUFBvRSBkaXNjb3ZlcnkgcGFja2V0IHRvIHBhcnNlCi0qIGZ1bmMgLS0gZnVuY3Rpb24gY2FsbGVkIGZvciBlYWNoIHRhZyBpbiB0aGUgcGFja2V0Ci0qIGV4dHJhIC0tIGFuIG9wYXF1ZSBkYXRhIHBvaW50ZXIgc3VwcGxpZWQgdG8gcGFyc2luZyBmdW5jdGlvbgotKiVSRVRVUk5TOgotKiAwIGlmIGV2ZXJ5dGhpbmcgd2VudCB3ZWxsOyAtMSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IKLSolREVTQ1JJUFRJT046Ci0qIFBhcnNlcyBhIFBQUG9FIGRpc2NvdmVyeSBwYWNrZXQsIGNhbGxpbmcgImZ1bmMiIGZvciBlYWNoIHRhZyBpbiB0aGUgcGFja2V0LgotKiAiZnVuYyIgaXMgcGFzc2VkIHRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50ICJleHRyYSIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludAotcGFyc2VQYWNrZXQoUFBQb0VQYWNrZXQgKnBhY2tldCwgUGFyc2VGdW5jICpmdW5jLCB2b2lkICpleHRyYSkKLXsKLSAgICBVSU5UMTZfdCBsZW4gPSBudG9ocyhwYWNrZXQtPmxlbmd0aCk7Ci0gICAgdW5zaWduZWQgY2hhciAqY3VyVGFnOwotICAgIFVJTlQxNl90IHRhZ1R5cGUsIHRhZ0xlbjsKLQotICAgIGlmIChQUFBPRV9WRVIocGFja2V0LT52ZXJ0eXBlKSAhPSAxKSB7Ci0JZXJyb3IoIkludmFsaWQgUFBQb0UgdmVyc2lvbiAoJWQpIiwgUFBQT0VfVkVSKHBhY2tldC0+dmVydHlwZSkpOwotCXJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKFBQUE9FX1RZUEUocGFja2V0LT52ZXJ0eXBlKSAhPSAxKSB7Ci0JZXJyb3IoIkludmFsaWQgUFBQb0UgdHlwZSAoJWQpIiwgUFBQT0VfVFlQRShwYWNrZXQtPnZlcnR5cGUpKTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogRG8gc29tZSBzYW5pdHkgY2hlY2tzIG9uIHBhY2tldCAqLwotICAgIGlmIChsZW4gPiBFVEhfSlVNQk9fTEVOIC0gUFBQT0VfT1ZFUkhFQUQpIHsgLyogNi1ieXRlIG92ZXJoZWFkIGZvciBQUFBvRSBoZWFkZXIgKi8KLQllcnJvcigiSW52YWxpZCBQUFBvRSBwYWNrZXQgbGVuZ3RoICgldSkiLCBsZW4pOwotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBTdGVwIHRocm91Z2ggdGhlIHRhZ3MgKi8KLSAgICBjdXJUYWcgPSBwYWNrZXQtPnBheWxvYWQ7Ci0gICAgd2hpbGUoY3VyVGFnIC0gcGFja2V0LT5wYXlsb2FkIDwgbGVuKSB7Ci0JLyogQWxpZ25tZW50IGlzIG5vdCBndWFyYW50ZWVkLCBzbyBkbyB0aGlzIGJ5IGhhbmQuLi4gKi8KLQl0YWdUeXBlID0gKGN1clRhZ1swXSA8PCA4KSArIGN1clRhZ1sxXTsKLQl0YWdMZW4gPSAoY3VyVGFnWzJdIDw8IDgpICsgY3VyVGFnWzNdOwotCWlmICh0YWdUeXBlID09IFRBR19FTkRfT0ZfTElTVCkgewotCSAgICByZXR1cm4gMDsKLQl9Ci0JaWYgKChjdXJUYWcgLSBwYWNrZXQtPnBheWxvYWQpICsgdGFnTGVuICsgVEFHX0hEUl9TSVpFID4gbGVuKSB7Ci0JICAgIGVycm9yKCJJbnZhbGlkIFBQUG9FIHRhZyBsZW5ndGggKCV1KSIsIHRhZ0xlbik7Ci0JICAgIHJldHVybiAtMTsKLQl9Ci0JZnVuYyh0YWdUeXBlLCB0YWdMZW4sIGN1clRhZytUQUdfSERSX1NJWkUsIGV4dHJhKTsKLQljdXJUYWcgPSBjdXJUYWcgKyBUQUdfSERSX1NJWkUgKyB0YWdMZW47Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSolRlVOQ1RJT046IHNlbmRQQURUCi0qJUFSR1VNRU5UUzoKLSogY29ubiAtLSBQUFBvRSBjb25uZWN0aW9uCi0qIG1zZyAtLSBpZiBub24tTlVMTCwgZXh0cmEgZXJyb3IgbWVzc2FnZSB0byBpbmNsdWRlIGluIFBBRFQgcGFja2V0LgotKiVSRVRVUk5TOgotKiBOb3RoaW5nCi0qJURFU0NSSVBUSU9OOgotKiBTZW5kcyBhIFBBRFQgcGFja2V0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLXNlbmRQQURUKFBQUG9FQ29ubmVjdGlvbiAqY29ubiwgY2hhciBjb25zdCAqbXNnKQotewotICAgIFBQUG9FUGFja2V0IHBhY2tldDsKLSAgICB1bnNpZ25lZCBjaGFyICpjdXJzb3IgPSBwYWNrZXQucGF5bG9hZDsKLQotICAgIFVJTlQxNl90IHBsZW4gPSAwOwotCi0gICAgLyogRG8gbm90aGluZyBpZiBubyBzZXNzaW9uIGVzdGFibGlzaGVkIHlldCAqLwotICAgIGlmICghY29ubi0+c2Vzc2lvbikgcmV0dXJuOwotCi0gICAgLyogRG8gbm90aGluZyBpZiBubyBkaXNjb3Zlcnkgc29ja2V0ICovCi0gICAgaWYgKGNvbm4tPmRpc2NvdmVyeVNvY2tldCA8IDApIHJldHVybjsKLQotICAgIG1lbWNweShwYWNrZXQuZXRoSGRyLmhfZGVzdCwgY29ubi0+cGVlckV0aCwgRVRIX0FMRU4pOwotICAgIG1lbWNweShwYWNrZXQuZXRoSGRyLmhfc291cmNlLCBjb25uLT5teUV0aCwgRVRIX0FMRU4pOwotCi0gICAgcGFja2V0LmV0aEhkci5oX3Byb3RvID0gaHRvbnMoRXRoX1BQUE9FX0Rpc2NvdmVyeSk7Ci0gICAgcGFja2V0LnZlcnR5cGUgPSBQUFBPRV9WRVJfVFlQRSgxLCAxKTsKLSAgICBwYWNrZXQuY29kZSA9IENPREVfUEFEVDsKLSAgICBwYWNrZXQuc2Vzc2lvbiA9IGNvbm4tPnNlc3Npb247Ci0KLSAgICAvKiBSZXNldCBTZXNzaW9uIHRvIHplcm8gc28gdGhlcmUgaXMgbm8gcG9zc2liaWxpdHkgb2YKLSAgICAgICByZWN1cnNpdmUgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBieSBhbnkgc2lnbmFsIGhhbmRsZXIgKi8KLSAgICBjb25uLT5zZXNzaW9uID0gMDsKLQotICAgIC8qIElmIHdlJ3JlIHVzaW5nIEhvc3QtVW5pcSwgY29weSBpdCBvdmVyICovCi0gICAgaWYgKGNvbm4tPnVzZUhvc3RVbmlxKSB7Ci0JUFBQb0VUYWcgaG9zdFVuaXE7Ci0JcGlkX3QgcGlkID0gZ2V0cGlkKCk7Ci0JaG9zdFVuaXEudHlwZSA9IGh0b25zKFRBR19IT1NUX1VOSVEpOwotCWhvc3RVbmlxLmxlbmd0aCA9IGh0b25zKHNpemVvZihwaWQpKTsKLQltZW1jcHkoaG9zdFVuaXEucGF5bG9hZCwgJnBpZCwgc2l6ZW9mKHBpZCkpOwotCW1lbWNweShjdXJzb3IsICZob3N0VW5pcSwgc2l6ZW9mKHBpZCkgKyBUQUdfSERSX1NJWkUpOwotCWN1cnNvciArPSBzaXplb2YocGlkKSArIFRBR19IRFJfU0laRTsKLQlwbGVuICs9IHNpemVvZihwaWQpICsgVEFHX0hEUl9TSVpFOwotICAgIH0KLQotICAgIC8qIENvcHkgZXJyb3IgbWVzc2FnZSAqLwotICAgIGlmIChtc2cpIHsKLQlQUFBvRVRhZyBlcnI7Ci0Jc2l6ZV90IGVsZW4gPSBzdHJsZW4obXNnKTsKLQllcnIudHlwZSA9IGh0b25zKFRBR19HRU5FUklDX0VSUk9SKTsKLQllcnIubGVuZ3RoID0gaHRvbnMoZWxlbik7Ci0Jc3RyY3B5KGVyci5wYXlsb2FkLCBtc2cpOwotCW1lbWNweShjdXJzb3IsICZlcnIsIGVsZW4gKyBUQUdfSERSX1NJWkUpOwotCWN1cnNvciArPSBlbGVuICsgVEFHX0hEUl9TSVpFOwotCXBsZW4gKz0gZWxlbiArIFRBR19IRFJfU0laRTsKLSAgICB9Ci0KLSAgICAvKiBDb3B5IGNvb2tpZSBhbmQgcmVsYXktSUQgaWYgbmVlZGVkICovCi0gICAgaWYgKGNvbm4tPmNvb2tpZS50eXBlKSB7Ci0JQ0hFQ0tfUk9PTShjdXJzb3IsIHBhY2tldC5wYXlsb2FkLAotCQkgICBudG9ocyhjb25uLT5jb29raWUubGVuZ3RoKSArIFRBR19IRFJfU0laRSk7Ci0JbWVtY3B5KGN1cnNvciwgJmNvbm4tPmNvb2tpZSwgbnRvaHMoY29ubi0+Y29va2llLmxlbmd0aCkgKyBUQUdfSERSX1NJWkUpOwotCWN1cnNvciArPSBudG9ocyhjb25uLT5jb29raWUubGVuZ3RoKSArIFRBR19IRFJfU0laRTsKLQlwbGVuICs9IG50b2hzKGNvbm4tPmNvb2tpZS5sZW5ndGgpICsgVEFHX0hEUl9TSVpFOwotICAgIH0KLQotICAgIGlmIChjb25uLT5yZWxheUlkLnR5cGUpIHsKLQlDSEVDS19ST09NKGN1cnNvciwgcGFja2V0LnBheWxvYWQsCi0JCSAgIG50b2hzKGNvbm4tPnJlbGF5SWQubGVuZ3RoKSArIFRBR19IRFJfU0laRSk7Ci0JbWVtY3B5KGN1cnNvciwgJmNvbm4tPnJlbGF5SWQsIG50b2hzKGNvbm4tPnJlbGF5SWQubGVuZ3RoKSArIFRBR19IRFJfU0laRSk7Ci0JY3Vyc29yICs9IG50b2hzKGNvbm4tPnJlbGF5SWQubGVuZ3RoKSArIFRBR19IRFJfU0laRTsKLQlwbGVuICs9IG50b2hzKGNvbm4tPnJlbGF5SWQubGVuZ3RoKSArIFRBR19IRFJfU0laRTsKLSAgICB9Ci0KLSAgICBwYWNrZXQubGVuZ3RoID0gaHRvbnMocGxlbik7Ci0gICAgc2VuZFBhY2tldChjb25uLCBjb25uLT5kaXNjb3ZlcnlTb2NrZXQsICZwYWNrZXQsIChpbnQpIChwbGVuICsgSERSX1NJWkUpKTsKLSAgICBpbmZvKCJTZW50IFBBRFQiKTsKLX0KLQotI2RlZmluZSBFSCh4KQkoeClbMF0sICh4KVsxXSwgKHgpWzJdLCAoeClbM10sICh4KVs0XSwgKHgpWzVdCi0KLS8qIFByaW50IG91dCBhIFBQUE9FIHBhY2tldCBmb3IgZGVidWdnaW5nICovCi12b2lkIHBwcG9lX3ByaW50cGt0KFBQUG9FUGFja2V0ICpwYWNrZXQsCi0JCSAgICB2b2lkICgqcHJpbnRlcikodm9pZCAqLCBjaGFyICosIC4uLiksIHZvaWQgKmFyZykKLXsKLSAgICBpbnQgbGVuID0gbnRvaHMocGFja2V0LT5sZW5ndGgpOwotICAgIGludCBpLCB0YWcsIHRsZW4sIHRleHQ7Ci0KLSAgICBzd2l0Y2ggKG50b2hzKHBhY2tldC0+ZXRoSGRyLmhfcHJvdG8pKSB7Ci0gICAgY2FzZSBFVEhfUFBQT0VfRElTQ09WRVJZOgotCXByaW50ZXIoYXJnLCAiUFBQT0UgRGlzY292ZXJ5IFYlZFQlZCAiLCBQUFBPRV9WRVIocGFja2V0LT52ZXJ0eXBlKSwKLQkJUFBQT0VfVFlQRShwYWNrZXQtPnZlcnR5cGUpKTsKLQlzd2l0Y2ggKHBhY2tldC0+Y29kZSkgewotCWNhc2UgQ09ERV9QQURJOgotCSAgICBwcmludGVyKGFyZywgIlBBREkiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDT0RFX1BBRE86Ci0JICAgIHByaW50ZXIoYXJnLCAiUEFETyIpOwotCSAgICBicmVhazsKLQljYXNlIENPREVfUEFEUjoKLQkgICAgcHJpbnRlcihhcmcsICJQQURSIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ09ERV9QQURTOgotCSAgICBwcmludGVyKGFyZywgIlBBRFMiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDT0RFX1BBRFQ6Ci0JICAgIHByaW50ZXIoYXJnLCAiUEFEVCIpOwotCSAgICBicmVhazsKLQlkZWZhdWx0OgotCSAgICBwcmludGVyKGFyZywgInVua25vd24gY29kZSAleCIsIHBhY2tldC0+Y29kZSk7Ci0JfQotCXByaW50ZXIoYXJnLCAiIHNlc3Npb24gMHgleCBsZW5ndGggJWRcbiIsIG50b2hzKHBhY2tldC0+c2Vzc2lvbiksIGxlbik7Ci0JYnJlYWs7Ci0gICAgY2FzZSBFVEhfUFBQT0VfU0VTU0lPTjoKLQlwcmludGVyKGFyZywgIlBQUE9FIFNlc3Npb24gViVkVCVkIiwgUFBQT0VfVkVSKHBhY2tldC0+dmVydHlwZSksCi0JCVBQUE9FX1RZUEUocGFja2V0LT52ZXJ0eXBlKSk7Ci0JcHJpbnRlcihhcmcsICIgY29kZSAweCV4IHNlc3Npb24gMHgleCBsZW5ndGggJWRcbiIsIHBhY2tldC0+Y29kZSwKLQkJbnRvaHMocGFja2V0LT5zZXNzaW9uKSwgbGVuKTsKLQlicmVhazsKLSAgICBkZWZhdWx0OgotCXByaW50ZXIoYXJnLCAiVW5rbm93biBldGhlcm5ldCBmcmFtZSB3aXRoIHByb3RvID0gMHgleFxuIiwKLQkJbnRvaHMocGFja2V0LT5ldGhIZHIuaF9wcm90bykpOwotICAgIH0KLQotICAgIHByaW50ZXIoYXJnLCAiIGRzdCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAiLCBFSChwYWNrZXQtPmV0aEhkci5oX2Rlc3QpKTsKLSAgICBwcmludGVyKGFyZywgIiBzcmMgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsIEVIKHBhY2tldC0+ZXRoSGRyLmhfc291cmNlKSk7Ci0gICAgaWYgKG50b2hzKHBhY2tldC0+ZXRoSGRyLmhfcHJvdG8pICE9IEVUSF9QUFBPRV9ESVNDT1ZFUlkpCi0JcmV0dXJuOwotCi0gICAgZm9yIChpID0gMDsgaSArIFRBR19IRFJfU0laRSA8PSBsZW47IGkgKz0gdGxlbikgewotCXRhZyA9IChwYWNrZXQtPnBheWxvYWRbaV0gPDwgOCkgKyBwYWNrZXQtPnBheWxvYWRbaSsxXTsKLQl0bGVuID0gKHBhY2tldC0+cGF5bG9hZFtpKzJdIDw8IDgpICsgcGFja2V0LT5wYXlsb2FkW2krM107Ci0JaWYgKGkgKyB0bGVuICsgVEFHX0hEUl9TSVpFID4gbGVuKQotCSAgICBicmVhazsKLQl0ZXh0ID0gMDsKLQlpICs9IFRBR19IRFJfU0laRTsKLQlwcmludGVyKGFyZywgIiBbIik7Ci0Jc3dpdGNoICh0YWcpIHsKLQljYXNlIFRBR19FTkRfT0ZfTElTVDoKLQkgICAgcHJpbnRlcihhcmcsICJlbmQtb2YtbGlzdCIpOwotCSAgICBicmVhazsKLQljYXNlIFRBR19TRVJWSUNFX05BTUU6Ci0JICAgIHByaW50ZXIoYXJnLCAic2VydmljZS1uYW1lIik7Ci0JICAgIHRleHQgPSAxOwotCSAgICBicmVhazsKLQljYXNlIFRBR19BQ19OQU1FOgotCSAgICBwcmludGVyKGFyZywgIkFDLW5hbWUiKTsKLQkgICAgdGV4dCA9IDE7Ci0JICAgIGJyZWFrOwotCWNhc2UgVEFHX0hPU1RfVU5JUToKLQkgICAgcHJpbnRlcihhcmcsICJob3N0LXVuaXEiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBUQUdfQUNfQ09PS0lFOgotCSAgICBwcmludGVyKGFyZywgIkFDLWNvb2tpZSIpOwotCSAgICBicmVhazsKLQljYXNlIFRBR19WRU5ET1JfU1BFQ0lGSUM6Ci0JICAgIHByaW50ZXIoYXJnLCAidmVuZG9yLXNwZWNpZmljIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgVEFHX1JFTEFZX1NFU1NJT05fSUQ6Ci0JICAgIHByaW50ZXIoYXJnLCAicmVsYXktc2Vzc2lvbi1pZCIpOwotCSAgICBicmVhazsKLQljYXNlIFRBR19QUFBfTUFYX1BBWUxPQUQ6Ci0JICAgIHByaW50ZXIoYXJnLCAiUFBQLW1heC1wYXlsb2FkIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgVEFHX1NFUlZJQ0VfTkFNRV9FUlJPUjoKLQkgICAgcHJpbnRlcihhcmcsICJzZXJ2aWNlLW5hbWUtZXJyb3IiKTsKLQkgICAgdGV4dCA9IDE7Ci0JICAgIGJyZWFrOwotCWNhc2UgVEFHX0FDX1NZU1RFTV9FUlJPUjoKLQkgICAgcHJpbnRlcihhcmcsICJBQy1zeXN0ZW0tZXJyb3IiKTsKLQkgICAgdGV4dCA9IDE7Ci0JICAgIGJyZWFrOwotCWNhc2UgVEFHX0dFTkVSSUNfRVJST1I6Ci0JICAgIHByaW50ZXIoYXJnLCAiZ2VuZXJpYy1lcnJvciIpOwotCSAgICB0ZXh0ID0gMTsKLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICAgcHJpbnRlcihhcmcsICJ1bmtub3duIHRhZyAweCV4IiwgdGFnKTsKLQl9Ci0JaWYgKHRsZW4pIHsKLQkgICAgaWYgKHRleHQpCi0JCXByaW50ZXIoYXJnLCAiICUuKnYiLCB0bGVuLCAmcGFja2V0LT5wYXlsb2FkW2ldKTsKLQkgICAgZWxzZSBpZiAodGxlbiA8PSAzMikKLQkJcHJpbnRlcihhcmcsICIgJS4qQiIsIHRsZW4sICZwYWNrZXQtPnBheWxvYWRbaV0pOwotCSAgICBlbHNlCi0JCXByaW50ZXIoYXJnLCAiICUuMzJCLi4uIChsZW5ndGggJWQpIiwKLQkJCSZwYWNrZXQtPnBheWxvYWRbaV0sIHRsZW4pOwotCX0KLQlwcmludGVyKGFyZywgIl0iKTsKLSAgICB9Ci0gICAgcHJpbnRlcihhcmcsICJcbiIpOwotfQotCi12b2lkIHBwcG9lX2xvZ19wYWNrZXQoY29uc3QgY2hhciAqcHJlZml4LCBQUFBvRVBhY2tldCAqcGFja2V0KQotewotICAgIGluaXRfcHJfbG9nKHByZWZpeCwgTE9HX0RFQlVHKTsKLSAgICBwcHBvZV9wcmludHBrdChwYWNrZXQsIHByX2xvZywgTlVMTCk7Ci0gICAgZW5kX3ByX2xvZygpOwotfQpkaWZmIC0tZ2l0IGEvcHBwZC9wbHVnaW5zL3JwLXBwcG9lL2NvbmZpZy5oIGIvcHBwZC9wbHVnaW5zL3JwLXBwcG9lL2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGJlZDNkLi4wMDAwMDAwCi0tLSBhL3BwcGQvcGx1Z2lucy9ycC1wcHBvZS9jb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKiBjb25maWcuaC4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovCi0vKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCi0vKiAjdW5kZWYgY29uc3QgKi8KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxzeXMvd2FpdC5oPiB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZS4gICovCi0jZGVmaW5lIEhBVkVfU1lTX1dBSVRfSCAxCi0KLS8qIERlZmluZSB0byBgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLS8qICN1bmRlZiBwaWRfdCAqLwotCi0vKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoaW50IG9yIHZvaWQpLiAgKi8KLSNkZWZpbmUgUkVUU0lHVFlQRSB2b2lkCi0KLS8qIERlZmluZSBpZiB0aGUgc2V0dmJ1ZiBmdW5jdGlvbiB0YWtlcyB0aGUgYnVmZmVyaW5nIHR5cGUgYXMgaXRzIHNlY29uZAotICAgYXJndW1lbnQgYW5kIHRoZSBidWZmZXIgcG9pbnRlciBhcyB0aGUgdGhpcmQsIGFzIG9uIFN5c3RlbSBWCi0gICBiZWZvcmUgcmVsZWFzZSAzLiAgKi8KLS8qICN1bmRlZiBTRVRWQlVGX1JFVkVSU0VEICovCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi0KLS8qIERlZmluZSBpZiB5b3UgY2FuIHNhZmVseSBpbmNsdWRlIGJvdGggPHN5cy90aW1lLmg+IGFuZCA8dGltZS5oPi4gICovCi0jZGVmaW5lIFRJTUVfV0lUSF9TWVNfVElNRSAxCi0KLS8qIERlZmluZSBpZiB5b3VyIDxzeXMvdGltZS5oPiBkZWNsYXJlcyBzdHJ1Y3QgdG0uICAqLwotLyogI3VuZGVmIFRNX0lOX1NZU19USU1FICovCi0KLSNkZWZpbmUgSEFWRV9TVFJVQ1RfU09DS0FERFJfTEwgMQotCi0vKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgdW5zaWduZWQgaW50LiAgKi8KLSNkZWZpbmUgU0laRU9GX1VOU0lHTkVEX0lOVCA0Ci0KLS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSB1bnNpZ25lZCBsb25nLiAgKi8KLSNkZWZpbmUgU0laRU9GX1VOU0lHTkVEX0xPTkcgNAotCi0vKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgdW5zaWduZWQgc2hvcnQuICAqLwotI2RlZmluZSBTSVpFT0ZfVU5TSUdORURfU0hPUlQgMgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNlbGVjdCBmdW5jdGlvbi4gICovCi0jZGVmaW5lIEhBVkVfU0VMRUNUIDEKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzb2NrZXQgZnVuY3Rpb24uICAqLwotI2RlZmluZSBIQVZFX1NPQ0tFVCAxCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyZXJyb3IgZnVuY3Rpb24uICAqLwotI2RlZmluZSBIQVZFX1NUUkVSUk9SIDEKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJ0b2wgZnVuY3Rpb24uICAqLwotI2RlZmluZSBIQVZFX1NUUlRPTCAxCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFzbS90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfQVNNX1RZUEVTX0ggMQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfRkNOVExfSCAxCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGdldG9wdC5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfR0VUT1BUX0ggMQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW51eC9pZl9ldGhlci5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfTElOVVhfSUZfRVRIRVJfSCAxCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBrZXJuZWwtbW9kZSBQUFBvRSBpbiBMaW51eCBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9MSU5VWF9LRVJORUxfUFBQT0UgMQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW51eC9pZl9wYWNrZXQuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX0xJTlVYX0lGX1BBQ0tFVF9IIDEKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGludXgvaWZfcHBwb3guaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX0xJTlVYX0lGX1BQUE9YX0ggMQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxuZXQvYnBmLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9ORVRfQlBGX0ggMQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxuZXQvaWZfYXJwLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9ORVRfSUZfQVJQX0ggMQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxuZXQvZXRoZXJuZXQuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX05FVF9FVEhFUk5FVF9IIDEKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmV0L2lmLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9ORVRfSUZfSCAxCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbnV4L2lmLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9MSU5VWF9JRl9IIDEKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmV0L2lmX2RsLmg+IGhlYWRlciBmaWxlLiAgKi8KLS8qICN1bmRlZiBIQVZFX05FVF9JRl9ETF9IICovCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5ldC9pZl9ldGhlci5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfTkVUX0lGX0VUSEVSX0ggMQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxuZXQvaWZfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX05FVF9JRl9UWVBFU19IIDEKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmV0aW5ldC9pZl9ldGhlci5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfTkVUSU5FVF9JRl9FVEhFUl9IIDEKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmV0cGFja2V0L3BhY2tldC5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfTkVUUEFDS0VUX1BBQ0tFVF9IIDEKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2NkZWZzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TWVNfQ0RFRlNfSCAxCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9kbHBpLmg+IGhlYWRlciBmaWxlLiAgKi8KLS8qICN1bmRlZiBIQVZFX1NZU19ETFBJX0ggKi8KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2lvY3RsLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TWVNfSU9DVExfSCAxCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvc29ja2V0Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TWVNfU09DS0VUX0ggMQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1lTX1RJTUVfSCAxCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy91aW8uaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NZU19VSU9fSCAxCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5c2xvZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1lTTE9HX0ggMQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBOX0hETEMgbGluZSBkaXNjaXBsaW5lIGluIGxpbnV4L3Rlcm1pb3MuaCAqLwotI2RlZmluZSBIQVZFX05fSERMQyAxCmRpZmYgLS1naXQgYS9wcHBkL3BsdWdpbnMvcnAtcHBwb2UvZGVidWcuYyBiL3BwcGQvcGx1Z2lucy9ycC1wcHBvZS9kZWJ1Zy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmU2OTgxLi4wMDAwMDAwCi0tLSBhL3BwcGQvcGx1Z2lucy9ycC1wcHBvZS9kZWJ1Zy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBkZWJ1Zy5jCi0qCi0qIEltcGxlbWVudGF0aW9uIG9mIHVzZXItc3BhY2UgUFBQb0UgcmVkaXJlY3RvciBmb3IgTGludXguCi0qCi0qIEZ1bmN0aW9ucyBmb3IgcHJpbnRpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uCi0qCi0qIENvcHlyaWdodCAoQykgMjAwMCBieSBSb2FyaW5nIFBlbmd1aW4gU29mdHdhcmUgSW5jLgotKgotKiBUaGlzIHByb2dyYW0gbWF5IGJlIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVQotKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgY2hhciBjb25zdCBSQ1NJRFtdID0KLSIkSWQ6IGRlYnVnLmMsdiAxLjIgMjAwOC8wNi8wOSAwODozNDoyMyBwYXVsdXMgRXhwICQiOwotCi0jaW5jbHVkZSAicHBwb2UuaCIKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiVGVU5DVElPTjogZHVtcEhleAotKiVBUkdVTUVOVFM6Ci0qIGZwIC0tIGZpbGUgdG8gZHVtcCB0bwotKiBidWYgLS0gYnVmZmVyIHRvIGR1bXAKLSogbGVuIC0tIGxlbmd0aCBvZiBkYXRhCi0qJVJFVFVSTlM6Ci0qIE5vdGhpbmcKLSolREVTQ1JJUFRJT046Ci0qIER1bXBzIGJ1ZmZlciB0byBmcCBpbiBhbiBlYXN5LXRvLXJlYWQgZm9ybWF0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLWR1bXBIZXgoRklMRSAqZnAsIHVuc2lnbmVkIGNoYXIgY29uc3QgKmJ1ZiwgaW50IGxlbikKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgYmFzZTsKLQotICAgIGlmICghZnApIHJldHVybjsKLQotICAgIC8qIGRvIE5PVCBkdW1wIFBBUCBwYWNrZXRzICovCi0gICAgaWYgKGxlbiA+PSAyICYmIGJ1ZlswXSA9PSAweEMwICYmIGJ1ZlsxXSA9PSAweDIzKSB7Ci0JZnByaW50ZihmcCwgIihQQVAgQXV0aGVudGljYXRpb24gRnJhbWUgLS0gQ29udGVudHMgbm90IGR1bXBlZClcbiIpOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKGJhc2U9MDsgYmFzZTxsZW47IGJhc2UgKz0gMTYpIHsKLQlmb3IgKGk9YmFzZTsgaTxiYXNlKzE2OyBpKyspIHsKLQkgICAgaWYgKGkgPCBsZW4pIHsKLQkJZnByaW50ZihmcCwgIiUwMnggIiwgKHVuc2lnbmVkKSBidWZbaV0pOwotCSAgICB9IGVsc2UgewotCQlmcHJpbnRmKGZwLCAiICAgIik7Ci0JICAgIH0KLQl9Ci0JZnByaW50ZihmcCwgIiAgIik7Ci0JZm9yIChpPWJhc2U7IGk8YmFzZSsxNjsgaSsrKSB7Ci0JICAgIGlmIChpIDwgbGVuKSB7Ci0JCWlmIChpc3ByaW50KGJ1ZltpXSkpIHsKLQkJICAgIGZwcmludGYoZnAsICIlYyIsIGJ1ZltpXSk7Ci0JCX0gZWxzZSB7Ci0JCSAgICBmcHJpbnRmKGZwLCAiLiIpOwotCQl9Ci0JICAgIH0gZWxzZSB7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotCWZwcmludGYoZnAsICJcbiIpOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSolRlVOQ1RJT046IGR1bXBQYWNrZXQKLSolQVJHVU1FTlRTOgotKiBmcCAtLSBmaWxlIHRvIGR1bXAgdG8KLSogcGFja2V0IC0tIGEgUFBQb0UgcGFja2V0Ci0qIGRpciAtLSBlaXRoZXIgU0VOVCBvciBSQ1ZECi0qJVJFVFVSTlM6Ci0qIE5vdGhpbmcKLSolREVTQ1JJUFRJT046Ci0qIER1bXBzIHRoZSBQUFBvRSBwYWNrZXQgdG8gZnAgaW4gYW4gZWFzeS10by1yZWFkIGZvcm1hdAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1kdW1wUGFja2V0KEZJTEUgKmZwLCBQUFBvRVBhY2tldCAqcGFja2V0LCBjaGFyIGNvbnN0ICpkaXIpCi17Ci0gICAgaW50IGxlbiA9IG50b2hzKHBhY2tldC0+bGVuZ3RoKTsKLQotICAgIC8qIFNoZWVzaC4uLiBwcmludGluZyB0aW1lcyBpcyBhIHBhaW4uLi4gKi8KLSAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICB0aW1lX3Qgbm93OwotICAgIGludCBtaWxsaXNlYzsKLSAgICBzdHJ1Y3QgdG0gKmx0OwotICAgIGNoYXIgdGltZWJ1ZlsyNTZdOwotCi0gICAgVUlOVDE2X3QgdHlwZSA9IGV0aGVyVHlwZShwYWNrZXQpOwotICAgIGlmICghZnApIHJldHVybjsKLSAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKLSAgICBub3cgPSAodGltZV90KSB0di50dl9zZWM7Ci0gICAgbWlsbGlzZWMgPSB0di50dl91c2VjIC8gMTAwMDsKLSAgICBsdCA9IGxvY2FsdGltZSgmbm93KTsKLSAgICBzdHJmdGltZSh0aW1lYnVmLCAyNTYsICIlSDolTTolUyIsIGx0KTsKLSAgICBmcHJpbnRmKGZwLCAiJXMuJTAzZCAlcyBQUFBvRSAiLCB0aW1lYnVmLCBtaWxsaXNlYywgZGlyKTsKLSAgICBpZiAodHlwZSA9PSBFdGhfUFBQT0VfRGlzY292ZXJ5KSB7Ci0JZnByaW50ZihmcCwgIkRpc2NvdmVyeSAoJXgpICIsICh1bnNpZ25lZCkgdHlwZSk7Ci0gICAgfSBlbHNlIGlmICh0eXBlID09IEV0aF9QUFBPRV9TZXNzaW9uKSB7Ci0JZnByaW50ZihmcCwgIlNlc3Npb24gKCV4KSAiLCAodW5zaWduZWQpIHR5cGUpOwotICAgIH0gZWxzZSB7Ci0JZnByaW50ZihmcCwgIlVua25vd24gKCV4KSAiLCAodW5zaWduZWQpIHR5cGUpOwotICAgIH0KLQotICAgIHN3aXRjaChwYWNrZXQtPmNvZGUpIHsKLSAgICBjYXNlIENPREVfUEFESTogZnByaW50ZihmcCwgIlBBREkgIik7IGJyZWFrOwotICAgIGNhc2UgQ09ERV9QQURPOiBmcHJpbnRmKGZwLCAiUEFETyAiKTsgYnJlYWs7Ci0gICAgY2FzZSBDT0RFX1BBRFI6IGZwcmludGYoZnAsICJQQURSICIpOyBicmVhazsKLSAgICBjYXNlIENPREVfUEFEUzogZnByaW50ZihmcCwgIlBBRFMgIik7IGJyZWFrOwotICAgIGNhc2UgQ09ERV9QQURUOiBmcHJpbnRmKGZwLCAiUEFEVCAiKTsgYnJlYWs7Ci0gICAgY2FzZSBDT0RFX1BBRE06IGZwcmludGYoZnAsICJQQURNICIpOyBicmVhazsKLSAgICBjYXNlIENPREVfUEFETjogZnByaW50ZihmcCwgIlBBRE4gIik7IGJyZWFrOwotICAgIGNhc2UgQ09ERV9TRVNTOiBmcHJpbnRmKGZwLCAiU0VTUyAiKTsgYnJlYWs7Ci0gICAgfQotCi0gICAgZnByaW50ZihmcCwgInNlc3MtaWQgJWQgbGVuZ3RoICVkXG4iLAotCSAgICAoaW50KSBudG9ocyhwYWNrZXQtPnNlc3Npb24pLAotCSAgICBsZW4pOwotCi0gICAgLyogVWdseS4uLiBJIGFwb2xvZ2l6ZS4uLiAqLwotICAgIGZwcmludGYoZnAsCi0JICAgICJTb3VyY2VBZGRyICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4ICIKLQkgICAgIkRlc3RBZGRyICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCSAgICAodW5zaWduZWQpIHBhY2tldC0+ZXRoSGRyLmhfc291cmNlWzBdLAotCSAgICAodW5zaWduZWQpIHBhY2tldC0+ZXRoSGRyLmhfc291cmNlWzFdLAotCSAgICAodW5zaWduZWQpIHBhY2tldC0+ZXRoSGRyLmhfc291cmNlWzJdLAotCSAgICAodW5zaWduZWQpIHBhY2tldC0+ZXRoSGRyLmhfc291cmNlWzNdLAotCSAgICAodW5zaWduZWQpIHBhY2tldC0+ZXRoSGRyLmhfc291cmNlWzRdLAotCSAgICAodW5zaWduZWQpIHBhY2tldC0+ZXRoSGRyLmhfc291cmNlWzVdLAotCSAgICAodW5zaWduZWQpIHBhY2tldC0+ZXRoSGRyLmhfZGVzdFswXSwKLQkgICAgKHVuc2lnbmVkKSBwYWNrZXQtPmV0aEhkci5oX2Rlc3RbMV0sCi0JICAgICh1bnNpZ25lZCkgcGFja2V0LT5ldGhIZHIuaF9kZXN0WzJdLAotCSAgICAodW5zaWduZWQpIHBhY2tldC0+ZXRoSGRyLmhfZGVzdFszXSwKLQkgICAgKHVuc2lnbmVkKSBwYWNrZXQtPmV0aEhkci5oX2Rlc3RbNF0sCi0JICAgICh1bnNpZ25lZCkgcGFja2V0LT5ldGhIZHIuaF9kZXN0WzVdKTsKLSAgICBkdW1wSGV4KGZwLCBwYWNrZXQtPnBheWxvYWQsIG50b2hzKHBhY2tldC0+bGVuZ3RoKSk7Ci19CmRpZmYgLS1naXQgYS9wcHBkL3BsdWdpbnMvcnAtcHBwb2UvZGlzY292ZXJ5LmMgYi9wcHBkL3BsdWdpbnMvcnAtcHBwb2UvZGlzY292ZXJ5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ODc3Y2IuLjAwMDAwMDAKLS0tIGEvcHBwZC9wbHVnaW5zL3JwLXBwcG9lL2Rpc2NvdmVyeS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBkaXNjb3ZlcnkuYwotKgotKiBQZXJmb3JtIFBQUG9FIGRpc2NvdmVyeQotKgotKiBDb3B5cmlnaHQgKEMpIDE5OTkgYnkgUm9hcmluZyBQZW5ndWluIFNvZnR3YXJlIEluYy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgY2hhciBjb25zdCBSQ1NJRFtdID0KLSIkSWQ6IGRpc2NvdmVyeS5jLHYgMS42IDIwMDgvMDYvMTUgMDQ6MzU6NTAgcGF1bHVzIEV4cCAkIjsKLQotI2RlZmluZSBfR05VX1NPVVJDRSAxCi0jaW5jbHVkZSAicHBwb2UuaCIKLSNpbmNsdWRlICJwcHBkL3BwcGQuaCIKLSNpbmNsdWRlICJwcHBkL2ZzbS5oIgotI2luY2x1ZGUgInBwcGQvbGNwLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaWZkZWYgSEFWRV9TWVNfVElNRV9ICi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TWVNfVUlPX0gKLSNpbmNsdWRlIDxzeXMvdWlvLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaWZkZWYgVVNFX0xJTlVYX1BBQ0tFVAotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0vKiBDYWxjdWxhdGUgdGltZSByZW1haW5pbmcgdW50aWwgKmV4cCwgcmV0dXJuIDAgaWYgbm93ID49ICpleHAgKi8KLXN0YXRpYyBpbnQgdGltZV9sZWZ0KHN0cnVjdCB0aW1ldmFsICpkaWZmLCBzdHJ1Y3QgdGltZXZhbCAqZXhwKQotewotICAgIHN0cnVjdCB0aW1ldmFsIG5vdzsKLQotICAgIGlmIChnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCkgPCAwKSB7Ci0JZXJyb3IoImdldHRpbWVvZmRheTogJW0iKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAobm93LnR2X3NlYyA+IGV4cC0+dHZfc2VjCi0JfHwgKG5vdy50dl9zZWMgPT0gZXhwLT50dl9zZWMgJiYgbm93LnR2X3VzZWMgPj0gZXhwLT50dl91c2VjKSkKLQlyZXR1cm4gMDsKLQotICAgIGRpZmYtPnR2X3NlYyA9IGV4cC0+dHZfc2VjIC0gbm93LnR2X3NlYzsKLSAgICBkaWZmLT50dl91c2VjID0gZXhwLT50dl91c2VjIC0gbm93LnR2X3VzZWM7Ci0gICAgaWYgKGRpZmYtPnR2X3VzZWMgPCAwKSB7Ci0JZGlmZi0+dHZfdXNlYyArPSAxMDAwMDAwOwotCS0tZGlmZi0+dHZfc2VjOwotICAgIH0KLQotICAgIHJldHVybiAxOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiVGVU5DVElPTjogcGFyc2VGb3JIb3N0VW5pcQotKiVBUkdVTUVOVFM6Ci0qIHR5cGUgLS0gdGFnIHR5cGUKLSogbGVuIC0tIHRhZyBsZW5ndGgKLSogZGF0YSAtLSB0YWcgZGF0YS4KLSogZXh0cmEgLS0gdXNlci1zdXBwbGllZCBwb2ludGVyLiAgVGhpcyBpcyBhc3N1bWVkIHRvIGJlIGEgcG9pbnRlciB0byBpbnQuCi0qJVJFVFVSTlM6Ci0qIE5vdGhpbmcKLSolREVTQ1JJUFRJT046Ci0qIElmIGEgSG9zdFVuaXF1ZSB0YWcgaXMgZm91bmQgd2hpY2ggbWF0Y2hlcyBvdXIgUElELCBzZXRzICpleHRyYSB0byAxLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotcGFyc2VGb3JIb3N0VW5pcShVSU5UMTZfdCB0eXBlLCBVSU5UMTZfdCBsZW4sIHVuc2lnbmVkIGNoYXIgKmRhdGEsCi0JCSB2b2lkICpleHRyYSkKLXsKLSAgICBpbnQgKnZhbCA9IChpbnQgKikgZXh0cmE7Ci0gICAgaWYgKHR5cGUgPT0gVEFHX0hPU1RfVU5JUSAmJiBsZW4gPT0gc2l6ZW9mKHBpZF90KSkgewotCXBpZF90IHRtcDsKLQltZW1jcHkoJnRtcCwgZGF0YSwgbGVuKTsKLQlpZiAodG1wID09IGdldHBpZCgpKSB7Ci0JICAgICp2YWwgPSAxOwotCX0KLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qJUZVTkNUSU9OOiBwYWNrZXRJc0Zvck1lCi0qJUFSR1VNRU5UUzoKLSogY29ubiAtLSBQUFBvRSBjb25uZWN0aW9uIGluZm8KLSogcGFja2V0IC0tIGEgcmVjZWl2ZWQgUFBQb0UgcGFja2V0Ci0qJVJFVFVSTlM6Ci0qIDEgaWYgcGFja2V0IGlzIGZvciB0aGlzIFBQUG9FIGRhZW1vbjsgMCBvdGhlcndpc2UuCi0qJURFU0NSSVBUSU9OOgotKiBJZiB3ZSBhcmUgdXNpbmcgdGhlIEhvc3QtVW5pcXVlIHRhZywgdmVyaWZpZXMgdGhhdCBwYWNrZXQgY29udGFpbnMKLSogb3VyIHVuaXF1ZSBpZGVudGlmaWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50Ci1wYWNrZXRJc0Zvck1lKFBQUG9FQ29ubmVjdGlvbiAqY29ubiwgUFBQb0VQYWNrZXQgKnBhY2tldCkKLXsKLSAgICBpbnQgZm9yTWUgPSAwOwotCi0gICAgLyogSWYgcGFja2V0IGlzIG5vdCBkaXJlY3RlZCB0byBvdXIgTUFDIGFkZHJlc3MsIGZvcmdldCBpdCAqLwotICAgIGlmIChtZW1jbXAocGFja2V0LT5ldGhIZHIuaF9kZXN0LCBjb25uLT5teUV0aCwgRVRIX0FMRU4pKSByZXR1cm4gMDsKLQotICAgIC8qIElmIHdlJ3JlIG5vdCB1c2luZyB0aGUgSG9zdC1VbmlxdWUgdGFnLCB0aGVuIGFjY2VwdCB0aGUgcGFja2V0ICovCi0gICAgaWYgKCFjb25uLT51c2VIb3N0VW5pcSkgcmV0dXJuIDE7Ci0KLSAgICBwYXJzZVBhY2tldChwYWNrZXQsIHBhcnNlRm9ySG9zdFVuaXEsICZmb3JNZSk7Ci0gICAgcmV0dXJuIGZvck1lOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiVGVU5DVElPTjogcGFyc2VQQURPVGFncwotKiVBUkdVTUVOVFM6Ci0qIHR5cGUgLS0gdGFnIHR5cGUKLSogbGVuIC0tIHRhZyBsZW5ndGgKLSogZGF0YSAtLSB0YWcgZGF0YQotKiBleHRyYSAtLSBleHRyYSB1c2VyIGRhdGEuICBTaG91bGQgcG9pbnQgdG8gYSBQYWNrZXRDcml0ZXJpYSBzdHJ1Y3R1cmUKLSogICAgICAgICAgd2hpY2ggZ2V0cyBmaWxsZWQgaW4gYWNjb3JkaW5nIHRvIHNlbGVjdGVkIEFDIG5hbWUgYW5kIHNlcnZpY2UKLSogICAgICAgICAgbmFtZS4KLSolUkVUVVJOUzoKLSogTm90aGluZwotKiVERVNDUklQVElPTjoKLSogUGlja3MgaW50ZXJlc3RpbmcgdGFncyBvdXQgb2YgYSBQQURPIHBhY2tldAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotcGFyc2VQQURPVGFncyhVSU5UMTZfdCB0eXBlLCBVSU5UMTZfdCBsZW4sIHVuc2lnbmVkIGNoYXIgKmRhdGEsCi0JICAgICAgdm9pZCAqZXh0cmEpCi17Ci0gICAgc3RydWN0IFBhY2tldENyaXRlcmlhICpwYyA9IChzdHJ1Y3QgUGFja2V0Q3JpdGVyaWEgKikgZXh0cmE7Ci0gICAgUFBQb0VDb25uZWN0aW9uICpjb25uID0gcGMtPmNvbm47Ci0gICAgVUlOVDE2X3QgbXJ1OwotICAgIGludCBpOwotCi0gICAgc3dpdGNoKHR5cGUpIHsKLSAgICBjYXNlIFRBR19BQ19OQU1FOgotCXBjLT5zZWVuQUNOYW1lID0gMTsKLQlpZiAoY29ubi0+cHJpbnRBQ05hbWVzKSB7Ci0JICAgIGluZm8oIkFjY2Vzcy1Db25jZW50cmF0b3I6ICUuKnMiLCAoaW50KSBsZW4sIGRhdGEpOwotCX0KLQlpZiAoY29ubi0+YWNOYW1lICYmIGxlbiA9PSBzdHJsZW4oY29ubi0+YWNOYW1lKSAmJgotCSAgICAhc3RybmNtcCgoY2hhciAqKSBkYXRhLCBjb25uLT5hY05hbWUsIGxlbikpIHsKLQkgICAgcGMtPmFjTmFtZU9LID0gMTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSBUQUdfU0VSVklDRV9OQU1FOgotCXBjLT5zZWVuU2VydmljZU5hbWUgPSAxOwotCWlmIChjb25uLT5zZXJ2aWNlTmFtZSAmJiBsZW4gPT0gc3RybGVuKGNvbm4tPnNlcnZpY2VOYW1lKSAmJgotCSAgICAhc3RybmNtcCgoY2hhciAqKSBkYXRhLCBjb25uLT5zZXJ2aWNlTmFtZSwgbGVuKSkgewotCSAgICBwYy0+c2VydmljZU5hbWVPSyA9IDE7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgVEFHX0FDX0NPT0tJRToKLQljb25uLT5jb29raWUudHlwZSA9IGh0b25zKHR5cGUpOwotCWNvbm4tPmNvb2tpZS5sZW5ndGggPSBodG9ucyhsZW4pOwotCW1lbWNweShjb25uLT5jb29raWUucGF5bG9hZCwgZGF0YSwgbGVuKTsKLQlicmVhazsKLSAgICBjYXNlIFRBR19SRUxBWV9TRVNTSU9OX0lEOgotCWNvbm4tPnJlbGF5SWQudHlwZSA9IGh0b25zKHR5cGUpOwotCWNvbm4tPnJlbGF5SWQubGVuZ3RoID0gaHRvbnMobGVuKTsKLQltZW1jcHkoY29ubi0+cmVsYXlJZC5wYXlsb2FkLCBkYXRhLCBsZW4pOwotCWJyZWFrOwotICAgIGNhc2UgVEFHX1BQUF9NQVhfUEFZTE9BRDoKLQlpZiAobGVuID09IHNpemVvZihtcnUpKSB7Ci0JICAgIG1lbWNweSgmbXJ1LCBkYXRhLCBzaXplb2YobXJ1KSk7Ci0JICAgIG1ydSA9IG50b2hzKG1ydSk7Ci0JICAgIGlmIChtcnUgPj0gRVRIX1BQUE9FX01UVSkgewotCQlpZiAobGNwX2FsbG93b3B0aW9uc1swXS5tcnUgPiBtcnUpCi0JCSAgICBsY3BfYWxsb3dvcHRpb25zWzBdLm1ydSA9IG1ydTsKLQkJaWYgKGxjcF93YW50b3B0aW9uc1swXS5tcnUgPiBtcnUpCi0JCSAgICBsY3Bfd2FudG9wdGlvbnNbMF0ubXJ1ID0gbXJ1OwotCQljb25uLT5zZWVuTWF4UGF5bG9hZCA9IDE7Ci0JICAgIH0KLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSBUQUdfU0VSVklDRV9OQU1FX0VSUk9SOgotCWVycm9yKCJQQURPOiBTZXJ2aWNlLU5hbWUtRXJyb3I6ICUuKnMiLCAoaW50KSBsZW4sIGRhdGEpOwotCWNvbm4tPmVycm9yID0gMTsKLQlicmVhazsKLSAgICBjYXNlIFRBR19BQ19TWVNURU1fRVJST1I6Ci0JZXJyb3IoIlBBRE86IFN5c3RlbS1FcnJvcjogJS4qcyIsIChpbnQpIGxlbiwgZGF0YSk7Ci0JY29ubi0+ZXJyb3IgPSAxOwotCWJyZWFrOwotICAgIGNhc2UgVEFHX0dFTkVSSUNfRVJST1I6Ci0JZXJyb3IoIlBBRE86IEdlbmVyaWMtRXJyb3I6ICUuKnMiLCAoaW50KSBsZW4sIGRhdGEpOwotCWNvbm4tPmVycm9yID0gMTsKLQlicmVhazsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qJUZVTkNUSU9OOiBwYXJzZVBBRFNUYWdzCi0qJUFSR1VNRU5UUzoKLSogdHlwZSAtLSB0YWcgdHlwZQotKiBsZW4gLS0gdGFnIGxlbmd0aAotKiBkYXRhIC0tIHRhZyBkYXRhCi0qIGV4dHJhIC0tIGV4dHJhIHVzZXIgZGF0YSAocG9pbnRlciB0byBQUFBvRUNvbm5lY3Rpb24gc3RydWN0dXJlKQotKiVSRVRVUk5TOgotKiBOb3RoaW5nCi0qJURFU0NSSVBUSU9OOgotKiBQaWNrcyBpbnRlcmVzdGluZyB0YWdzIG91dCBvZiBhIFBBRFMgcGFja2V0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1wYXJzZVBBRFNUYWdzKFVJTlQxNl90IHR5cGUsIFVJTlQxNl90IGxlbiwgdW5zaWduZWQgY2hhciAqZGF0YSwKLQkgICAgICB2b2lkICpleHRyYSkKLXsKLSAgICBQUFBvRUNvbm5lY3Rpb24gKmNvbm4gPSAoUFBQb0VDb25uZWN0aW9uICopIGV4dHJhOwotICAgIFVJTlQxNl90IG1ydTsKLSAgICBzd2l0Y2godHlwZSkgewotICAgIGNhc2UgVEFHX1NFUlZJQ0VfTkFNRToKLQlkYmdsb2coIlBBRFM6IFNlcnZpY2UtTmFtZTogJyUuKnMnIiwgKGludCkgbGVuLCBkYXRhKTsKLQlicmVhazsKLSAgICBjYXNlIFRBR19QUFBfTUFYX1BBWUxPQUQ6Ci0JaWYgKGxlbiA9PSBzaXplb2YobXJ1KSkgewotCSAgICBtZW1jcHkoJm1ydSwgZGF0YSwgc2l6ZW9mKG1ydSkpOwotCSAgICBtcnUgPSBudG9ocyhtcnUpOwotCSAgICBpZiAobXJ1ID49IEVUSF9QUFBPRV9NVFUpIHsKLQkJaWYgKGxjcF9hbGxvd29wdGlvbnNbMF0ubXJ1ID4gbXJ1KQotCQkgICAgbGNwX2FsbG93b3B0aW9uc1swXS5tcnUgPSBtcnU7Ci0JCWlmIChsY3Bfd2FudG9wdGlvbnNbMF0ubXJ1ID4gbXJ1KQotCQkgICAgbGNwX3dhbnRvcHRpb25zWzBdLm1ydSA9IG1ydTsKLQkJY29ubi0+c2Vlbk1heFBheWxvYWQgPSAxOwotCSAgICB9Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgVEFHX1NFUlZJQ0VfTkFNRV9FUlJPUjoKLQllcnJvcigiUEFEUzogU2VydmljZS1OYW1lLUVycm9yOiAlLipzIiwgKGludCkgbGVuLCBkYXRhKTsKLQljb25uLT5lcnJvciA9IDE7Ci0JYnJlYWs7Ci0gICAgY2FzZSBUQUdfQUNfU1lTVEVNX0VSUk9SOgotCWVycm9yKCJQQURTOiBTeXN0ZW0tRXJyb3I6ICUuKnMiLCAoaW50KSBsZW4sIGRhdGEpOwotCWNvbm4tPmVycm9yID0gMTsKLQlicmVhazsKLSAgICBjYXNlIFRBR19HRU5FUklDX0VSUk9SOgotCWVycm9yKCJQQURTOiBHZW5lcmljLUVycm9yOiAlLipzIiwgKGludCkgbGVuLCBkYXRhKTsKLQljb25uLT5lcnJvciA9IDE7Ci0JYnJlYWs7Ci0gICAgY2FzZSBUQUdfUkVMQVlfU0VTU0lPTl9JRDoKLQljb25uLT5yZWxheUlkLnR5cGUgPSBodG9ucyh0eXBlKTsKLQljb25uLT5yZWxheUlkLmxlbmd0aCA9IGh0b25zKGxlbik7Ci0JbWVtY3B5KGNvbm4tPnJlbGF5SWQucGF5bG9hZCwgZGF0YSwgbGVuKTsKLQlicmVhazsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiVGVU5DVElPTjogc2VuZFBBREkKLSolQVJHVU1FTlRTOgotKiBjb25uIC0tIFBQUG9FQ29ubmVjdGlvbiBzdHJ1Y3R1cmUKLSolUkVUVVJOUzoKLSogTm90aGluZwotKiVERVNDUklQVElPTjoKLSogU2VuZHMgYSBQQURJIHBhY2tldAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotc2VuZFBBREkoUFBQb0VDb25uZWN0aW9uICpjb25uKQotewotICAgIFBQUG9FUGFja2V0IHBhY2tldDsKLSAgICB1bnNpZ25lZCBjaGFyICpjdXJzb3IgPSBwYWNrZXQucGF5bG9hZDsKLSAgICBQUFBvRVRhZyAqc3ZjID0gKFBQUG9FVGFnICopICgmcGFja2V0LnBheWxvYWQpOwotICAgIFVJTlQxNl90IG5hbWVsZW4gPSAwOwotICAgIFVJTlQxNl90IHBsZW47Ci0gICAgaW50IG9taXRfc2VydmljZV9uYW1lID0gMDsKLQotICAgIGlmIChjb25uLT5zZXJ2aWNlTmFtZSkgewotCW5hbWVsZW4gPSAoVUlOVDE2X3QpIHN0cmxlbihjb25uLT5zZXJ2aWNlTmFtZSk7Ci0JaWYgKCFzdHJjbXAoY29ubi0+c2VydmljZU5hbWUsICJOTy1TRVJWSUNFLU5BTUUtTk9OLVJGQy1DT01QTElBTlQiKSkgewotCSAgICBvbWl0X3NlcnZpY2VfbmFtZSA9IDE7Ci0JfQotICAgIH0KLQotICAgIC8qIFNldCBkZXN0aW5hdGlvbiB0byBFdGhlcm5ldCBicm9hZGNhc3QgYWRkcmVzcyAqLwotICAgIG1lbXNldChwYWNrZXQuZXRoSGRyLmhfZGVzdCwgMHhGRiwgRVRIX0FMRU4pOwotICAgIG1lbWNweShwYWNrZXQuZXRoSGRyLmhfc291cmNlLCBjb25uLT5teUV0aCwgRVRIX0FMRU4pOwotCi0gICAgcGFja2V0LmV0aEhkci5oX3Byb3RvID0gaHRvbnMoRXRoX1BQUE9FX0Rpc2NvdmVyeSk7Ci0gICAgcGFja2V0LnZlcnR5cGUgPSBQUFBPRV9WRVJfVFlQRSgxLCAxKTsKLSAgICBwYWNrZXQuY29kZSA9IENPREVfUEFESTsKLSAgICBwYWNrZXQuc2Vzc2lvbiA9IDA7Ci0KLSAgICBpZiAoIW9taXRfc2VydmljZV9uYW1lKSB7Ci0JcGxlbiA9IFRBR19IRFJfU0laRSArIG5hbWVsZW47Ci0JQ0hFQ0tfUk9PTShjdXJzb3IsIHBhY2tldC5wYXlsb2FkLCBwbGVuKTsKLQotCXN2Yy0+dHlwZSA9IFRBR19TRVJWSUNFX05BTUU7Ci0Jc3ZjLT5sZW5ndGggPSBodG9ucyhuYW1lbGVuKTsKLQotCWlmIChjb25uLT5zZXJ2aWNlTmFtZSkgewotCSAgICBtZW1jcHkoc3ZjLT5wYXlsb2FkLCBjb25uLT5zZXJ2aWNlTmFtZSwgc3RybGVuKGNvbm4tPnNlcnZpY2VOYW1lKSk7Ci0JfQotCWN1cnNvciArPSBuYW1lbGVuICsgVEFHX0hEUl9TSVpFOwotICAgIH0gZWxzZSB7Ci0JcGxlbiA9IDA7Ci0gICAgfQotCi0gICAgLyogSWYgd2UncmUgdXNpbmcgSG9zdC1VbmlxLCBjb3B5IGl0IG92ZXIgKi8KLSAgICBpZiAoY29ubi0+dXNlSG9zdFVuaXEpIHsKLQlQUFBvRVRhZyBob3N0VW5pcTsKLQlwaWRfdCBwaWQgPSBnZXRwaWQoKTsKLQlob3N0VW5pcS50eXBlID0gaHRvbnMoVEFHX0hPU1RfVU5JUSk7Ci0JaG9zdFVuaXEubGVuZ3RoID0gaHRvbnMoc2l6ZW9mKHBpZCkpOwotCW1lbWNweShob3N0VW5pcS5wYXlsb2FkLCAmcGlkLCBzaXplb2YocGlkKSk7Ci0JQ0hFQ0tfUk9PTShjdXJzb3IsIHBhY2tldC5wYXlsb2FkLCBzaXplb2YocGlkKSArIFRBR19IRFJfU0laRSk7Ci0JbWVtY3B5KGN1cnNvciwgJmhvc3RVbmlxLCBzaXplb2YocGlkKSArIFRBR19IRFJfU0laRSk7Ci0JY3Vyc29yICs9IHNpemVvZihwaWQpICsgVEFHX0hEUl9TSVpFOwotCXBsZW4gKz0gc2l6ZW9mKHBpZCkgKyBUQUdfSERSX1NJWkU7Ci0gICAgfQotCi0gICAgLyogQWRkIG91ciBtYXhpbXVtIE1UVS9NUlUgKi8KLSAgICBpZiAoTUlOKGxjcF9hbGxvd29wdGlvbnNbMF0ubXJ1LCBsY3Bfd2FudG9wdGlvbnNbMF0ubXJ1KSA+IEVUSF9QUFBPRV9NVFUpIHsKLQlQUFBvRVRhZyBtYXhQYXlsb2FkOwotCVVJTlQxNl90IG1ydSA9IGh0b25zKE1JTihsY3BfYWxsb3dvcHRpb25zWzBdLm1ydSwgbGNwX3dhbnRvcHRpb25zWzBdLm1ydSkpOwotCW1heFBheWxvYWQudHlwZSA9IGh0b25zKFRBR19QUFBfTUFYX1BBWUxPQUQpOwotCW1heFBheWxvYWQubGVuZ3RoID0gaHRvbnMoc2l6ZW9mKG1ydSkpOwotCW1lbWNweShtYXhQYXlsb2FkLnBheWxvYWQsICZtcnUsIHNpemVvZihtcnUpKTsKLQlDSEVDS19ST09NKGN1cnNvciwgcGFja2V0LnBheWxvYWQsIHNpemVvZihtcnUpICsgVEFHX0hEUl9TSVpFKTsKLQltZW1jcHkoY3Vyc29yLCAmbWF4UGF5bG9hZCwgc2l6ZW9mKG1ydSkgKyBUQUdfSERSX1NJWkUpOwotCWN1cnNvciArPSBzaXplb2YobXJ1KSArIFRBR19IRFJfU0laRTsKLQlwbGVuICs9IHNpemVvZihtcnUpICsgVEFHX0hEUl9TSVpFOwotICAgIH0KLQotICAgIHBhY2tldC5sZW5ndGggPSBodG9ucyhwbGVuKTsKLQotICAgIHNlbmRQYWNrZXQoY29ubiwgY29ubi0+ZGlzY292ZXJ5U29ja2V0LCAmcGFja2V0LCAoaW50KSAocGxlbiArIEhEUl9TSVpFKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qJUZVTkNUSU9OOiB3YWl0Rm9yUEFETwotKiVBUkdVTUVOVFM6Ci0qIGNvbm4gLS0gUFBQb0VDb25uZWN0aW9uIHN0cnVjdHVyZQotKiB0aW1lb3V0IC0tIGhvdyBsb25nIHRvIHdhaXQgKGluIHNlY29uZHMpCi0qJVJFVFVSTlM6Ci0qIE5vdGhpbmcKLSolREVTQ1JJUFRJT046Ci0qIFdhaXRzIGZvciBhIFBBRE8gcGFja2V0IGFuZCBjb3BpZXMgdXNlZnVsIGluZm9ybWF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLXdhaXRGb3JQQURPKFBQUG9FQ29ubmVjdGlvbiAqY29ubiwgaW50IHRpbWVvdXQpCi17Ci0gICAgZmRfc2V0IHJlYWRhYmxlOwotICAgIGludCByOwotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgIHN0cnVjdCB0aW1ldmFsIGV4cGlyZV9hdDsKLQotICAgIFBQUG9FUGFja2V0IHBhY2tldDsKLSAgICBpbnQgbGVuOwotCi0gICAgc3RydWN0IFBhY2tldENyaXRlcmlhIHBjOwotICAgIHBjLmNvbm4gICAgICAgICAgPSBjb25uOwotICAgIHBjLmFjTmFtZU9LICAgICAgPSAoY29ubi0+YWNOYW1lKSAgICAgID8gMCA6IDE7Ci0gICAgcGMuc2VydmljZU5hbWVPSyA9IChjb25uLT5zZXJ2aWNlTmFtZSkgPyAwIDogMTsKLSAgICBwYy5zZWVuQUNOYW1lICAgID0gMDsKLSAgICBwYy5zZWVuU2VydmljZU5hbWUgPSAwOwotICAgIGNvbm4tPnNlZW5NYXhQYXlsb2FkID0gMDsKLSAgICBjb25uLT5lcnJvciA9IDA7Ci0KLSAgICBpZiAoZ2V0dGltZW9mZGF5KCZleHBpcmVfYXQsIE5VTEwpIDwgMCkgewotCWVycm9yKCJnZXR0aW1lb2ZkYXkgKHdhaXRGb3JQQURPKTogJW0iKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIGV4cGlyZV9hdC50dl9zZWMgKz0gdGltZW91dDsKLQotICAgIGRvIHsKLQlpZiAoQlBGX0JVRkZFUl9JU19FTVBUWSkgewotCSAgICBpZiAoIXRpbWVfbGVmdCgmdHYsICZleHBpcmVfYXQpKQotCQlyZXR1cm47CQkvKiBUaW1lZCBvdXQgKi8KLQotCSAgICBGRF9aRVJPKCZyZWFkYWJsZSk7Ci0JICAgIEZEX1NFVChjb25uLT5kaXNjb3ZlcnlTb2NrZXQsICZyZWFkYWJsZSk7Ci0KLQkgICAgd2hpbGUoMSkgewotCQlyID0gc2VsZWN0KGNvbm4tPmRpc2NvdmVyeVNvY2tldCsxLCAmcmVhZGFibGUsIE5VTEwsIE5VTEwsICZ0dik7Ci0JCWlmIChyID49IDAgfHwgZXJybm8gIT0gRUlOVFIpIGJyZWFrOwotCSAgICB9Ci0JICAgIGlmIChyIDwgMCkgewotCQllcnJvcigic2VsZWN0ICh3YWl0Rm9yUEFETyk6ICVtIik7Ci0JCXJldHVybjsKLQkgICAgfQotCSAgICBpZiAociA9PSAwKQotCQlyZXR1cm47CQkvKiBUaW1lZCBvdXQgKi8KLQl9Ci0KLQkvKiBHZXQgdGhlIHBhY2tldCAqLwotCXJlY2VpdmVQYWNrZXQoY29ubi0+ZGlzY292ZXJ5U29ja2V0LCAmcGFja2V0LCAmbGVuKTsKLQotCS8qIENoZWNrIGxlbmd0aCAqLwotCWlmIChudG9ocyhwYWNrZXQubGVuZ3RoKSArIEhEUl9TSVpFID4gbGVuKSB7Ci0JICAgIGVycm9yKCJCb2d1cyBQUFBvRSBsZW5ndGggZmllbGQgKCV1KSIsCi0JCSAgICh1bnNpZ25lZCBpbnQpIG50b2hzKHBhY2tldC5sZW5ndGgpKTsKLQkgICAgY29udGludWU7Ci0JfQotCi0jaWZkZWYgVVNFX0JQRgotCS8qIElmIGl0J3Mgbm90IGEgRGlzY292ZXJ5IHBhY2tldCwgbG9vcCBhZ2FpbiAqLwotCWlmIChldGhlclR5cGUoJnBhY2tldCkgIT0gRXRoX1BQUE9FX0Rpc2NvdmVyeSkgY29udGludWU7Ci0jZW5kaWYKLQotCS8qIElmIGl0J3Mgbm90IGZvciB1cywgbG9vcCBhZ2FpbiAqLwotCWlmICghcGFja2V0SXNGb3JNZShjb25uLCAmcGFja2V0KSkgY29udGludWU7Ci0KLQlpZiAocGFja2V0LmNvZGUgPT0gQ09ERV9QQURPKSB7Ci0JICAgIGlmIChOT1RfVU5JQ0FTVChwYWNrZXQuZXRoSGRyLmhfc291cmNlKSkgewotCQllcnJvcigiSWdub3JpbmcgUEFETyBwYWNrZXQgZnJvbSBub24tdW5pY2FzdCBNQUMgYWRkcmVzcyIpOwotCQljb250aW51ZTsKLQkgICAgfQotCSAgICBpZiAoY29ubi0+cmVxX3BlZXIKLQkJJiYgbWVtY21wKHBhY2tldC5ldGhIZHIuaF9zb3VyY2UsIGNvbm4tPnJlcV9wZWVyX21hYywgRVRIX0FMRU4pICE9IDApIHsKLQkJd2FybigiSWdub3JpbmcgUEFETyBwYWNrZXQgZnJvbSB3cm9uZyBNQUMgYWRkcmVzcyIpOwotCQljb250aW51ZTsKLQkgICAgfQotCSAgICBpZiAocGFyc2VQYWNrZXQoJnBhY2tldCwgcGFyc2VQQURPVGFncywgJnBjKSA8IDApCi0JCXJldHVybjsKLQkgICAgaWYgKGNvbm4tPmVycm9yKQotCQlyZXR1cm47Ci0JICAgIGlmICghcGMuc2VlbkFDTmFtZSkgewotCQllcnJvcigiSWdub3JpbmcgUEFETyBwYWNrZXQgd2l0aCBubyBBQy1OYW1lIHRhZyIpOwotCQljb250aW51ZTsKLQkgICAgfQotCSAgICBpZiAoIXBjLnNlZW5TZXJ2aWNlTmFtZSkgewotCQllcnJvcigiSWdub3JpbmcgUEFETyBwYWNrZXQgd2l0aCBubyBTZXJ2aWNlLU5hbWUgdGFnIik7Ci0JCWNvbnRpbnVlOwotCSAgICB9Ci0JICAgIGNvbm4tPm51bVBBRE9zKys7Ci0JICAgIGlmIChwYy5hY05hbWVPSyAmJiBwYy5zZXJ2aWNlTmFtZU9LKSB7Ci0JCW1lbWNweShjb25uLT5wZWVyRXRoLCBwYWNrZXQuZXRoSGRyLmhfc291cmNlLCBFVEhfQUxFTik7Ci0JCWNvbm4tPmRpc2NvdmVyeVN0YXRlID0gU1RBVEVfUkVDRUlWRURfUEFETzsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfSB3aGlsZSAoY29ubi0+ZGlzY292ZXJ5U3RhdGUgIT0gU1RBVEVfUkVDRUlWRURfUEFETyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiVGVU5DVElPTjogc2VuZFBBRFIKLSolQVJHVU1FTlRTOgotKiBjb25uIC0tIFBQUG9FIGNvbm5lY3Rpb24gc3RydWN0dXIKLSolUkVUVVJOUzoKLSogTm90aGluZwotKiVERVNDUklQVElPTjoKLSogU2VuZHMgYSBQQURSIHBhY2tldAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotc2VuZFBBRFIoUFBQb0VDb25uZWN0aW9uICpjb25uKQotewotICAgIFBQUG9FUGFja2V0IHBhY2tldDsKLSAgICBQUFBvRVRhZyAqc3ZjID0gKFBQUG9FVGFnICopIHBhY2tldC5wYXlsb2FkOwotICAgIHVuc2lnbmVkIGNoYXIgKmN1cnNvciA9IHBhY2tldC5wYXlsb2FkOwotCi0gICAgVUlOVDE2X3QgbmFtZWxlbiA9IDA7Ci0gICAgVUlOVDE2X3QgcGxlbjsKLQotICAgIGlmIChjb25uLT5zZXJ2aWNlTmFtZSkgewotCW5hbWVsZW4gPSAoVUlOVDE2X3QpIHN0cmxlbihjb25uLT5zZXJ2aWNlTmFtZSk7Ci0gICAgfQotICAgIHBsZW4gPSBUQUdfSERSX1NJWkUgKyBuYW1lbGVuOwotICAgIENIRUNLX1JPT00oY3Vyc29yLCBwYWNrZXQucGF5bG9hZCwgcGxlbik7Ci0KLSAgICBtZW1jcHkocGFja2V0LmV0aEhkci5oX2Rlc3QsIGNvbm4tPnBlZXJFdGgsIEVUSF9BTEVOKTsKLSAgICBtZW1jcHkocGFja2V0LmV0aEhkci5oX3NvdXJjZSwgY29ubi0+bXlFdGgsIEVUSF9BTEVOKTsKLQotICAgIHBhY2tldC5ldGhIZHIuaF9wcm90byA9IGh0b25zKEV0aF9QUFBPRV9EaXNjb3ZlcnkpOwotICAgIHBhY2tldC52ZXJ0eXBlID0gUFBQT0VfVkVSX1RZUEUoMSwgMSk7Ci0gICAgcGFja2V0LmNvZGUgPSBDT0RFX1BBRFI7Ci0gICAgcGFja2V0LnNlc3Npb24gPSAwOwotCi0gICAgc3ZjLT50eXBlID0gVEFHX1NFUlZJQ0VfTkFNRTsKLSAgICBzdmMtPmxlbmd0aCA9IGh0b25zKG5hbWVsZW4pOwotICAgIGlmIChjb25uLT5zZXJ2aWNlTmFtZSkgewotCW1lbWNweShzdmMtPnBheWxvYWQsIGNvbm4tPnNlcnZpY2VOYW1lLCBuYW1lbGVuKTsKLSAgICB9Ci0gICAgY3Vyc29yICs9IG5hbWVsZW4gKyBUQUdfSERSX1NJWkU7Ci0KLSAgICAvKiBJZiB3ZSdyZSB1c2luZyBIb3N0LVVuaXEsIGNvcHkgaXQgb3ZlciAqLwotICAgIGlmIChjb25uLT51c2VIb3N0VW5pcSkgewotCVBQUG9FVGFnIGhvc3RVbmlxOwotCXBpZF90IHBpZCA9IGdldHBpZCgpOwotCWhvc3RVbmlxLnR5cGUgPSBodG9ucyhUQUdfSE9TVF9VTklRKTsKLQlob3N0VW5pcS5sZW5ndGggPSBodG9ucyhzaXplb2YocGlkKSk7Ci0JbWVtY3B5KGhvc3RVbmlxLnBheWxvYWQsICZwaWQsIHNpemVvZihwaWQpKTsKLQlDSEVDS19ST09NKGN1cnNvciwgcGFja2V0LnBheWxvYWQsIHNpemVvZihwaWQpK1RBR19IRFJfU0laRSk7Ci0JbWVtY3B5KGN1cnNvciwgJmhvc3RVbmlxLCBzaXplb2YocGlkKSArIFRBR19IRFJfU0laRSk7Ci0JY3Vyc29yICs9IHNpemVvZihwaWQpICsgVEFHX0hEUl9TSVpFOwotCXBsZW4gKz0gc2l6ZW9mKHBpZCkgKyBUQUdfSERSX1NJWkU7Ci0gICAgfQotCi0gICAgLyogQWRkIG91ciBtYXhpbXVtIE1UVS9NUlUgKi8KLSAgICBpZiAoTUlOKGxjcF9hbGxvd29wdGlvbnNbMF0ubXJ1LCBsY3Bfd2FudG9wdGlvbnNbMF0ubXJ1KSA+IEVUSF9QUFBPRV9NVFUpIHsKLQlQUFBvRVRhZyBtYXhQYXlsb2FkOwotCVVJTlQxNl90IG1ydSA9IGh0b25zKE1JTihsY3BfYWxsb3dvcHRpb25zWzBdLm1ydSwgbGNwX3dhbnRvcHRpb25zWzBdLm1ydSkpOwotCW1heFBheWxvYWQudHlwZSA9IGh0b25zKFRBR19QUFBfTUFYX1BBWUxPQUQpOwotCW1heFBheWxvYWQubGVuZ3RoID0gaHRvbnMoc2l6ZW9mKG1ydSkpOwotCW1lbWNweShtYXhQYXlsb2FkLnBheWxvYWQsICZtcnUsIHNpemVvZihtcnUpKTsKLQlDSEVDS19ST09NKGN1cnNvciwgcGFja2V0LnBheWxvYWQsIHNpemVvZihtcnUpICsgVEFHX0hEUl9TSVpFKTsKLQltZW1jcHkoY3Vyc29yLCAmbWF4UGF5bG9hZCwgc2l6ZW9mKG1ydSkgKyBUQUdfSERSX1NJWkUpOwotCWN1cnNvciArPSBzaXplb2YobXJ1KSArIFRBR19IRFJfU0laRTsKLQlwbGVuICs9IHNpemVvZihtcnUpICsgVEFHX0hEUl9TSVpFOwotICAgIH0KLQotICAgIC8qIENvcHkgY29va2llIGFuZCByZWxheS1JRCBpZiBuZWVkZWQgKi8KLSAgICBpZiAoY29ubi0+Y29va2llLnR5cGUpIHsKLQlDSEVDS19ST09NKGN1cnNvciwgcGFja2V0LnBheWxvYWQsCi0JCSAgIG50b2hzKGNvbm4tPmNvb2tpZS5sZW5ndGgpICsgVEFHX0hEUl9TSVpFKTsKLQltZW1jcHkoY3Vyc29yLCAmY29ubi0+Y29va2llLCBudG9ocyhjb25uLT5jb29raWUubGVuZ3RoKSArIFRBR19IRFJfU0laRSk7Ci0JY3Vyc29yICs9IG50b2hzKGNvbm4tPmNvb2tpZS5sZW5ndGgpICsgVEFHX0hEUl9TSVpFOwotCXBsZW4gKz0gbnRvaHMoY29ubi0+Y29va2llLmxlbmd0aCkgKyBUQUdfSERSX1NJWkU7Ci0gICAgfQotCi0gICAgaWYgKGNvbm4tPnJlbGF5SWQudHlwZSkgewotCUNIRUNLX1JPT00oY3Vyc29yLCBwYWNrZXQucGF5bG9hZCwKLQkJICAgbnRvaHMoY29ubi0+cmVsYXlJZC5sZW5ndGgpICsgVEFHX0hEUl9TSVpFKTsKLQltZW1jcHkoY3Vyc29yLCAmY29ubi0+cmVsYXlJZCwgbnRvaHMoY29ubi0+cmVsYXlJZC5sZW5ndGgpICsgVEFHX0hEUl9TSVpFKTsKLQljdXJzb3IgKz0gbnRvaHMoY29ubi0+cmVsYXlJZC5sZW5ndGgpICsgVEFHX0hEUl9TSVpFOwotCXBsZW4gKz0gbnRvaHMoY29ubi0+cmVsYXlJZC5sZW5ndGgpICsgVEFHX0hEUl9TSVpFOwotICAgIH0KLQotICAgIHBhY2tldC5sZW5ndGggPSBodG9ucyhwbGVuKTsKLSAgICBzZW5kUGFja2V0KGNvbm4sIGNvbm4tPmRpc2NvdmVyeVNvY2tldCwgJnBhY2tldCwgKGludCkgKHBsZW4gKyBIRFJfU0laRSkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiVGVU5DVElPTjogd2FpdEZvclBBRFMKLSolQVJHVU1FTlRTOgotKiBjb25uIC0tIFBQUG9FIGNvbm5lY3Rpb24gaW5mbwotKiB0aW1lb3V0IC0tIGhvdyBsb25nIHRvIHdhaXQgKGluIHNlY29uZHMpCi0qJVJFVFVSTlM6Ci0qIE5vdGhpbmcKLSolREVTQ1JJUFRJT046Ci0qIFdhaXRzIGZvciBhIFBBRFMgcGFja2V0IGFuZCBjb3BpZXMgdXNlZnVsIGluZm9ybWF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi13YWl0Rm9yUEFEUyhQUFBvRUNvbm5lY3Rpb24gKmNvbm4sIGludCB0aW1lb3V0KQotewotICAgIGZkX3NldCByZWFkYWJsZTsKLSAgICBpbnQgcjsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICBzdHJ1Y3QgdGltZXZhbCBleHBpcmVfYXQ7Ci0KLSAgICBQUFBvRVBhY2tldCBwYWNrZXQ7Ci0gICAgaW50IGxlbjsKLQotICAgIGlmIChnZXR0aW1lb2ZkYXkoJmV4cGlyZV9hdCwgTlVMTCkgPCAwKSB7Ci0JZXJyb3IoImdldHRpbWVvZmRheSAod2FpdEZvclBBRFMpOiAlbSIpOwotCXJldHVybjsKLSAgICB9Ci0gICAgZXhwaXJlX2F0LnR2X3NlYyArPSB0aW1lb3V0OwotCi0gICAgY29ubi0+ZXJyb3IgPSAwOwotICAgIGRvIHsKLQlpZiAoQlBGX0JVRkZFUl9JU19FTVBUWSkgewotCSAgICBpZiAoIXRpbWVfbGVmdCgmdHYsICZleHBpcmVfYXQpKQotCQlyZXR1cm47CQkvKiBUaW1lZCBvdXQgKi8KLQotCSAgICBGRF9aRVJPKCZyZWFkYWJsZSk7Ci0JICAgIEZEX1NFVChjb25uLT5kaXNjb3ZlcnlTb2NrZXQsICZyZWFkYWJsZSk7Ci0KLQkgICAgd2hpbGUoMSkgewotCQlyID0gc2VsZWN0KGNvbm4tPmRpc2NvdmVyeVNvY2tldCsxLCAmcmVhZGFibGUsIE5VTEwsIE5VTEwsICZ0dik7Ci0JCWlmIChyID49IDAgfHwgZXJybm8gIT0gRUlOVFIpIGJyZWFrOwotCSAgICB9Ci0JICAgIGlmIChyIDwgMCkgewotCQllcnJvcigic2VsZWN0ICh3YWl0Rm9yUEFEUyk6ICVtIik7Ci0JCXJldHVybjsKLQkgICAgfQotCSAgICBpZiAociA9PSAwKQotCQlyZXR1cm47CQkvKiBUaW1lZCBvdXQgKi8KLQl9Ci0KLQkvKiBHZXQgdGhlIHBhY2tldCAqLwotCXJlY2VpdmVQYWNrZXQoY29ubi0+ZGlzY292ZXJ5U29ja2V0LCAmcGFja2V0LCAmbGVuKTsKLQotCS8qIENoZWNrIGxlbmd0aCAqLwotCWlmIChudG9ocyhwYWNrZXQubGVuZ3RoKSArIEhEUl9TSVpFID4gbGVuKSB7Ci0JICAgIGVycm9yKCJCb2d1cyBQUFBvRSBsZW5ndGggZmllbGQgKCV1KSIsCi0JCSAgICh1bnNpZ25lZCBpbnQpIG50b2hzKHBhY2tldC5sZW5ndGgpKTsKLQkgICAgY29udGludWU7Ci0JfQotCi0jaWZkZWYgVVNFX0JQRgotCS8qIElmIGl0J3Mgbm90IGEgRGlzY292ZXJ5IHBhY2tldCwgbG9vcCBhZ2FpbiAqLwotCWlmIChldGhlclR5cGUoJnBhY2tldCkgIT0gRXRoX1BQUE9FX0Rpc2NvdmVyeSkgY29udGludWU7Ci0jZW5kaWYKLQotCS8qIElmIGl0J3Mgbm90IGZyb20gdGhlIEFDLCBpdCdzIG5vdCBmb3IgbWUgKi8KLQlpZiAobWVtY21wKHBhY2tldC5ldGhIZHIuaF9zb3VyY2UsIGNvbm4tPnBlZXJFdGgsIEVUSF9BTEVOKSkgY29udGludWU7Ci0KLQkvKiBJZiBpdCdzIG5vdCBmb3IgdXMsIGxvb3AgYWdhaW4gKi8KLQlpZiAoIXBhY2tldElzRm9yTWUoY29ubiwgJnBhY2tldCkpIGNvbnRpbnVlOwotCi0JLyogSXMgaXQgUEFEUz8gICovCi0JaWYgKHBhY2tldC5jb2RlID09IENPREVfUEFEUykgewotCSAgICAvKiBQYXJzZSBmb3IgZ29vZGllcyAqLwotCSAgICBpZiAocGFyc2VQYWNrZXQoJnBhY2tldCwgcGFyc2VQQURTVGFncywgY29ubikgPCAwKQotCQlyZXR1cm47Ci0JICAgIGlmIChjb25uLT5lcnJvcikKLQkJcmV0dXJuOwotCSAgICBjb25uLT5kaXNjb3ZlcnlTdGF0ZSA9IFNUQVRFX1NFU1NJT047Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9IHdoaWxlIChjb25uLT5kaXNjb3ZlcnlTdGF0ZSAhPSBTVEFURV9TRVNTSU9OKTsKLQotICAgIC8qIERvbid0IGJvdGhlciB3aXRoIG50b2hzOyB3ZSdsbCBqdXN0IGVuZCB1cCBjb252ZXJ0aW5nIGl0IGJhY2suLi4gKi8KLSAgICBjb25uLT5zZXNzaW9uID0gcGFja2V0LnNlc3Npb247Ci0KLSAgICBpbmZvKCJQUFAgc2Vzc2lvbiBpcyAlZCIsIChpbnQpIG50b2hzKGNvbm4tPnNlc3Npb24pKTsKLQotICAgIC8qIFJGQyAyNTE2IHNheXMgc2Vzc2lvbiBpZCBNVVNUIE5PVCBiZSB6ZXJvIG9yIDB4RkZGRiAqLwotICAgIGlmIChudG9ocyhjb25uLT5zZXNzaW9uKSA9PSAwIHx8IG50b2hzKGNvbm4tPnNlc3Npb24pID09IDB4RkZGRikgewotCWVycm9yKCJBY2Nlc3MgY29uY2VudHJhdG9yIHVzZWQgYSBzZXNzaW9uIHZhbHVlIG9mICV4IC0tIHRoZSBBQyBpcyB2aW9sYXRpbmcgUkZDIDI1MTYiLCAodW5zaWduZWQgaW50KSBudG9ocyhjb25uLT5zZXNzaW9uKSk7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiVGVU5DVElPTjogZGlzY292ZXJ5Ci0qJUFSR1VNRU5UUzoKLSogY29ubiAtLSBQUFBvRSBjb25uZWN0aW9uIGluZm8gc3RydWN0dXJlCi0qJVJFVFVSTlM6Ci0qIE5vdGhpbmcKLSolREVTQ1JJUFRJT046Ci0qIFBlcmZvcm1zIHRoZSBQUFBvRSBkaXNjb3ZlcnkgcGhhc2UKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotZGlzY292ZXJ5KFBQUG9FQ29ubmVjdGlvbiAqY29ubikKLXsKLSAgICBpbnQgcGFkaUF0dGVtcHRzID0gMDsKLSAgICBpbnQgcGFkckF0dGVtcHRzID0gMDsKLSAgICBpbnQgdGltZW91dCA9IGNvbm4tPmRpc2NvdmVyeVRpbWVvdXQ7Ci0KLSAgICBkbyB7Ci0JcGFkaUF0dGVtcHRzKys7Ci0JaWYgKHBhZGlBdHRlbXB0cyA+IE1BWF9QQURJX0FUVEVNUFRTKSB7Ci0JICAgIHdhcm4oIlRpbWVvdXQgd2FpdGluZyBmb3IgUEFETyBwYWNrZXRzIik7Ci0JICAgIGNsb3NlKGNvbm4tPmRpc2NvdmVyeVNvY2tldCk7Ci0JICAgIGNvbm4tPmRpc2NvdmVyeVNvY2tldCA9IC0xOwotCSAgICByZXR1cm47Ci0JfQotCXNlbmRQQURJKGNvbm4pOwotCWNvbm4tPmRpc2NvdmVyeVN0YXRlID0gU1RBVEVfU0VOVF9QQURJOwotCXdhaXRGb3JQQURPKGNvbm4sIHRpbWVvdXQpOwotCi0JdGltZW91dCAqPSAyOwotICAgIH0gd2hpbGUgKGNvbm4tPmRpc2NvdmVyeVN0YXRlID09IFNUQVRFX1NFTlRfUEFESSk7Ci0KLSAgICB0aW1lb3V0ID0gY29ubi0+ZGlzY292ZXJ5VGltZW91dDsKLSAgICBkbyB7Ci0JcGFkckF0dGVtcHRzKys7Ci0JaWYgKHBhZHJBdHRlbXB0cyA+IE1BWF9QQURJX0FUVEVNUFRTKSB7Ci0JICAgIHdhcm4oIlRpbWVvdXQgd2FpdGluZyBmb3IgUEFEUyBwYWNrZXRzIik7Ci0JICAgIGNsb3NlKGNvbm4tPmRpc2NvdmVyeVNvY2tldCk7Ci0JICAgIGNvbm4tPmRpc2NvdmVyeVNvY2tldCA9IC0xOwotCSAgICByZXR1cm47Ci0JfQotCXNlbmRQQURSKGNvbm4pOwotCWNvbm4tPmRpc2NvdmVyeVN0YXRlID0gU1RBVEVfU0VOVF9QQURSOwotCXdhaXRGb3JQQURTKGNvbm4sIHRpbWVvdXQpOwotCXRpbWVvdXQgKj0gMjsKLSAgICB9IHdoaWxlIChjb25uLT5kaXNjb3ZlcnlTdGF0ZSA9PSBTVEFURV9TRU5UX1BBRFIpOwotCi0gICAgaWYgKCFjb25uLT5zZWVuTWF4UGF5bG9hZCkgewotCS8qIFJGQyA0NjM4OiBNVVNUIGxpbWl0IE1UVS9NUlUgdG8gMTQ5MiAqLwotCWlmIChsY3BfYWxsb3dvcHRpb25zWzBdLm1ydSA+IEVUSF9QUFBPRV9NVFUpCi0JICAgIGxjcF9hbGxvd29wdGlvbnNbMF0ubXJ1ID0gRVRIX1BQUE9FX01UVTsKLQlpZiAobGNwX3dhbnRvcHRpb25zWzBdLm1ydSA+IEVUSF9QUFBPRV9NVFUpCi0JICAgIGxjcF93YW50b3B0aW9uc1swXS5tcnUgPSBFVEhfUFBQT0VfTVRVOwotICAgIH0KLQotICAgIC8qIFdlJ3JlIGRvbmUuICovCi0gICAgY29ubi0+ZGlzY292ZXJ5U3RhdGUgPSBTVEFURV9TRVNTSU9OOwotICAgIHJldHVybjsKLX0KZGlmZiAtLWdpdCBhL3BwcGQvcGx1Z2lucy9ycC1wcHBvZS9pZi5jIGIvcHBwZC9wbHVnaW5zL3JwLXBwcG9lL2lmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZTlhNTcuLjAwMDAwMDAKLS0tIGEvcHBwZC9wbHVnaW5zL3JwLXBwcG9lL2lmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGlmLmMKLSoKLSogSW1wbGVtZW50YXRpb24gb2YgdXNlci1zcGFjZSBQUFBvRSByZWRpcmVjdG9yIGZvciBMaW51eC4KLSoKLSogRnVuY3Rpb25zIGZvciBvcGVuaW5nIGEgcmF3IHNvY2tldCBhbmQgcmVhZGluZy93cml0aW5nIHJhdyBFdGhlcm5ldCBmcmFtZXMuCi0qCi0qIENvcHlyaWdodCAoQykgMjAwMCBieSBSb2FyaW5nIFBlbmd1aW4gU29mdHdhcmUgSW5jLgotKgotKiBUaGlzIHByb2dyYW0gbWF5IGJlIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVQotKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgY2hhciBjb25zdCBSQ1NJRFtdID0KLSIkSWQ6IGlmLmMsdiAxLjIgMjAwOC8wNi8wOSAwODozNDoyMyBwYXVsdXMgRXhwICQiOwotCi0jZGVmaW5lIF9HTlVfU09VUkNFIDEKLSNpbmNsdWRlICJwcHBvZS5oIgotI2luY2x1ZGUgInBwcGQvcHBwZC5oIgotCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX05FVFBBQ0tFVF9QQUNLRVRfSAotI2luY2x1ZGUgPG5ldHBhY2tldC9wYWNrZXQuaD4KLSNlbGlmIGRlZmluZWQoSEFWRV9MSU5VWF9JRl9QQUNLRVRfSCkKLSNpbmNsdWRlIDxsaW51eC9pZl9wYWNrZXQuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9ORVRfRVRIRVJORVRfSAotI2luY2x1ZGUgPG5ldC9ldGhlcm5ldC5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0FTTV9UWVBFU19ICi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1lTX0lPQ1RMX0gKLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2lmZGVmIEhBVkVfTkVUX0lGX0FSUF9ICi0jaW5jbHVkZSA8bmV0L2lmX2FycC5oPgotI2VuZGlmCi0KLS8qIEluaXRpYWxpemUgZnJhbWUgdHlwZXMgdG8gUkZDIDI1MTYgdmFsdWVzLiAgU29tZSBicm9rZW4gcGVlcnMgYXBwYXJlbnRseQotICAgdXNlIGRpZmZlcmVudCBmcmFtZSB0eXBlcy4uLiBzaWdoLi4uICovCi0KLVVJTlQxNl90IEV0aF9QUFBPRV9EaXNjb3ZlcnkgPSBFVEhfUFBQT0VfRElTQ09WRVJZOwotVUlOVDE2X3QgRXRoX1BQUE9FX1Nlc3Npb24gICA9IEVUSF9QUFBPRV9TRVNTSU9OOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiVGVU5DVElPTjogZXRoZXJUeXBlCi0qJUFSR1VNRU5UUzoKLSogcGFja2V0IC0tIGEgcmVjZWl2ZWQgUFBQb0UgcGFja2V0Ci0qJVJFVFVSTlM6Ci0qIGV0aGVybmV0IHBhY2tldCB0eXBlIChzZWUgL3Vzci9pbmNsdWRlL25ldC9ldGhlcnR5cGVzLmgpCi0qJURFU0NSSVBUSU9OOgotKiBDaGVja3MgdGhlIGV0aGVybmV0IHBhY2tldCBoZWFkZXIgdG8gZGV0ZXJtaW5lIGl0cyB0eXBlLgotKiBXZSBzaG91bGQgb25seSBiZSByZWNldmVpbmcgRElTQ09WRVJZIGFuZCBTRVNTSU9OIHR5cGVzIGlmIHRoZSBCUEYKLSogaXMgc2V0IHVwIGNvcnJlY3RseS4gIExvZ3MgYW4gZXJyb3IgaWYgYW4gdW5leHBlY3RlZCB0eXBlIGlzIHJlY2VpdmVkLgotKiBOb3RlIHRoYXQgdGhlIGV0aGVybmV0IHR5cGUgbmFtZXMgY29tZSBmcm9tICJwcHBvZS5oIiBhbmQgdGhlIHBhY2tldAotKiBwYWNrZXQgc3RydWN0dXJlIG5hbWVzIHVzZSB0aGUgTElOVVggZGlhbGVjdCB0byBtYWludGFpbiBjb25zaXN0ZW5jeQotKiB3aXRoIHRoZSByZXN0IG9mIHRoaXMgZmlsZS4gIFNlZSB0aGUgQlNEIHNlY3Rpb24gb2YgInBwcG9lLmgiIGZvcgotKiB0cmFuc2xhdGlvbnMgb2YgdGhlIGRhdGEgc3RydWN0dXJlIG5hbWVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1VSU5UMTZfdAotZXRoZXJUeXBlKFBQUG9FUGFja2V0ICpwYWNrZXQpCi17Ci0gICAgVUlOVDE2X3QgdHlwZSA9IChVSU5UMTZfdCkgbnRvaHMocGFja2V0LT5ldGhIZHIuaF9wcm90byk7Ci0gICAgaWYgKHR5cGUgIT0gRXRoX1BQUE9FX0Rpc2NvdmVyeSAmJiB0eXBlICE9IEV0aF9QUFBPRV9TZXNzaW9uKSB7Ci0JZXJyb3IoIkludmFsaWQgZXRoZXIgdHlwZSAweCV4IiwgdHlwZSk7Ci0gICAgfQotICAgIHJldHVybiB0eXBlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiVGVU5DVElPTjogb3BlbkludGVyZmFjZQotKiVBUkdVTUVOVFM6Ci0qIGlmbmFtZSAtLSBuYW1lIG9mIGludGVyZmFjZQotKiB0eXBlIC0tIEV0aGVybmV0IGZyYW1lIHR5cGUKLSogaHdhZGRyIC0tIGlmIG5vbi1OVUxMLCBzZXQgdG8gdGhlIGhhcmR3YXJlIGFkZHJlc3MKLSolUkVUVVJOUzoKLSogQSByYXcgc29ja2V0IGZvciB0YWxraW5nIHRvIHRoZSBFdGhlcm5ldCBjYXJkLiAgRXhpdHMgb24gZXJyb3IuCi0qJURFU0NSSVBUSU9OOgotKiBPcGVucyBhIHJhdyBFdGhlcm5ldCBzb2NrZXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50Ci1vcGVuSW50ZXJmYWNlKGNoYXIgY29uc3QgKmlmbmFtZSwgVUlOVDE2X3QgdHlwZSwgdW5zaWduZWQgY2hhciAqaHdhZGRyKQotewotICAgIGludCBvcHR2YWw9MTsKLSAgICBpbnQgZmQ7Ci0gICAgc3RydWN0IGlmcmVxIGlmcjsKLSAgICBpbnQgZG9tYWluLCBzdHlwZTsKLQotI2lmZGVmIEhBVkVfU1RSVUNUX1NPQ0tBRERSX0xMCi0gICAgc3RydWN0IHNvY2thZGRyX2xsIHNhOwotI2Vsc2UKLSAgICBzdHJ1Y3Qgc29ja2FkZHIgc2E7Ci0jZW5kaWYKLQotICAgIG1lbXNldCgmc2EsIDAsIHNpemVvZihzYSkpOwotCi0jaWZkZWYgSEFWRV9TVFJVQ1RfU09DS0FERFJfTEwKLSAgICBkb21haW4gPSBQRl9QQUNLRVQ7Ci0gICAgc3R5cGUgPSBTT0NLX1JBVzsKLSNlbHNlCi0gICAgZG9tYWluID0gUEZfSU5FVDsKLSAgICBzdHlwZSA9IFNPQ0tfUEFDS0VUOwotI2VuZGlmCi0KLSAgICBpZiAoKGZkID0gc29ja2V0KGRvbWFpbiwgc3R5cGUsIGh0b25zKHR5cGUpKSkgPCAwKSB7Ci0JLyogR2l2ZSBhIG1vcmUgaGVscGZ1bCBtZXNzYWdlIGZvciB0aGUgY29tbW9uIGVycm9yIGNhc2UgKi8KLQlpZiAoZXJybm8gPT0gRVBFUk0pIHsKLQkgICAgZmF0YWwoIkNhbm5vdCBjcmVhdGUgcmF3IHNvY2tldCAtLSBwcHBvZSBtdXN0IGJlIHJ1biBhcyByb290LiIpOwotCX0KLQllcnJvcigiQ2FuJ3Qgb3BlbiBzb2NrZXQgZm9yIHBwcG9lOiAlbSIpOwotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpZiAoc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fQlJPQURDQVNULCAmb3B0dmFsLCBzaXplb2Yob3B0dmFsKSkgPCAwKSB7Ci0JZXJyb3IoIkNhbid0IHNldCBzb2NrZXQgb3B0aW9ucyBmb3IgcHBwb2U6ICVtIik7Ci0JY2xvc2UoZmQpOwotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBGaWxsIGluIGhhcmR3YXJlIGFkZHJlc3MgKi8KLSAgICBpZiAoaHdhZGRyKSB7Ci0Jc3RybmNweShpZnIuaWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOwotCWlmIChpb2N0bChmZCwgU0lPQ0dJRkhXQUREUiwgJmlmcikgPCAwKSB7Ci0JICAgIGVycm9yKCJDYW4ndCBnZXQgaGFyZHdhcmUgYWRkcmVzcyBmb3IgJXM6ICVtIiwgaWZuYW1lKTsKLQkgICAgY2xvc2UoZmQpOwotCSAgICByZXR1cm4gLTE7Ci0JfQotCW1lbWNweShod2FkZHIsIGlmci5pZnJfaHdhZGRyLnNhX2RhdGEsIEVUSF9BTEVOKTsKLSNpZmRlZiBBUlBIUkRfRVRIRVIKLQlpZiAoaWZyLmlmcl9od2FkZHIuc2FfZmFtaWx5ICE9IEFSUEhSRF9FVEhFUikgewotCSAgICB3YXJuKCJJbnRlcmZhY2UgJS4xNnMgaXMgbm90IEV0aGVybmV0IiwgaWZuYW1lKTsKLQl9Ci0jZW5kaWYKLQlpZiAoTk9UX1VOSUNBU1QoaHdhZGRyKSkgewotCSAgICBmYXRhbCgiQ2FuJ3QgdXNlIGludGVyZmFjZSAlLjE2czogaXQgaGFzIGJyb2FkY2FzdC9tdWx0aWNhc3QgTUFDIGFkZHJlc3MiLAotCQkgIGlmbmFtZSk7Ci0JfQotICAgIH0KLQotICAgIC8qIFNhbml0eSBjaGVjayBvbiBNVFUgKi8KLSAgICBzdHJuY3B5KGlmci5pZnJfbmFtZSwgaWZuYW1lLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7Ci0gICAgaWYgKGlvY3RsKGZkLCBTSU9DR0lGTVRVLCAmaWZyKSA8IDApIHsKLQllcnJvcigiQ2FuJ3QgZ2V0IE1UVSBmb3IgJXM6ICVtIiwgaWZuYW1lKTsKLSAgICB9IGVsc2UgaWYgKGlmci5pZnJfbXR1IDwgRVRIX0RBVEFfTEVOKSB7Ci0JZXJyb3IoIkludGVyZmFjZSAlLjE2cyBoYXMgTVRVIG9mICVkIC0tIHNob3VsZCBiZSBhdCBsZWFzdCAlZC4iLAotCSAgICAgIGlmbmFtZSwgaWZyLmlmcl9tdHUsIEVUSF9EQVRBX0xFTik7Ci0JZXJyb3IoIlRoaXMgbWF5IGNhdXNlIHNlcmlvdXMgY29ubmVjdGlvbiBwcm9ibGVtcy4iKTsKLSAgICB9Ci0KLSNpZmRlZiBIQVZFX1NUUlVDVF9TT0NLQUREUl9MTAotICAgIC8qIEdldCBpbnRlcmZhY2UgaW5kZXggKi8KLSAgICBzYS5zbGxfZmFtaWx5ID0gQUZfUEFDS0VUOwotICAgIHNhLnNsbF9wcm90b2NvbCA9IGh0b25zKHR5cGUpOwotCi0gICAgc3RybmNweShpZnIuaWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOwotICAgIGlmIChpb2N0bChmZCwgU0lPQ0dJRklOREVYLCAmaWZyKSA8IDApIHsKLQllcnJvcigiQ291bGQgbm90IGdldCBpbnRlcmZhY2UgaW5kZXggZm9yICVzOiAlbSIsIGlmbmFtZSk7Ci0JY2xvc2UoZmQpOwotCXJldHVybiAtMTsKLSAgICB9Ci0gICAgc2Euc2xsX2lmaW5kZXggPSBpZnIuaWZyX2lmaW5kZXg7Ci0KLSNlbHNlCi0gICAgc3RyY3B5KHNhLnNhX2RhdGEsIGlmbmFtZSk7Ci0jZW5kaWYKLQotICAgIC8qIFdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBwYWNrZXRzIG9uIHNwZWNpZmllZCBpbnRlcmZhY2UgKi8KLSAgICBpZiAoYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2EsIHNpemVvZihzYSkpIDwgMCkgewotCWVycm9yKCJGYWlsZWQgdG8gYmluZCB0byBpbnRlcmZhY2UgJXM6ICVtIiwgaWZuYW1lKTsKLQljbG9zZShmZCk7Ci0JcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHJldHVybiBmZDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSolRlVOQ1RJT046IHNlbmRQYWNrZXQKLSolQVJHVU1FTlRTOgotKiBzb2NrIC0tIHNvY2tldCB0byBzZW5kIHRvCi0qIHBrdCAtLSB0aGUgcGFja2V0IHRvIHRyYW5zbWl0Ci0qIHNpemUgLS0gc2l6ZSBvZiBwYWNrZXQgKGluIGJ5dGVzKQotKiVSRVRVUk5TOgotKiAwIG9uIHN1Y2Nlc3M7IC0xIG9uIGZhaWx1cmUKLSolREVTQ1JJUFRJT046Ci0qIFRyYW5zbWl0cyBhIHBhY2tldAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQKLXNlbmRQYWNrZXQoUFBQb0VDb25uZWN0aW9uICpjb25uLCBpbnQgc29jaywgUFBQb0VQYWNrZXQgKnBrdCwgaW50IHNpemUpCi17Ci0gICAgaW50IGVycjsKLQotICAgIGlmIChkZWJ1ZykKLQlwcHBvZV9sb2dfcGFja2V0KCJTZW5kICIsIHBrdCk7Ci0jaWYgZGVmaW5lZChIQVZFX1NUUlVDVF9TT0NLQUREUl9MTCkKLSAgICBlcnIgPSBzZW5kKHNvY2ssIHBrdCwgc2l6ZSwgMCk7Ci0jZWxzZQotICAgIHN0cnVjdCBzb2NrYWRkciBzYTsKLQotICAgIHN0cmNweShzYS5zYV9kYXRhLCBjb25uLT5pZk5hbWUpOwotICAgIGVyciA9IHNlbmR0byhzb2NrLCBwa3QsIHNpemUsIDAsICZzYSwgc2l6ZW9mKHNhKSk7Ci0jZW5kaWYKLSAgICBpZiAoZXJyIDwgMCkgewotCWVycm9yKCJlcnJvciBzZW5kaW5nIHBwcG9lIHBhY2tldDogJW0iKTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSolRlVOQ1RJT046IHJlY2VpdmVQYWNrZXQKLSolQVJHVU1FTlRTOgotKiBzb2NrIC0tIHNvY2tldCB0byByZWFkIGZyb20KLSogcGt0IC0tIHBsYWNlIHRvIHN0b3JlIHRoZSByZWNlaXZlZCBwYWNrZXQKLSogc2l6ZSAtLSBzZXQgdG8gc2l6ZSBvZiBwYWNrZXQgaW4gYnl0ZXMKLSolUkVUVVJOUzoKLSogPj0gMCBpZiBhbGwgT0s7IDwgMCBpZiBlcnJvcgotKiVERVNDUklQVElPTjoKLSogUmVjZWl2ZXMgYSBwYWNrZXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50Ci1yZWNlaXZlUGFja2V0KGludCBzb2NrLCBQUFBvRVBhY2tldCAqcGt0LCBpbnQgKnNpemUpCi17Ci0gICAgaWYgKCgqc2l6ZSA9IHJlY3Yoc29jaywgcGt0LCBzaXplb2YoUFBQb0VQYWNrZXQpLCAwKSkgPCAwKSB7Ci0JZXJyb3IoImVycm9yIHJlY2VpdmluZyBwcHBvZSBwYWNrZXQ6ICVtIik7Ci0JcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoZGVidWcpCi0JcHBwb2VfbG9nX3BhY2tldCgiUmVjdiAiLCBwa3QpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvcHBwZC9wbHVnaW5zL3JwLXBwcG9lL3BsdWdpbi5jIGIvcHBwZC9wbHVnaW5zL3JwLXBwcG9lL3BsdWdpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGMyYmI0Li4wMDAwMDAwCi0tLSBhL3BwcGQvcGx1Z2lucy9ycC1wcHBvZS9wbHVnaW4uYworKysgL2Rldi9udWxsCkBAIC0xLDQ0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogcGx1Z2luLmMKLSoKLSogcHBwZCBwbHVnaW4gZm9yIGtlcm5lbC1tb2RlIFBQUG9FIG9uIExpbnV4Ci0qCi0qIENvcHlyaWdodCAoQykgMjAwMSBieSBSb2FyaW5nIFBlbmd1aW4gU29mdHdhcmUgSW5jLiwgTWljaGFsIE9zdHJvd3NraQotKiBhbmQgSmFtYWwgSGFkaSBTYWxpbS4KLSoKLSogTXVjaCBjb2RlIGFuZCBtYW55IGlkZWFzIGRlcml2ZWQgZnJvbSBwcHBvZSBwbHVnaW4gYnkgTWljaGFsCi0qIE9zdHJvd3NraSBhbmQgSmFtYWwgSGFkaSBTYWxpbSwgd2hpY2ggY2FycmllcyB0aGlzIGNvcHlyaWdodDoKLSoKLSogQ29weXJpZ2h0IDIwMDAgTWljaGFsIE9zdHJvd3NraSA8bW9zdHJvd3NAc3R5eC51d2F0ZXJsb28uY2E+LAotKiAgICAgICAgICAgICAgICBKYW1hbCBIYWRpIFNhbGltIDxoYWRpQGN5YmVydXMuY2E+Ci0qIEJvcnJvd3MgaGVhdmlseSBmcm9tIHRoZSBQUFBvQVRNIHBsdWdpbiBieSBNaXRjaGVsbCBCbGFuayBKci4sCi0qIHdoaWNoIGlzIGJhc2VkIGluIHBhcnQgb24gd29yayBmcm9tIEplbnMgQXhib2UgYW5kIFBhdWwgTWFja2VycmFzLgotKgotKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0qIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0qIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBjaGFyIGNvbnN0IFJDU0lEW10gPQotIiRJZDogcGx1Z2luLmMsdiAxLjE3IDIwMDgvMDYvMTUgMDQ6MzU6NTAgcGF1bHVzIEV4cCAkIjsKLQotI2RlZmluZSBfR05VX1NPVVJDRSAxCi0jaW5jbHVkZSAicHBwb2UuaCIKLQotI2luY2x1ZGUgInBwcGQvcHBwZC5oIgotI2luY2x1ZGUgInBwcGQvZnNtLmgiCi0jaW5jbHVkZSAicHBwZC9sY3AuaCIKLSNpbmNsdWRlICJwcHBkL2lwY3AuaCIKLSNpbmNsdWRlICJwcHBkL2NjcC5oIgotLyogI2luY2x1ZGUgInBwcGQvcGF0aG5hbWVzLmgiICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxuZXQvZXRoZXJuZXQuaD4KLSNpbmNsdWRlIDxuZXQvaWZfYXJwLmg+Ci0jaW5jbHVkZSA8bGludXgvcHBwX2RlZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9wcHBveC5oPgotCi0jaWZuZGVmIF9ST09UX1BBVEgKLSNkZWZpbmUgX1JPT1RfUEFUSCAiIgotI2VuZGlmCi0KLSNkZWZpbmUgX1BBVEhfRVRIT1BUICAgICAgICAgX1JPT1RfUEFUSCAiL2V0Yy9wcHAvb3B0aW9ucy4iCi0KLWNoYXIgcHBwZF92ZXJzaW9uW10gPSBWRVJTSU9OOwotCi0vKiBGcm9tIHN5cy1saW51eC5jIGluIHBwcGQgLS0gTVVTVCBGSVggVEhJUyEgKi8KLWV4dGVybiBpbnQgbmV3X3N0eWxlX2RyaXZlcjsKLQotY2hhciAqcHBwZF9wcHBvZV9zZXJ2aWNlID0gTlVMTDsKLXN0YXRpYyBjaGFyICphY05hbWUgPSBOVUxMOwotc3RhdGljIGNoYXIgKmV4aXN0aW5nU2Vzc2lvbiA9IE5VTEw7Ci1zdGF0aWMgaW50IHByaW50QUNOYW1lcyA9IDA7Ci1zdGF0aWMgY2hhciAqcHBwb2VfcmVxZF9tYWMgPSBOVUxMOwotdW5zaWduZWQgY2hhciBwcHBvZV9yZXFkX21hY19hZGRyWzZdOwotCi1zdGF0aWMgaW50IFBQUG9FRGV2bmFtZUhvb2soY2hhciAqY21kLCBjaGFyICoqYXJndiwgaW50IGRvaXQpOwotc3RhdGljIG9wdGlvbl90IE9wdGlvbnNbXSA9IHsKLSAgICB7ICJkZXZpY2UgbmFtZSIsIG9fd2lsZCwgKHZvaWQgKikgJlBQUG9FRGV2bmFtZUhvb2ssCi0gICAgICAiUFBQb0UgZGV2aWNlIG5hbWUiLAotICAgICAgT1BUX0RFVk5BTSB8IE9QVF9QUklWRklYIHwgT1BUX05PQVJHICB8IE9QVF9BMlNUUlZBTCB8IE9QVF9TVEFUSUMsCi0gICAgICBkZXZuYW19LAotICAgIHsgInJwX3BwcG9lX3NlcnZpY2UiLCBvX3N0cmluZywgJnBwcGRfcHBwb2Vfc2VydmljZSwKLSAgICAgICJEZXNpcmVkIFBQUG9FIHNlcnZpY2UgbmFtZSIgfSwKLSAgICB7ICJycF9wcHBvZV9hYyIsICAgICAgb19zdHJpbmcsICZhY05hbWUsCi0gICAgICAiRGVzaXJlZCBQUFBvRSBhY2Nlc3MgY29uY2VudHJhdG9yIG5hbWUiIH0sCi0gICAgeyAicnBfcHBwb2Vfc2VzcyIsICAgIG9fc3RyaW5nLCAmZXhpc3RpbmdTZXNzaW9uLAotICAgICAgIkF0dGFjaCB0byBleGlzdGluZyBzZXNzaW9uIChzZXNzaWQ6bWFjYWRkcikiIH0sCi0gICAgeyAicnBfcHBwb2VfdmVyYm9zZSIsIG9faW50LCAmcHJpbnRBQ05hbWVzLAotICAgICAgIkJlIHZlcmJvc2UgYWJvdXQgZGlzY292ZXJlZCBhY2Nlc3MgY29uY2VudHJhdG9ycyJ9LAotICAgIHsgInBwcG9lLW1hYyIsIG9fc3RyaW5nLCAmcHBwb2VfcmVxZF9tYWMsCi0gICAgICAiT25seSBjb25uZWN0IHRvIHNwZWNpZmllZCBNQUMgYWRkcmVzcyIgfSwKLSAgICB7IE5VTEwgfQotfTsKLWludCAoKk9sZERldm5hbWVIb29rKShjaGFyICpjbWQsIGNoYXIgKiphcmd2LCBpbnQgZG9pdCkgPSBOVUxMOwotc3RhdGljIFBQUG9FQ29ubmVjdGlvbiAqY29ubiA9IE5VTEw7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAlRlVOQ1RJT046IFBQUE9FSW5pdERldmljZQotICogJUFSR1VNRU5UUzoKLSAqIE5vbmUKLSAqICVSRVRVUk5TOgotICoKLSAqICVERVNDUklQVElPTjoKLSAqIEluaXRpYWxpemVzIFBQUG9FIGRldmljZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQKLVBQUE9FSW5pdERldmljZSh2b2lkKQotewotICAgIGNvbm4gPSBtYWxsb2Moc2l6ZW9mKFBQUG9FQ29ubmVjdGlvbikpOwotICAgIGlmICghY29ubikgewotCW5vdm0oIlBQUG9FIHNlc3Npb24gZGF0YSIpOwotICAgIH0KLSAgICBtZW1zZXQoY29ubiwgMCwgc2l6ZW9mKFBQUG9FQ29ubmVjdGlvbikpOwotICAgIGNvbm4tPmlmTmFtZSA9IGRldm5hbTsKLSAgICBjb25uLT5kaXNjb3ZlcnlTb2NrZXQgPSAtMTsKLSAgICBjb25uLT5zZXNzaW9uU29ja2V0ID0gLTE7Ci0gICAgY29ubi0+dXNlSG9zdFVuaXEgPSAxOwotICAgIGNvbm4tPnByaW50QUNOYW1lcyA9IHByaW50QUNOYW1lczsKLSAgICBjb25uLT5kaXNjb3ZlcnlUaW1lb3V0ID0gUEFESV9USU1FT1VUOwotICAgIHJldHVybiAxOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogJUZVTkNUSU9OOiBQUFBPRUNvbm5lY3REZXZpY2UKLSAqICVBUkdVTUVOVFM6Ci0gKiBOb25lCi0gKiAlUkVUVVJOUzoKLSAqIE5vbi1uZWdhdGl2ZSBpZiBhbGwgZ29lcyB3ZWxsOyAtMSBvdGhlcndpc2UKLSAqICVERVNDUklQVElPTjoKLSAqIENvbm5lY3RzIFBQUG9FIGRldmljZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQKLVBQUE9FQ29ubmVjdERldmljZSh2b2lkKQotewotICAgIHN0cnVjdCBzb2NrYWRkcl9wcHBveCBzcDsKLSAgICBzdHJ1Y3QgaWZyZXEgaWZyOwotICAgIGludCBzOwotCi0gICAgLyogT3BlbiBzZXNzaW9uIHNvY2tldCBiZWZvcmUgZGlzY292ZXJ5IHBoYXNlLCB0byBhdm9pZCBsb3Npbmcgc2Vzc2lvbiAqLwotICAgIC8qIHBhY2tldHMgc2VudCBieSBwZWVyIGp1c3QgYWZ0ZXIgUEFEUyBwYWNrZXQgKG5vdGVkIG9uIHNvbWUgQ2lzY28gICAgKi8KLSAgICAvKiBzZXJ2ZXIgZXF1aXBtZW50KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogT3BlbmluZyB0aGlzIHNvY2tldCBqdXN0IGJlZm9yZSB3YWl0Rm9yUEFEUyBpbiB0aGUgZGlzY292ZXJ5KCkgICAgICAqLwotICAgIC8qIGZ1bmN0aW9uIHdvdWxkIGJlIG1vcmUgYXBwcm9wcmlhdGUsIGJ1dCBpdCB3b3VsZCBtZXNzLXVwIHRoZSBjb2RlICAgKi8KLSAgICBjb25uLT5zZXNzaW9uU29ja2V0ID0gc29ja2V0KEFGX1BQUE9YLCBTT0NLX1NUUkVBTSwgUFhfUFJPVE9fT0UpOwotICAgIGlmIChjb25uLT5zZXNzaW9uU29ja2V0IDwgMCkgewotCWVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIFBQUG9FIHNvY2tldDogJW0iKTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogUmVzdG9yZSBjb25maWd1cmF0aW9uICovCi0gICAgbGNwX2FsbG93b3B0aW9uc1swXS5tcnUgPSBjb25uLT5tdHU7Ci0gICAgbGNwX3dhbnRvcHRpb25zWzBdLm1ydSA9IGNvbm4tPm1ydTsKLQotICAgIC8qIFVwZGF0ZSBtYXhpbXVtIE1SVSAqLwotICAgIHMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7Ci0gICAgaWYgKHMgPCAwKSB7Ci0JZXJyb3IoIkNhbid0IGdldCBNVFUgZm9yICVzOiAlbSIsIGNvbm4tPmlmTmFtZSk7Ci0JZ290byBlcnJvdXQ7Ci0gICAgfQotICAgIHN0cm5jcHkoaWZyLmlmcl9uYW1lLCBjb25uLT5pZk5hbWUsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKLSAgICBpZiAoaW9jdGwocywgU0lPQ0dJRk1UVSwgJmlmcikgPCAwKSB7Ci0JZXJyb3IoIkNhbid0IGdldCBNVFUgZm9yICVzOiAlbSIsIGNvbm4tPmlmTmFtZSk7Ci0JY2xvc2Uocyk7Ci0JZ290byBlcnJvdXQ7Ci0gICAgfQotICAgIGNsb3NlKHMpOwotCi0gICAgaWYgKGxjcF9hbGxvd29wdGlvbnNbMF0ubXJ1ID4gaWZyLmlmcl9tdHUgLSBUT1RBTF9PVkVSSEVBRCkKLQlsY3BfYWxsb3dvcHRpb25zWzBdLm1ydSA9IGlmci5pZnJfbXR1IC0gVE9UQUxfT1ZFUkhFQUQ7Ci0gICAgaWYgKGxjcF93YW50b3B0aW9uc1swXS5tcnUgPiBpZnIuaWZyX210dSAtIFRPVEFMX09WRVJIRUFEKQotCWxjcF93YW50b3B0aW9uc1swXS5tcnUgPSBpZnIuaWZyX210dSAtIFRPVEFMX09WRVJIRUFEOwotCi0gICAgY29ubi0+YWNOYW1lID0gYWNOYW1lOwotICAgIGNvbm4tPnNlcnZpY2VOYW1lID0gcHBwZF9wcHBvZV9zZXJ2aWNlOwotICAgIHN0cmxjcHkocHBwX2Rldm5hbSwgZGV2bmFtLCBzaXplb2YocHBwX2Rldm5hbSkpOwotICAgIGlmIChleGlzdGluZ1Nlc3Npb24pIHsKLQl1bnNpZ25lZCBpbnQgbWFjW0VUSF9BTEVOXTsKLQlpbnQgaSwgc2VzOwotCWlmIChzc2NhbmYoZXhpc3RpbmdTZXNzaW9uLCAiJWQ6JXg6JXg6JXg6JXg6JXg6JXgiLAotCQkgICAmc2VzLCAmbWFjWzBdLCAmbWFjWzFdLCAmbWFjWzJdLAotCQkgICAmbWFjWzNdLCAmbWFjWzRdLCAmbWFjWzVdKSAhPSA3KSB7Ci0JICAgIGZhdGFsKCJJbGxlZ2FsIHZhbHVlIGZvciBycF9wcHBvZV9zZXNzIG9wdGlvbiIpOwotCX0KLQljb25uLT5zZXNzaW9uID0gaHRvbnMoc2VzKTsKLQlmb3IgKGk9MDsgaTxFVEhfQUxFTjsgaSsrKSB7Ci0JICAgIGNvbm4tPnBlZXJFdGhbaV0gPSAodW5zaWduZWQgY2hhcikgbWFjW2ldOwotCX0KLSAgICB9IGVsc2UgewotCWNvbm4tPmRpc2NvdmVyeVNvY2tldCA9Ci0gICAgICAgICAgICBvcGVuSW50ZXJmYWNlKGNvbm4tPmlmTmFtZSwgRXRoX1BQUE9FX0Rpc2NvdmVyeSwgY29ubi0+bXlFdGgpOwotCWRpc2NvdmVyeShjb25uKTsKLQlpZiAoY29ubi0+ZGlzY292ZXJ5U3RhdGUgIT0gU1RBVEVfU0VTU0lPTikgewotCSAgICBlcnJvcigiVW5hYmxlIHRvIGNvbXBsZXRlIFBQUG9FIERpc2NvdmVyeSIpOwotCSAgICBnb3RvIGVycm91dDsKLQl9Ci0gICAgfQotCi0gICAgLyogU2V0IFBQUG9FIHNlc3Npb24tbnVtYmVyIGZvciBmdXJ0aGVyIGNvbnN1bXB0aW9uICovCi0gICAgcHBwX3Nlc3Npb25fbnVtYmVyID0gbnRvaHMoY29ubi0+c2Vzc2lvbik7Ci0KLSAgICBzcC5zYV9mYW1pbHkgPSBBRl9QUFBPWDsKLSAgICBzcC5zYV9wcm90b2NvbCA9IFBYX1BST1RPX09FOwotICAgIHNwLnNhX2FkZHIucHBwb2Uuc2lkID0gY29ubi0+c2Vzc2lvbjsKLSAgICBtZW1jcHkoc3Auc2FfYWRkci5wcHBvZS5kZXYsIGNvbm4tPmlmTmFtZSwgSUZOQU1TSVopOwotICAgIG1lbWNweShzcC5zYV9hZGRyLnBwcG9lLnJlbW90ZSwgY29ubi0+cGVlckV0aCwgRVRIX0FMRU4pOwotCi0gICAgLyogU2V0IHJlbW90ZV9udW1iZXIgZm9yIFNlcnZQb0VUICovCi0gICAgc3ByaW50ZihyZW1vdGVfbnVtYmVyLCAiJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlgiLAotCSAgICAodW5zaWduZWQpIGNvbm4tPnBlZXJFdGhbMF0sCi0JICAgICh1bnNpZ25lZCkgY29ubi0+cGVlckV0aFsxXSwKLQkgICAgKHVuc2lnbmVkKSBjb25uLT5wZWVyRXRoWzJdLAotCSAgICAodW5zaWduZWQpIGNvbm4tPnBlZXJFdGhbM10sCi0JICAgICh1bnNpZ25lZCkgY29ubi0+cGVlckV0aFs0XSwKLQkgICAgKHVuc2lnbmVkKSBjb25uLT5wZWVyRXRoWzVdKTsKLQotICAgIHdhcm4oIkNvbm5lY3RlZCB0byAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCB2aWEgaW50ZXJmYWNlICVzIiwKLQkgKHVuc2lnbmVkKSBjb25uLT5wZWVyRXRoWzBdLAotCSAodW5zaWduZWQpIGNvbm4tPnBlZXJFdGhbMV0sCi0JICh1bnNpZ25lZCkgY29ubi0+cGVlckV0aFsyXSwKLQkgKHVuc2lnbmVkKSBjb25uLT5wZWVyRXRoWzNdLAotCSAodW5zaWduZWQpIGNvbm4tPnBlZXJFdGhbNF0sCi0JICh1bnNpZ25lZCkgY29ubi0+cGVlckV0aFs1XSwKLQkgY29ubi0+aWZOYW1lKTsKLQotICAgIHNjcmlwdF9zZXRlbnYoIk1BQ1JFTU9URSIsIHJlbW90ZV9udW1iZXIsIDApOwotCi0gICAgaWYgKGNvbm5lY3QoY29ubi0+c2Vzc2lvblNvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc3AsCi0JCXNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfcHBwb3gpKSA8IDApIHsKLQllcnJvcigiRmFpbGVkIHRvIGNvbm5lY3QgUFBQb0Ugc29ja2V0OiAlZCAlbSIsIGVycm5vKTsKLQlnb3RvIGVycm91dDsKLSAgICB9Ci0KLSAgICByZXR1cm4gY29ubi0+c2Vzc2lvblNvY2tldDsKLQotIGVycm91dDoKLSAgICBpZiAoY29ubi0+ZGlzY292ZXJ5U29ja2V0ID49IDApIHsKLQlzZW5kUEFEVChjb25uLCBOVUxMKTsKLQljbG9zZShjb25uLT5kaXNjb3ZlcnlTb2NrZXQpOwotCWNvbm4tPmRpc2NvdmVyeVNvY2tldCA9IC0xOwotICAgIH0KLSAgICBjbG9zZShjb25uLT5zZXNzaW9uU29ja2V0KTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1QUFBPRVJlY3ZDb25maWcoaW50IG1ydSwKLQkJdV9pbnQzMl90IGFzeW5jbWFwLAotCQlpbnQgcGNvbXAsCi0JCWludCBhY2NvbXApCi17Ci0jaWYgMCAvKiBicm9rZW4gcHJvdG9jb2wsIGJ1dCBubyBwb2ludCBoYXJyYXNzaW5nIHRoZSB1c2VycyBJIGd1ZXNzLi4uICovCi0gICAgaWYgKG1ydSA+IE1BWF9QUFBPRV9NVFUpCi0Jd2FybigiQ291bGRuJ3QgaW5jcmVhc2UgTVJVIHRvICVkIiwgbXJ1KTsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogJUZVTkNUSU9OOiBQUFBPRURpc2Nvbm5lY3REZXZpY2UKLSAqICVBUkdVTUVOVFM6Ci0gKiBOb25lCi0gKiAlUkVUVVJOUzoKLSAqIE5vdGhpbmcKLSAqICVERVNDUklQVElPTjoKLSAqIERpc2Nvbm5lY3RzIFBQUG9FIGRldmljZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLVBQUE9FRGlzY29ubmVjdERldmljZSh2b2lkKQotewotICAgIHN0cnVjdCBzb2NrYWRkcl9wcHBveCBzcDsKLQotICAgIHNwLnNhX2ZhbWlseSA9IEFGX1BQUE9YOwotICAgIHNwLnNhX3Byb3RvY29sID0gUFhfUFJPVE9fT0U7Ci0gICAgc3Auc2FfYWRkci5wcHBvZS5zaWQgPSAwOwotICAgIG1lbWNweShzcC5zYV9hZGRyLnBwcG9lLmRldiwgY29ubi0+aWZOYW1lLCBJRk5BTVNJWik7Ci0gICAgbWVtY3B5KHNwLnNhX2FkZHIucHBwb2UucmVtb3RlLCBjb25uLT5wZWVyRXRoLCBFVEhfQUxFTik7Ci0gICAgaWYgKGNvbm5lY3QoY29ubi0+c2Vzc2lvblNvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc3AsCi0JCXNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfcHBwb3gpKSA8IDApCi0JZXJyb3IoIkZhaWxlZCB0byBkaXNjb25uZWN0IFBQUG9FIHNvY2tldDogJWQgJW0iLCBlcnJubyk7Ci0gICAgY2xvc2UoY29ubi0+c2Vzc2lvblNvY2tldCk7Ci0gICAgLyogZG9uJ3Qgc2VuZCBQQURUPz8gKi8KLSAgICBpZiAoY29ubi0+ZGlzY292ZXJ5U29ja2V0ID49IDApCi0JY2xvc2UoY29ubi0+ZGlzY292ZXJ5U29ja2V0KTsKLX0KLQotc3RhdGljIHZvaWQKLVBQUE9FRGV2aWNlT3B0aW9ucyh2b2lkKQotewotICAgIGNoYXIgYnVmWzI1Nl07Ci0gICAgc25wcmludGYoYnVmLCAyNTYsIF9QQVRIX0VUSE9QVCAiJXMiLCBkZXZuYW0pOwotICAgIGlmICghb3B0aW9uc19mcm9tX2ZpbGUoYnVmLCAwLCAwLCAxKSkKLQlleGl0KEVYSVRfT1BUSU9OX0VSUk9SKTsKLQotfQotCi1zdHJ1Y3QgY2hhbm5lbCBwcHBvZV9jaGFubmVsOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogJUZVTkNUSU9OOiBQUFBvRURldm5hbWVIb29rCi0gKiAlQVJHVU1FTlRTOgotICogY21kIC0tIHRoZSBjb21tYW5kIChhY3R1YWxseSwgdGhlIGRldmljZSBuYW1lCi0gKiBhcmd2IC0tIGFyZ3VtZW50IHZlY3RvcgotICogZG9pdCAtLSBpZiBub24temVybywgc2V0IGRldmljZSBuYW1lLiAgT3RoZXJ3aXNlLCBqdXN0IGNoZWNrIGlmIHBvc3NpYmxlCi0gKiAlUkVUVVJOUzoKLSAqIDEgaWYgd2Ugd2lsbCBoYW5kbGUgdGhpcyBkZXZpY2U7IDAgb3RoZXJ3aXNlLgotICogJURFU0NSSVBUSU9OOgotICogQ2hlY2tzIGlmIG5hbWUgaXMgYSB2YWxpZCBpbnRlcmZhY2UgbmFtZTsgaWYgc28sIHJldHVybnMgMS4gIEFsc28KLSAqIHNldHMgdXAgZGV2bmFtIChzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZGV2aWNlKS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQKLVBQUG9FRGV2bmFtZUhvb2soY2hhciAqY21kLCBjaGFyICoqYXJndiwgaW50IGRvaXQpCi17Ci0gICAgaW50IHIgPSAxOwotICAgIGludCBmZDsKLSAgICBzdHJ1Y3QgaWZyZXEgaWZyOwotCi0gICAgLyoKLSAgICAgKiBUYWtlIGFueSBvdGhlcndpc2UtdW5yZWNvZ25pemVkIG9wdGlvbiBhcyBhIHBvc3NpYmxlIGRldmljZSBuYW1lLAotICAgICAqIGFuZCB0ZXN0IGlmIGl0IGlzIHRoZSBuYW1lIG9mIGEgbmV0d29yayBpbnRlcmZhY2Ugd2l0aCBhCi0gICAgICogaGFyZHdhcmUgYWRkcmVzcyB3aG9zZSBzYV9mYW1pbHkgaXMgQVJQSFJEX0VUSEVSLgotICAgICAqLwotICAgIGlmIChzdHJsZW4oY21kKSA+IDQgJiYgIXN0cm5jbXAoY21kLCAibmljLSIsIDQpKSB7Ci0JLyogU3RyaXAgb2ZmICJuaWMtIiAqLwotCWNtZCArPSA0OwotICAgIH0KLQotICAgIC8qIE9wZW4gYSBzb2NrZXQgKi8KLSAgICBpZiAoKGZkID0gc29ja2V0KFBGX1BBQ0tFVCwgU09DS19SQVcsIDApKSA8IDApIHsKLQlyID0gMDsKLSAgICB9Ci0KLSAgICAvKiBUcnkgZ2V0dGluZyBpbnRlcmZhY2UgaW5kZXggKi8KLSAgICBpZiAocikgewotCXN0cm5jcHkoaWZyLmlmcl9uYW1lLCBjbWQsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKLQlpZiAoaW9jdGwoZmQsIFNJT0NHSUZJTkRFWCwgJmlmcikgPCAwKSB7Ci0JICAgIHIgPSAwOwotCX0gZWxzZSB7Ci0JICAgIGlmIChpb2N0bChmZCwgU0lPQ0dJRkhXQUREUiwgJmlmcikgPCAwKSB7Ci0JCXIgPSAwOwotCSAgICB9IGVsc2UgewotCQlpZiAoaWZyLmlmcl9od2FkZHIuc2FfZmFtaWx5ICE9IEFSUEhSRF9FVEhFUikgewotCQkgICAgaWYgKGRvaXQpCi0JCQllcnJvcigiSW50ZXJmYWNlICVzIG5vdCBFdGhlcm5ldCIsIGNtZCk7Ci0JCSAgICByID0gMDsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIC8qIENsb3NlIHNvY2tldCAqLwotICAgIGNsb3NlKGZkKTsKLSAgICBpZiAociAmJiBkb2l0KSB7Ci0Jc3RybmNweShkZXZuYW0sIGNtZCwgc2l6ZW9mKGRldm5hbSkpOwotCWlmICh0aGVfY2hhbm5lbCAhPSAmcHBwb2VfY2hhbm5lbCkgewotCi0JICAgIHRoZV9jaGFubmVsID0gJnBwcG9lX2NoYW5uZWw7Ci0JICAgIG1vZGVtID0gMDsKLQotCSAgICBQUFBPRUluaXREZXZpY2UoKTsKLQl9Ci0JcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIHI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAlRlVOQ1RJT046IHBsdWdpbl9pbml0Ci0gKiAlQVJHVU1FTlRTOgotICogTm9uZQotICogJVJFVFVSTlM6Ci0gKiBOb3RoaW5nCi0gKiAlREVTQ1JJUFRJT046Ci0gKiBJbml0aWFsaXplcyBob29rcyBmb3IgcHBwZCBwbHVnaW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLXBsdWdpbl9pbml0KHZvaWQpCi17Ci0gICAgaWYgKCFwcHBfYXZhaWxhYmxlKCkgJiYgIW5ld19zdHlsZV9kcml2ZXIpIHsKLQlmYXRhbCgiTGludXgga2VybmVsIGRvZXMgbm90IHN1cHBvcnQgUFBQb0UgLS0gYXJlIHlvdSBydW5uaW5nIDIuNC54PyIpOwotICAgIH0KLQotICAgIGFkZF9vcHRpb25zKE9wdGlvbnMpOwotCi0gICAgaW5mbygiUlAtUFBQb0UgcGx1Z2luIHZlcnNpb24gJXMgY29tcGlsZWQgYWdhaW5zdCBwcHBkICVzIiwKLQkgUlBfVkVSU0lPTiwgVkVSU0lPTik7Ci19Ci0KLXZvaWQgcHBwb2VfY2hlY2tfb3B0aW9ucyh2b2lkKQotewotICAgIHVuc2lnbmVkIGludCBtYWNbNl07Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAocHBwb2VfcmVxZF9tYWMgIT0gTlVMTCkgewotCWlmIChzc2NhbmYocHBwb2VfcmVxZF9tYWMsICIleDoleDoleDoleDoleDoleCIsCi0JCSAgICZtYWNbMF0sICZtYWNbMV0sICZtYWNbMl0sICZtYWNbM10sCi0JCSAgICZtYWNbNF0sICZtYWNbNV0pICE9IDYpIHsKLQkgICAgb3B0aW9uX2Vycm9yKCJjYW5ub3QgcGFyc2UgcHBwb2UtbWFjIG9wdGlvbiB2YWx1ZSIpOwotCSAgICBleGl0KEVYSVRfT1BUSU9OX0VSUk9SKTsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IDY7ICsraSkKLQkgICAgY29ubi0+cmVxX3BlZXJfbWFjW2ldID0gbWFjW2ldOwotCWNvbm4tPnJlcV9wZWVyID0gMTsKLSAgICB9Ci0KLSAgICBsY3BfYWxsb3dvcHRpb25zWzBdLm5lZ19hY2NvbXByZXNzaW9uID0gMDsKLSAgICBsY3Bfd2FudG9wdGlvbnNbMF0ubmVnX2FjY29tcHJlc3Npb24gPSAwOwotCi0gICAgbGNwX2FsbG93b3B0aW9uc1swXS5uZWdfYXN5bmNtYXAgPSAwOwotICAgIGxjcF93YW50b3B0aW9uc1swXS5uZWdfYXN5bmNtYXAgPSAwOwotCi0gICAgbGNwX2FsbG93b3B0aW9uc1swXS5uZWdfcGNvbXByZXNzaW9uID0gMDsKLSAgICBsY3Bfd2FudG9wdGlvbnNbMF0ubmVnX3Bjb21wcmVzc2lvbiA9IDA7Ci0KLSAgICBpZiAobGNwX2FsbG93b3B0aW9uc1swXS5tcnUgPiBNQVhfUFBQT0VfTVRVKQotCWxjcF9hbGxvd29wdGlvbnNbMF0ubXJ1ID0gTUFYX1BQUE9FX01UVTsKLSAgICBpZiAobGNwX3dhbnRvcHRpb25zWzBdLm1ydSA+IE1BWF9QUFBPRV9NVFUpCi0JbGNwX3dhbnRvcHRpb25zWzBdLm1ydSA9IE1BWF9QUFBPRV9NVFU7Ci0KLSAgICAvKiBTYXZlIGNvbmZpZ3VyYXRpb24gKi8KLSAgICBjb25uLT5tdHUgPSBsY3BfYWxsb3dvcHRpb25zWzBdLm1ydTsKLSAgICBjb25uLT5tcnUgPSBsY3Bfd2FudG9wdGlvbnNbMF0ubXJ1OwotCi0gICAgY2NwX2FsbG93b3B0aW9uc1swXS5kZWZsYXRlID0gMDsKLSAgICBjY3Bfd2FudG9wdGlvbnNbMF0uZGVmbGF0ZSA9IDA7Ci0KLSAgICBpcGNwX2FsbG93b3B0aW9uc1swXS5uZWdfdmogPSAwOwotICAgIGlwY3Bfd2FudG9wdGlvbnNbMF0ubmVnX3ZqID0gMDsKLQotICAgIGNjcF9hbGxvd29wdGlvbnNbMF0uYnNkX2NvbXByZXNzID0gMDsKLSAgICBjY3Bfd2FudG9wdGlvbnNbMF0uYnNkX2NvbXByZXNzID0gMDsKLX0KLQotc3RydWN0IGNoYW5uZWwgcHBwb2VfY2hhbm5lbCA9IHsKLSAgICAub3B0aW9ucyA9IE9wdGlvbnMsCi0gICAgLnByb2Nlc3NfZXh0cmFfb3B0aW9ucyA9ICZQUFBPRURldmljZU9wdGlvbnMsCi0gICAgLmNoZWNrX29wdGlvbnMgPSBwcHBvZV9jaGVja19vcHRpb25zLAotICAgIC5jb25uZWN0ID0gJlBQUE9FQ29ubmVjdERldmljZSwKLSAgICAuZGlzY29ubmVjdCA9ICZQUFBPRURpc2Nvbm5lY3REZXZpY2UsCi0gICAgLmVzdGFibGlzaF9wcHAgPSAmZ2VuZXJpY19lc3RhYmxpc2hfcHBwLAotICAgIC5kaXNlc3RhYmxpc2hfcHBwID0gJmdlbmVyaWNfZGlzZXN0YWJsaXNoX3BwcCwKLSAgICAuc2VuZF9jb25maWcgPSBOVUxMLAotICAgIC5yZWN2X2NvbmZpZyA9ICZQUFBPRVJlY3ZDb25maWcsCi0gICAgLmNsb3NlID0gTlVMTCwKLSAgICAuY2xlYW51cCA9IE5VTEwKLX07CmRpZmYgLS1naXQgYS9wcHBkL3BsdWdpbnMvcnAtcHBwb2UvcHBwb2UtZGlzY292ZXJ5LmMgYi9wcHBkL3BsdWdpbnMvcnAtcHBwb2UvcHBwb2UtZGlzY292ZXJ5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkM2JmNGUuLjAwMDAwMDAKLS0tIGEvcHBwZC9wbHVnaW5zL3JwLXBwcG9lL3BwcG9lLWRpc2NvdmVyeS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzI0ICswLDAgQEAKLS8qCi0gKiBQZXJmb3JtIFBQUG9FIGRpc2NvdmVyeQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIGJ5IFJvYXJpbmcgUGVuZ3VpbiBTb2Z0d2FyZSBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgTWFyY28gZCdJdHJpIDxtZEBsaW51eC5pdD4KLSAqCi0gKiBUaGlzIHByb2dyYW0gbWF5IGJlIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJwcHBvZS5oIgotCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX05FVFBBQ0tFVF9QQUNLRVRfSAotI2luY2x1ZGUgPG5ldHBhY2tldC9wYWNrZXQuaD4KLSNlbGlmIGRlZmluZWQoSEFWRV9MSU5VWF9JRl9QQUNLRVRfSCkKLSNpbmNsdWRlIDxsaW51eC9pZl9wYWNrZXQuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9ORVRfRVRIRVJORVRfSAotI2luY2x1ZGUgPG5ldC9ldGhlcm5ldC5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0FTTV9UWVBFU19ICi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1lTX0lPQ1RMX0gKLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2lmZGVmIEhBVkVfTkVUX0lGX0FSUF9ICi0jaW5jbHVkZSA8bmV0L2lmX2FycC5oPgotI2VuZGlmCi0KLWNoYXIgKnhzdHJkdXAoY29uc3QgY2hhciAqcyk7Ci12b2lkIHVzYWdlKHZvaWQpOwotCi12b2lkIGRpZShpbnQgc3RhdHVzKQotewotCWV4aXQoc3RhdHVzKTsKLX0KLQotLyogSW5pdGlhbGl6ZSBmcmFtZSB0eXBlcyB0byBSRkMgMjUxNiB2YWx1ZXMuICBTb21lIGJyb2tlbiBwZWVycyBhcHBhcmVudGx5Ci0gICB1c2UgZGlmZmVyZW50IGZyYW1lIHR5cGVzLi4uIHNpZ2guLi4gKi8KLQotVUlOVDE2X3QgRXRoX1BQUE9FX0Rpc2NvdmVyeSA9IEVUSF9QUFBPRV9ESVNDT1ZFUlk7Ci1VSU5UMTZfdCBFdGhfUFBQT0VfU2Vzc2lvbiAgID0gRVRIX1BQUE9FX1NFU1NJT047Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qJUZVTkNUSU9OOiBldGhlclR5cGUKLSolQVJHVU1FTlRTOgotKiBwYWNrZXQgLS0gYSByZWNlaXZlZCBQUFBvRSBwYWNrZXQKLSolUkVUVVJOUzoKLSogZXRoZXJuZXQgcGFja2V0IHR5cGUgKHNlZSAvdXNyL2luY2x1ZGUvbmV0L2V0aGVydHlwZXMuaCkKLSolREVTQ1JJUFRJT046Ci0qIENoZWNrcyB0aGUgZXRoZXJuZXQgcGFja2V0IGhlYWRlciB0byBkZXRlcm1pbmUgaXRzIHR5cGUuCi0qIFdlIHNob3VsZCBvbmx5IGJlIHJlY2V2ZWluZyBESVNDT1ZFUlkgYW5kIFNFU1NJT04gdHlwZXMgaWYgdGhlIEJQRgotKiBpcyBzZXQgdXAgY29ycmVjdGx5LiAgTG9ncyBhbiBlcnJvciBpZiBhbiB1bmV4cGVjdGVkIHR5cGUgaXMgcmVjZWl2ZWQuCi0qIE5vdGUgdGhhdCB0aGUgZXRoZXJuZXQgdHlwZSBuYW1lcyBjb21lIGZyb20gInBwcG9lLmgiIGFuZCB0aGUgcGFja2V0Ci0qIHBhY2tldCBzdHJ1Y3R1cmUgbmFtZXMgdXNlIHRoZSBMSU5VWCBkaWFsZWN0IHRvIG1haW50YWluIGNvbnNpc3RlbmN5Ci0qIHdpdGggdGhlIHJlc3Qgb2YgdGhpcyBmaWxlLiAgU2VlIHRoZSBCU0Qgc2VjdGlvbiBvZiAicHBwb2UuaCIgZm9yCi0qIHRyYW5zbGF0aW9ucyBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmFtZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVVJTlQxNl90Ci1ldGhlclR5cGUoUFBQb0VQYWNrZXQgKnBhY2tldCkKLXsKLSAgICBVSU5UMTZfdCB0eXBlID0gKFVJTlQxNl90KSBudG9ocyhwYWNrZXQtPmV0aEhkci5oX3Byb3RvKTsKLSAgICBpZiAodHlwZSAhPSBFdGhfUFBQT0VfRGlzY292ZXJ5ICYmIHR5cGUgIT0gRXRoX1BQUE9FX1Nlc3Npb24pIHsKLQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgZXRoZXIgdHlwZSAweCV4XG4iLCB0eXBlKTsKLSAgICB9Ci0gICAgcmV0dXJuIHR5cGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qJUZVTkNUSU9OOiBvcGVuSW50ZXJmYWNlCi0qJUFSR1VNRU5UUzoKLSogaWZuYW1lIC0tIG5hbWUgb2YgaW50ZXJmYWNlCi0qIHR5cGUgLS0gRXRoZXJuZXQgZnJhbWUgdHlwZQotKiBod2FkZHIgLS0gaWYgbm9uLU5VTEwsIHNldCB0byB0aGUgaGFyZHdhcmUgYWRkcmVzcwotKiVSRVRVUk5TOgotKiBBIHJhdyBzb2NrZXQgZm9yIHRhbGtpbmcgdG8gdGhlIEV0aGVybmV0IGNhcmQuICBFeGl0cyBvbiBlcnJvci4KLSolREVTQ1JJUFRJT046Ci0qIE9wZW5zIGEgcmF3IEV0aGVybmV0IHNvY2tldAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQKLW9wZW5JbnRlcmZhY2UoY2hhciBjb25zdCAqaWZuYW1lLCBVSU5UMTZfdCB0eXBlLCB1bnNpZ25lZCBjaGFyICpod2FkZHIpCi17Ci0gICAgaW50IG9wdHZhbD0xOwotICAgIGludCBmZDsKLSAgICBzdHJ1Y3QgaWZyZXEgaWZyOwotICAgIGludCBkb21haW4sIHN0eXBlOwotCi0jaWZkZWYgSEFWRV9TVFJVQ1RfU09DS0FERFJfTEwKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfbGwgc2E7Ci0jZWxzZQotICAgIHN0cnVjdCBzb2NrYWRkciBzYTsKLSNlbmRpZgotCi0gICAgbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNhKSk7Ci0KLSNpZmRlZiBIQVZFX1NUUlVDVF9TT0NLQUREUl9MTAotICAgIGRvbWFpbiA9IFBGX1BBQ0tFVDsKLSAgICBzdHlwZSA9IFNPQ0tfUkFXOwotI2Vsc2UKLSAgICBkb21haW4gPSBQRl9JTkVUOwotICAgIHN0eXBlID0gU09DS19QQUNLRVQ7Ci0jZW5kaWYKLQotICAgIGlmICgoZmQgPSBzb2NrZXQoZG9tYWluLCBzdHlwZSwgaHRvbnModHlwZSkpKSA8IDApIHsKLQkvKiBHaXZlIGEgbW9yZSBoZWxwZnVsIG1lc3NhZ2UgZm9yIHRoZSBjb21tb24gZXJyb3IgY2FzZSAqLwotCWlmIChlcnJubyA9PSBFUEVSTSkgewotCSAgICBycF9mYXRhbCgiQ2Fubm90IGNyZWF0ZSByYXcgc29ja2V0IC0tIHBwcG9lIG11c3QgYmUgcnVuIGFzIHJvb3QuIik7Ci0JfQotCWZhdGFsU3lzKCJzb2NrZXQiKTsKLSAgICB9Ci0KLSAgICBpZiAoc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fQlJPQURDQVNULCAmb3B0dmFsLCBzaXplb2Yob3B0dmFsKSkgPCAwKSB7Ci0JZmF0YWxTeXMoInNldHNvY2tvcHQiKTsKLSAgICB9Ci0KLSAgICAvKiBGaWxsIGluIGhhcmR3YXJlIGFkZHJlc3MgKi8KLSAgICBpZiAoaHdhZGRyKSB7Ci0Jc3RybmNweShpZnIuaWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOwotCWlmIChpb2N0bChmZCwgU0lPQ0dJRkhXQUREUiwgJmlmcikgPCAwKSB7Ci0JICAgIGZhdGFsU3lzKCJpb2N0bChTSU9DR0lGSFdBRERSKSIpOwotCX0KLQltZW1jcHkoaHdhZGRyLCBpZnIuaWZyX2h3YWRkci5zYV9kYXRhLCBFVEhfQUxFTik7Ci0jaWZkZWYgQVJQSFJEX0VUSEVSCi0JaWYgKGlmci5pZnJfaHdhZGRyLnNhX2ZhbWlseSAhPSBBUlBIUkRfRVRIRVIpIHsKLQkgICAgY2hhciBidWZmZXJbMjU2XTsKLQkgICAgc3ByaW50ZihidWZmZXIsICJJbnRlcmZhY2UgJS4xNnMgaXMgbm90IEV0aGVybmV0IiwgaWZuYW1lKTsKLQkgICAgcnBfZmF0YWwoYnVmZmVyKTsKLQl9Ci0jZW5kaWYKLQlpZiAoTk9UX1VOSUNBU1QoaHdhZGRyKSkgewotCSAgICBjaGFyIGJ1ZmZlclsyNTZdOwotCSAgICBzcHJpbnRmKGJ1ZmZlciwKLQkJICAgICJJbnRlcmZhY2UgJS4xNnMgaGFzIGJyb2FkY2FzdC9tdWx0aWNhc3QgTUFDIGFkZHJlc3M/PyIsCi0JCSAgICBpZm5hbWUpOwotCSAgICBycF9mYXRhbChidWZmZXIpOwotCX0KLSAgICB9Ci0KLSAgICAvKiBTYW5pdHkgY2hlY2sgb24gTVRVICovCi0gICAgc3RybmNweShpZnIuaWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOwotICAgIGlmIChpb2N0bChmZCwgU0lPQ0dJRk1UVSwgJmlmcikgPCAwKSB7Ci0JZmF0YWxTeXMoImlvY3RsKFNJT0NHSUZNVFUpIik7Ci0gICAgfQotICAgIGlmIChpZnIuaWZyX210dSA8IEVUSF9EQVRBX0xFTikgewotCWZwcmludGYoc3RkZXJyLCAiSW50ZXJmYWNlICUuMTZzIGhhcyBNVFUgb2YgJWQgLS0gc2hvdWxkIGJlICVkLlxuIiwKLQkgICAgICBpZm5hbWUsIGlmci5pZnJfbXR1LCBFVEhfREFUQV9MRU4pOwotCWZwcmludGYoc3RkZXJyLCAiWW91IG1heSBoYXZlIHNlcmlvdXMgY29ubmVjdGlvbiBwcm9ibGVtcy5cbiIpOwotICAgIH0KLQotI2lmZGVmIEhBVkVfU1RSVUNUX1NPQ0tBRERSX0xMCi0gICAgLyogR2V0IGludGVyZmFjZSBpbmRleCAqLwotICAgIHNhLnNsbF9mYW1pbHkgPSBBRl9QQUNLRVQ7Ci0gICAgc2Euc2xsX3Byb3RvY29sID0gaHRvbnModHlwZSk7Ci0KLSAgICBzdHJuY3B5KGlmci5pZnJfbmFtZSwgaWZuYW1lLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7Ci0gICAgaWYgKGlvY3RsKGZkLCBTSU9DR0lGSU5ERVgsICZpZnIpIDwgMCkgewotCWZhdGFsU3lzKCJpb2N0bChTSU9DRklHSU5ERVgpOiBDb3VsZCBub3QgZ2V0IGludGVyZmFjZSBpbmRleCIpOwotICAgIH0KLSAgICBzYS5zbGxfaWZpbmRleCA9IGlmci5pZnJfaWZpbmRleDsKLQotI2Vsc2UKLSAgICBzdHJjcHkoc2Euc2FfZGF0YSwgaWZuYW1lKTsKLSNlbmRpZgotCi0gICAgLyogV2UncmUgb25seSBpbnRlcmVzdGVkIGluIHBhY2tldHMgb24gc3BlY2lmaWVkIGludGVyZmFjZSAqLwotICAgIGlmIChiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopICZzYSwgc2l6ZW9mKHNhKSkgPCAwKSB7Ci0JZmF0YWxTeXMoImJpbmQiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmQ7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qJUZVTkNUSU9OOiBzZW5kUGFja2V0Ci0qJUFSR1VNRU5UUzoKLSogc29jayAtLSBzb2NrZXQgdG8gc2VuZCB0bwotKiBwa3QgLS0gdGhlIHBhY2tldCB0byB0cmFuc21pdAotKiBzaXplIC0tIHNpemUgb2YgcGFja2V0IChpbiBieXRlcykKLSolUkVUVVJOUzoKLSogMCBvbiBzdWNjZXNzOyAtMSBvbiBmYWlsdXJlCi0qJURFU0NSSVBUSU9OOgotKiBUcmFuc21pdHMgYSBwYWNrZXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50Ci1zZW5kUGFja2V0KFBQUG9FQ29ubmVjdGlvbiAqY29ubiwgaW50IHNvY2ssIFBQUG9FUGFja2V0ICpwa3QsIGludCBzaXplKQotewotI2lmIGRlZmluZWQoSEFWRV9TVFJVQ1RfU09DS0FERFJfTEwpCi0gICAgaWYgKHNlbmQoc29jaywgcGt0LCBzaXplLCAwKSA8IDApIHsKLQlzeXNFcnIoInNlbmQgKHNlbmRQYWNrZXQpIik7Ci0JcmV0dXJuIC0xOwotICAgIH0KLSNlbHNlCi0gICAgc3RydWN0IHNvY2thZGRyIHNhOwotCi0gICAgaWYgKCFjb25uKSB7Ci0JcnBfZmF0YWwoInJlbGF5IGFuZCBzZXJ2ZXIgbm90IHN1cHBvcnRlZCBvbiBMaW51eCAyLjAga2VybmVscyIpOwotICAgIH0KLSAgICBzdHJjcHkoc2Euc2FfZGF0YSwgY29ubi0+aWZOYW1lKTsKLSAgICBpZiAoc2VuZHRvKHNvY2ssIHBrdCwgc2l6ZSwgMCwgJnNhLCBzaXplb2Yoc2EpKSA8IDApIHsKLQlzeXNFcnIoInNlbmR0byAoc2VuZFBhY2tldCkiKTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotI2VuZGlmCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiVGVU5DVElPTjogcmVjZWl2ZVBhY2tldAotKiVBUkdVTUVOVFM6Ci0qIHNvY2sgLS0gc29ja2V0IHRvIHJlYWQgZnJvbQotKiBwa3QgLS0gcGxhY2UgdG8gc3RvcmUgdGhlIHJlY2VpdmVkIHBhY2tldAotKiBzaXplIC0tIHNldCB0byBzaXplIG9mIHBhY2tldCBpbiBieXRlcwotKiVSRVRVUk5TOgotKiA+PSAwIGlmIGFsbCBPSzsgPCAwIGlmIGVycm9yCi0qJURFU0NSSVBUSU9OOgotKiBSZWNlaXZlcyBhIHBhY2tldAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQKLXJlY2VpdmVQYWNrZXQoaW50IHNvY2ssIFBQUG9FUGFja2V0ICpwa3QsIGludCAqc2l6ZSkKLXsKLSAgICBpZiAoKCpzaXplID0gcmVjdihzb2NrLCBwa3QsIHNpemVvZihQUFBvRVBhY2tldCksIDApKSA8IDApIHsKLQlzeXNFcnIoInJlY3YgKHJlY2VpdmVQYWNrZXQpIik7Ci0JcmV0dXJuIC0xOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSolRlVOQ1RJT046IHBhcnNlUGFja2V0Ci0qJUFSR1VNRU5UUzoKLSogcGFja2V0IC0tIHRoZSBQUFBvRSBkaXNjb3ZlcnkgcGFja2V0IHRvIHBhcnNlCi0qIGZ1bmMgLS0gZnVuY3Rpb24gY2FsbGVkIGZvciBlYWNoIHRhZyBpbiB0aGUgcGFja2V0Ci0qIGV4dHJhIC0tIGFuIG9wYXF1ZSBkYXRhIHBvaW50ZXIgc3VwcGxpZWQgdG8gcGFyc2luZyBmdW5jdGlvbgotKiVSRVRVUk5TOgotKiAwIGlmIGV2ZXJ5dGhpbmcgd2VudCB3ZWxsOyAtMSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IKLSolREVTQ1JJUFRJT046Ci0qIFBhcnNlcyBhIFBQUG9FIGRpc2NvdmVyeSBwYWNrZXQsIGNhbGxpbmcgImZ1bmMiIGZvciBlYWNoIHRhZyBpbiB0aGUgcGFja2V0LgotKiAiZnVuYyIgaXMgcGFzc2VkIHRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50ICJleHRyYSIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludAotcGFyc2VQYWNrZXQoUFBQb0VQYWNrZXQgKnBhY2tldCwgUGFyc2VGdW5jICpmdW5jLCB2b2lkICpleHRyYSkKLXsKLSAgICBVSU5UMTZfdCBsZW4gPSBudG9ocyhwYWNrZXQtPmxlbmd0aCk7Ci0gICAgdW5zaWduZWQgY2hhciAqY3VyVGFnOwotICAgIFVJTlQxNl90IHRhZ1R5cGUsIHRhZ0xlbjsKLQotICAgIGlmIChQUFBPRV9WRVIocGFja2V0LT52ZXJ0eXBlKSAhPSAxKSB7Ci0JZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIFBQUG9FIHZlcnNpb24gKCVkKVxuIiwKLQkJUFBQT0VfVkVSKHBhY2tldC0+dmVydHlwZSkpOwotCXJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKFBQUE9FX1RZUEUocGFja2V0LT52ZXJ0eXBlKSAhPSAxKSB7Ci0JZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIFBQUG9FIHR5cGUgKCVkKVxuIiwKLQkJUFBQT0VfVFlQRShwYWNrZXQtPnZlcnR5cGUpKTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogRG8gc29tZSBzYW5pdHkgY2hlY2tzIG9uIHBhY2tldCAqLwotICAgIGlmIChsZW4gPiBFVEhfSlVNQk9fTEVOIC0gUFBQT0VfT1ZFUkhFQUQpIHsgLyogNi1ieXRlIG92ZXJoZWFkIGZvciBQUFBvRSBoZWFkZXIgKi8KLQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgUFBQb0UgcGFja2V0IGxlbmd0aCAoJXUpXG4iLCBsZW4pOwotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBTdGVwIHRocm91Z2ggdGhlIHRhZ3MgKi8KLSAgICBjdXJUYWcgPSBwYWNrZXQtPnBheWxvYWQ7Ci0gICAgd2hpbGUoY3VyVGFnIC0gcGFja2V0LT5wYXlsb2FkIDwgbGVuKSB7Ci0JLyogQWxpZ25tZW50IGlzIG5vdCBndWFyYW50ZWVkLCBzbyBkbyB0aGlzIGJ5IGhhbmQuLi4gKi8KLQl0YWdUeXBlID0gKGN1clRhZ1swXSA8PCA4KSArIGN1clRhZ1sxXTsKLQl0YWdMZW4gPSAoY3VyVGFnWzJdIDw8IDgpICsgY3VyVGFnWzNdOwotCWlmICh0YWdUeXBlID09IFRBR19FTkRfT0ZfTElTVCkgewotCSAgICByZXR1cm4gMDsKLQl9Ci0JaWYgKChjdXJUYWcgLSBwYWNrZXQtPnBheWxvYWQpICsgdGFnTGVuICsgVEFHX0hEUl9TSVpFID4gbGVuKSB7Ci0JICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBQUFBvRSB0YWcgbGVuZ3RoICgldSlcbiIsIHRhZ0xlbik7Ci0JICAgIHJldHVybiAtMTsKLQl9Ci0JZnVuYyh0YWdUeXBlLCB0YWdMZW4sIGN1clRhZytUQUdfSERSX1NJWkUsIGV4dHJhKTsKLQljdXJUYWcgPSBjdXJUYWcgKyBUQUdfSERSX1NJWkUgKyB0YWdMZW47Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiVGVU5DVElPTjogcGFyc2VGb3JIb3N0VW5pcQotKiVBUkdVTUVOVFM6Ci0qIHR5cGUgLS0gdGFnIHR5cGUKLSogbGVuIC0tIHRhZyBsZW5ndGgKLSogZGF0YSAtLSB0YWcgZGF0YS4KLSogZXh0cmEgLS0gdXNlci1zdXBwbGllZCBwb2ludGVyLiAgVGhpcyBpcyBhc3N1bWVkIHRvIGJlIGEgcG9pbnRlciB0byBpbnQuCi0qJVJFVFVSTlM6Ci0qIE5vdGhpbmcKLSolREVTQ1JJUFRJT046Ci0qIElmIGEgSG9zdFVuaXF1ZSB0YWcgaXMgZm91bmQgd2hpY2ggbWF0Y2hlcyBvdXIgUElELCBzZXRzICpleHRyYSB0byAxLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1wYXJzZUZvckhvc3RVbmlxKFVJTlQxNl90IHR5cGUsIFVJTlQxNl90IGxlbiwgdW5zaWduZWQgY2hhciAqZGF0YSwKLQkJIHZvaWQgKmV4dHJhKQotewotICAgIGludCAqdmFsID0gKGludCAqKSBleHRyYTsKLSAgICBpZiAodHlwZSA9PSBUQUdfSE9TVF9VTklRICYmIGxlbiA9PSBzaXplb2YocGlkX3QpKSB7Ci0JcGlkX3QgdG1wOwotCW1lbWNweSgmdG1wLCBkYXRhLCBsZW4pOwotCWlmICh0bXAgPT0gZ2V0cGlkKCkpIHsKLQkgICAgKnZhbCA9IDE7Ci0JfQotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSolRlVOQ1RJT046IHBhY2tldElzRm9yTWUKLSolQVJHVU1FTlRTOgotKiBjb25uIC0tIFBQUG9FIGNvbm5lY3Rpb24gaW5mbwotKiBwYWNrZXQgLS0gYSByZWNlaXZlZCBQUFBvRSBwYWNrZXQKLSolUkVUVVJOUzoKLSogMSBpZiBwYWNrZXQgaXMgZm9yIHRoaXMgUFBQb0UgZGFlbW9uOyAwIG90aGVyd2lzZS4KLSolREVTQ1JJUFRJT046Ci0qIElmIHdlIGFyZSB1c2luZyB0aGUgSG9zdC1VbmlxdWUgdGFnLCB2ZXJpZmllcyB0aGF0IHBhY2tldCBjb250YWlucwotKiBvdXIgdW5pcXVlIGlkZW50aWZpZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludAotcGFja2V0SXNGb3JNZShQUFBvRUNvbm5lY3Rpb24gKmNvbm4sIFBQUG9FUGFja2V0ICpwYWNrZXQpCi17Ci0gICAgaW50IGZvck1lID0gMDsKLQotICAgIC8qIElmIHBhY2tldCBpcyBub3QgZGlyZWN0ZWQgdG8gb3VyIE1BQyBhZGRyZXNzLCBmb3JnZXQgaXQgKi8KLSAgICBpZiAobWVtY21wKHBhY2tldC0+ZXRoSGRyLmhfZGVzdCwgY29ubi0+bXlFdGgsIEVUSF9BTEVOKSkgcmV0dXJuIDA7Ci0KLSAgICAvKiBJZiB3ZSdyZSBub3QgdXNpbmcgdGhlIEhvc3QtVW5pcXVlIHRhZywgdGhlbiBhY2NlcHQgdGhlIHBhY2tldCAqLwotICAgIGlmICghY29ubi0+dXNlSG9zdFVuaXEpIHJldHVybiAxOwotCi0gICAgcGFyc2VQYWNrZXQocGFja2V0LCBwYXJzZUZvckhvc3RVbmlxLCAmZm9yTWUpOwotICAgIHJldHVybiBmb3JNZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSolRlVOQ1RJT046IHBhcnNlUEFET1RhZ3MKLSolQVJHVU1FTlRTOgotKiB0eXBlIC0tIHRhZyB0eXBlCi0qIGxlbiAtLSB0YWcgbGVuZ3RoCi0qIGRhdGEgLS0gdGFnIGRhdGEKLSogZXh0cmEgLS0gZXh0cmEgdXNlciBkYXRhLiAgU2hvdWxkIHBvaW50IHRvIGEgUGFja2V0Q3JpdGVyaWEgc3RydWN0dXJlCi0qICAgICAgICAgIHdoaWNoIGdldHMgZmlsbGVkIGluIGFjY29yZGluZyB0byBzZWxlY3RlZCBBQyBuYW1lIGFuZCBzZXJ2aWNlCi0qICAgICAgICAgIG5hbWUuCi0qJVJFVFVSTlM6Ci0qIE5vdGhpbmcKLSolREVTQ1JJUFRJT046Ci0qIFBpY2tzIGludGVyZXN0aW5nIHRhZ3Mgb3V0IG9mIGEgUEFETyBwYWNrZXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotcGFyc2VQQURPVGFncyhVSU5UMTZfdCB0eXBlLCBVSU5UMTZfdCBsZW4sIHVuc2lnbmVkIGNoYXIgKmRhdGEsCi0JICAgICAgdm9pZCAqZXh0cmEpCi17Ci0gICAgc3RydWN0IFBhY2tldENyaXRlcmlhICpwYyA9IChzdHJ1Y3QgUGFja2V0Q3JpdGVyaWEgKikgZXh0cmE7Ci0gICAgUFBQb0VDb25uZWN0aW9uICpjb25uID0gcGMtPmNvbm47Ci0gICAgaW50IGk7Ci0KLSAgICBzd2l0Y2godHlwZSkgewotICAgIGNhc2UgVEFHX0FDX05BTUU6Ci0JcGMtPnNlZW5BQ05hbWUgPSAxOwotCXByaW50ZigiQWNjZXNzLUNvbmNlbnRyYXRvcjogJS4qc1xuIiwgKGludCkgbGVuLCBkYXRhKTsKLQlpZiAoY29ubi0+YWNOYW1lICYmIGxlbiA9PSBzdHJsZW4oY29ubi0+YWNOYW1lKSAmJgotCSAgICAhc3RybmNtcCgoY2hhciAqKSBkYXRhLCBjb25uLT5hY05hbWUsIGxlbikpIHsKLQkgICAgcGMtPmFjTmFtZU9LID0gMTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSBUQUdfU0VSVklDRV9OQU1FOgotCXBjLT5zZWVuU2VydmljZU5hbWUgPSAxOwotCWlmIChsZW4gPiAwKSB7Ci0JICAgIHByaW50ZigiICAgICAgIFNlcnZpY2UtTmFtZTogJS4qc1xuIiwgKGludCkgbGVuLCBkYXRhKTsKLQl9Ci0JaWYgKGNvbm4tPnNlcnZpY2VOYW1lICYmIGxlbiA9PSBzdHJsZW4oY29ubi0+c2VydmljZU5hbWUpICYmCi0JICAgICFzdHJuY21wKChjaGFyICopIGRhdGEsIGNvbm4tPnNlcnZpY2VOYW1lLCBsZW4pKSB7Ci0JICAgIHBjLT5zZXJ2aWNlTmFtZU9LID0gMTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSBUQUdfQUNfQ09PS0lFOgotCXByaW50ZigiR290IGEgY29va2llOiIpOwotCS8qIFByaW50IGZpcnN0IDIwIGJ5dGVzIG9mIGNvb2tpZSAqLwotCWZvciAoaT0wOyBpPGxlbiAmJiBpIDwgMjA7IGkrKykgewotCSAgICBwcmludGYoIiAlMDJ4IiwgKHVuc2lnbmVkKSBkYXRhW2ldKTsKLQl9Ci0JaWYgKGkgPCBsZW4pIHByaW50ZigiLi4uIik7Ci0JcHJpbnRmKCJcbiIpOwotCWNvbm4tPmNvb2tpZS50eXBlID0gaHRvbnModHlwZSk7Ci0JY29ubi0+Y29va2llLmxlbmd0aCA9IGh0b25zKGxlbik7Ci0JbWVtY3B5KGNvbm4tPmNvb2tpZS5wYXlsb2FkLCBkYXRhLCBsZW4pOwotCWJyZWFrOwotICAgIGNhc2UgVEFHX1JFTEFZX1NFU1NJT05fSUQ6Ci0JcHJpbnRmKCJHb3QgYSBSZWxheS1JRDoiKTsKLQkvKiBQcmludCBmaXJzdCAyMCBieXRlcyBvZiByZWxheSBJRCAqLwotCWZvciAoaT0wOyBpPGxlbiAmJiBpIDwgMjA7IGkrKykgewotCSAgICBwcmludGYoIiAlMDJ4IiwgKHVuc2lnbmVkKSBkYXRhW2ldKTsKLQl9Ci0JaWYgKGkgPCBsZW4pIHByaW50ZigiLi4uIik7Ci0JcHJpbnRmKCJcbiIpOwotCWNvbm4tPnJlbGF5SWQudHlwZSA9IGh0b25zKHR5cGUpOwotCWNvbm4tPnJlbGF5SWQubGVuZ3RoID0gaHRvbnMobGVuKTsKLQltZW1jcHkoY29ubi0+cmVsYXlJZC5wYXlsb2FkLCBkYXRhLCBsZW4pOwotCWJyZWFrOwotICAgIGNhc2UgVEFHX1NFUlZJQ0VfTkFNRV9FUlJPUjoKLQlwcmludGYoIkdvdCBhIFNlcnZpY2UtTmFtZS1FcnJvciB0YWc6ICUuKnNcbiIsIChpbnQpIGxlbiwgZGF0YSk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBUQUdfQUNfU1lTVEVNX0VSUk9SOgotCXByaW50ZigiR290IGEgU3lzdGVtLUVycm9yIHRhZzogJS4qc1xuIiwgKGludCkgbGVuLCBkYXRhKTsKLQlicmVhazsKLSAgICBjYXNlIFRBR19HRU5FUklDX0VSUk9SOgotCXByaW50ZigiR290IGEgR2VuZXJpYy1FcnJvciB0YWc6ICUuKnNcbiIsIChpbnQpIGxlbiwgZGF0YSk7Ci0JYnJlYWs7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSolRlVOQ1RJT046IHNlbmRQQURJCi0qJUFSR1VNRU5UUzoKLSogY29ubiAtLSBQUFBvRUNvbm5lY3Rpb24gc3RydWN0dXJlCi0qJVJFVFVSTlM6Ci0qIE5vdGhpbmcKLSolREVTQ1JJUFRJT046Ci0qIFNlbmRzIGEgUEFESSBwYWNrZXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotc2VuZFBBREkoUFBQb0VDb25uZWN0aW9uICpjb25uKQotewotICAgIFBQUG9FUGFja2V0IHBhY2tldDsKLSAgICB1bnNpZ25lZCBjaGFyICpjdXJzb3IgPSBwYWNrZXQucGF5bG9hZDsKLSAgICBQUFBvRVRhZyAqc3ZjID0gKFBQUG9FVGFnICopICgmcGFja2V0LnBheWxvYWQpOwotICAgIFVJTlQxNl90IG5hbWVsZW4gPSAwOwotICAgIFVJTlQxNl90IHBsZW47Ci0KLSAgICBpZiAoY29ubi0+c2VydmljZU5hbWUpIHsKLQluYW1lbGVuID0gKFVJTlQxNl90KSBzdHJsZW4oY29ubi0+c2VydmljZU5hbWUpOwotICAgIH0KLSAgICBwbGVuID0gVEFHX0hEUl9TSVpFICsgbmFtZWxlbjsKLSAgICBDSEVDS19ST09NKGN1cnNvciwgcGFja2V0LnBheWxvYWQsIHBsZW4pOwotCi0gICAgLyogU2V0IGRlc3RpbmF0aW9uIHRvIEV0aGVybmV0IGJyb2FkY2FzdCBhZGRyZXNzICovCi0gICAgbWVtc2V0KHBhY2tldC5ldGhIZHIuaF9kZXN0LCAweEZGLCBFVEhfQUxFTik7Ci0gICAgbWVtY3B5KHBhY2tldC5ldGhIZHIuaF9zb3VyY2UsIGNvbm4tPm15RXRoLCBFVEhfQUxFTik7Ci0KLSAgICBwYWNrZXQuZXRoSGRyLmhfcHJvdG8gPSBodG9ucyhFdGhfUFBQT0VfRGlzY292ZXJ5KTsKLSAgICBwYWNrZXQudmVydHlwZSA9IFBQUE9FX1ZFUl9UWVBFKDEsIDEpOwotICAgIHBhY2tldC5jb2RlID0gQ09ERV9QQURJOwotICAgIHBhY2tldC5zZXNzaW9uID0gMDsKLQotICAgIHN2Yy0+dHlwZSA9IFRBR19TRVJWSUNFX05BTUU7Ci0gICAgc3ZjLT5sZW5ndGggPSBodG9ucyhuYW1lbGVuKTsKLSAgICBDSEVDS19ST09NKGN1cnNvciwgcGFja2V0LnBheWxvYWQsIG5hbWVsZW4rVEFHX0hEUl9TSVpFKTsKLQotICAgIGlmIChjb25uLT5zZXJ2aWNlTmFtZSkgewotCW1lbWNweShzdmMtPnBheWxvYWQsIGNvbm4tPnNlcnZpY2VOYW1lLCBzdHJsZW4oY29ubi0+c2VydmljZU5hbWUpKTsKLSAgICB9Ci0gICAgY3Vyc29yICs9IG5hbWVsZW4gKyBUQUdfSERSX1NJWkU7Ci0KLSAgICAvKiBJZiB3ZSdyZSB1c2luZyBIb3N0LVVuaXEsIGNvcHkgaXQgb3ZlciAqLwotICAgIGlmIChjb25uLT51c2VIb3N0VW5pcSkgewotCVBQUG9FVGFnIGhvc3RVbmlxOwotCXBpZF90IHBpZCA9IGdldHBpZCgpOwotCWhvc3RVbmlxLnR5cGUgPSBodG9ucyhUQUdfSE9TVF9VTklRKTsKLQlob3N0VW5pcS5sZW5ndGggPSBodG9ucyhzaXplb2YocGlkKSk7Ci0JbWVtY3B5KGhvc3RVbmlxLnBheWxvYWQsICZwaWQsIHNpemVvZihwaWQpKTsKLQlDSEVDS19ST09NKGN1cnNvciwgcGFja2V0LnBheWxvYWQsIHNpemVvZihwaWQpICsgVEFHX0hEUl9TSVpFKTsKLQltZW1jcHkoY3Vyc29yLCAmaG9zdFVuaXEsIHNpemVvZihwaWQpICsgVEFHX0hEUl9TSVpFKTsKLQljdXJzb3IgKz0gc2l6ZW9mKHBpZCkgKyBUQUdfSERSX1NJWkU7Ci0JcGxlbiArPSBzaXplb2YocGlkKSArIFRBR19IRFJfU0laRTsKLSAgICB9Ci0KLSAgICBwYWNrZXQubGVuZ3RoID0gaHRvbnMocGxlbik7Ci0KLSAgICBzZW5kUGFja2V0KGNvbm4sIGNvbm4tPmRpc2NvdmVyeVNvY2tldCwgJnBhY2tldCwgKGludCkgKHBsZW4gKyBIRFJfU0laRSkpOwotICAgIGlmIChjb25uLT5kZWJ1Z0ZpbGUpIHsKLQlkdW1wUGFja2V0KGNvbm4tPmRlYnVnRmlsZSwgJnBhY2tldCwgIlNFTlQiKTsKLQlmcHJpbnRmKGNvbm4tPmRlYnVnRmlsZSwgIlxuIik7Ci0JZmZsdXNoKGNvbm4tPmRlYnVnRmlsZSk7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiVGVU5DVElPTjogd2FpdEZvclBBRE8KLSolQVJHVU1FTlRTOgotKiBjb25uIC0tIFBQUG9FQ29ubmVjdGlvbiBzdHJ1Y3R1cmUKLSogdGltZW91dCAtLSBob3cgbG9uZyB0byB3YWl0IChpbiBzZWNvbmRzKQotKiVSRVRVUk5TOgotKiBOb3RoaW5nCi0qJURFU0NSSVBUSU9OOgotKiBXYWl0cyBmb3IgYSBQQURPIHBhY2tldCBhbmQgY29waWVzIHVzZWZ1bCBpbmZvcm1hdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi13YWl0Rm9yUEFETyhQUFBvRUNvbm5lY3Rpb24gKmNvbm4sIGludCB0aW1lb3V0KQotewotICAgIGZkX3NldCByZWFkYWJsZTsKLSAgICBpbnQgcjsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICBQUFBvRVBhY2tldCBwYWNrZXQ7Ci0gICAgaW50IGxlbjsKLQotICAgIHN0cnVjdCBQYWNrZXRDcml0ZXJpYSBwYzsKLSAgICBwYy5jb25uICAgICAgICAgID0gY29ubjsKLSAgICBwYy5hY05hbWVPSyAgICAgID0gKGNvbm4tPmFjTmFtZSkgICAgICA/IDAgOiAxOwotICAgIHBjLnNlcnZpY2VOYW1lT0sgPSAoY29ubi0+c2VydmljZU5hbWUpID8gMCA6IDE7Ci0gICAgcGMuc2VlbkFDTmFtZSAgICA9IDA7Ci0gICAgcGMuc2VlblNlcnZpY2VOYW1lID0gMDsKLSAgICBjb25uLT5lcnJvciA9IDA7Ci0JCi0gICAgZG8gewotCWlmIChCUEZfQlVGRkVSX0lTX0VNUFRZKSB7Ci0JICAgIHR2LnR2X3NlYyA9IHRpbWVvdXQ7Ci0JICAgIHR2LnR2X3VzZWMgPSAwOwotCQotCSAgICBGRF9aRVJPKCZyZWFkYWJsZSk7Ci0JICAgIEZEX1NFVChjb25uLT5kaXNjb3ZlcnlTb2NrZXQsICZyZWFkYWJsZSk7Ci0KLQkgICAgd2hpbGUoMSkgewotCQlyID0gc2VsZWN0KGNvbm4tPmRpc2NvdmVyeVNvY2tldCsxLCAmcmVhZGFibGUsIE5VTEwsIE5VTEwsICZ0dik7Ci0JCWlmIChyID49IDAgfHwgZXJybm8gIT0gRUlOVFIpIGJyZWFrOwotCSAgICB9Ci0JICAgIGlmIChyIDwgMCkgewotCQlwZXJyb3IoInNlbGVjdCAod2FpdEZvclBBRE8pIik7Ci0JCXJldHVybjsKLQkgICAgfQotCSAgICBpZiAociA9PSAwKSByZXR1cm47ICAgICAgICAvKiBUaW1lZCBvdXQgKi8KLQl9Ci0JCi0JLyogR2V0IHRoZSBwYWNrZXQgKi8KLQlyZWNlaXZlUGFja2V0KGNvbm4tPmRpc2NvdmVyeVNvY2tldCwgJnBhY2tldCwgJmxlbik7Ci0KLQkvKiBDaGVjayBsZW5ndGggKi8KLQlpZiAobnRvaHMocGFja2V0Lmxlbmd0aCkgKyBIRFJfU0laRSA+IGxlbikgewotCSAgICBmcHJpbnRmKHN0ZGVyciwgIkJvZ3VzIFBQUG9FIGxlbmd0aCBmaWVsZCAoJXUpXG4iLAotCQkgICAodW5zaWduZWQgaW50KSBudG9ocyhwYWNrZXQubGVuZ3RoKSk7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotI2lmZGVmIFVTRV9CUEYKLQkvKiBJZiBpdCdzIG5vdCBhIERpc2NvdmVyeSBwYWNrZXQsIGxvb3AgYWdhaW4gKi8KLQlpZiAoZXRoZXJUeXBlKCZwYWNrZXQpICE9IEV0aF9QUFBPRV9EaXNjb3ZlcnkpIGNvbnRpbnVlOwotI2VuZGlmCi0KLQlpZiAoY29ubi0+ZGVidWdGaWxlKSB7Ci0JICAgIGR1bXBQYWNrZXQoY29ubi0+ZGVidWdGaWxlLCAmcGFja2V0LCAiUkNWRCIpOwotCSAgICBmcHJpbnRmKGNvbm4tPmRlYnVnRmlsZSwgIlxuIik7Ci0JICAgIGZmbHVzaChjb25uLT5kZWJ1Z0ZpbGUpOwotCX0KLQkvKiBJZiBpdCdzIG5vdCBmb3IgdXMsIGxvb3AgYWdhaW4gKi8KLQlpZiAoIXBhY2tldElzRm9yTWUoY29ubiwgJnBhY2tldCkpIGNvbnRpbnVlOwotCi0JaWYgKHBhY2tldC5jb2RlID09IENPREVfUEFETykgewotCSAgICBpZiAoQlJPQURDQVNUKHBhY2tldC5ldGhIZHIuaF9zb3VyY2UpKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiSWdub3JpbmcgUEFETyBwYWNrZXQgZnJvbSBicm9hZGNhc3QgTUFDIGFkZHJlc3NcbiIpOwotCQljb250aW51ZTsKLQkgICAgfQotCSAgICBwYXJzZVBhY2tldCgmcGFja2V0LCBwYXJzZVBBRE9UYWdzLCAmcGMpOwotCSAgICBpZiAoY29ubi0+ZXJyb3IpCi0JCXJldHVybjsKLQkgICAgaWYgKCFwYy5zZWVuQUNOYW1lKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiSWdub3JpbmcgUEFETyBwYWNrZXQgd2l0aCBubyBBQy1OYW1lIHRhZ1xuIik7Ci0JCWNvbnRpbnVlOwotCSAgICB9Ci0JICAgIGlmICghcGMuc2VlblNlcnZpY2VOYW1lKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiSWdub3JpbmcgUEFETyBwYWNrZXQgd2l0aCBubyBTZXJ2aWNlLU5hbWUgdGFnXG4iKTsKLQkJY29udGludWU7Ci0JICAgIH0KLQkgICAgY29ubi0+bnVtUEFET3MrKzsKLQkgICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0JICAgIGlmIChwYy5hY05hbWVPSyAmJiBwYy5zZXJ2aWNlTmFtZU9LKSB7Ci0JCW1lbWNweShjb25uLT5wZWVyRXRoLCBwYWNrZXQuZXRoSGRyLmhfc291cmNlLCBFVEhfQUxFTik7Ci0JCWlmIChjb25uLT5wcmludEFDTmFtZXMpIHsKLQkJICAgIHByaW50ZigiQUMtRXRoZXJuZXQtQWRkcmVzczogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQkgICAodW5zaWduZWQpIGNvbm4tPnBlZXJFdGhbMF0sIAotCQkJICAgKHVuc2lnbmVkKSBjb25uLT5wZWVyRXRoWzFdLAotCQkJICAgKHVuc2lnbmVkKSBjb25uLT5wZWVyRXRoWzJdLAotCQkJICAgKHVuc2lnbmVkKSBjb25uLT5wZWVyRXRoWzNdLAotCQkJICAgKHVuc2lnbmVkKSBjb25uLT5wZWVyRXRoWzRdLAotCQkJICAgKHVuc2lnbmVkKSBjb25uLT5wZWVyRXRoWzVdKTsKLQkJICAgIGNvbnRpbnVlOwotCQl9Ci0JCWNvbm4tPmRpc2NvdmVyeVN0YXRlID0gU1RBVEVfUkVDRUlWRURfUEFETzsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfSB3aGlsZSAoY29ubi0+ZGlzY292ZXJ5U3RhdGUgIT0gU1RBVEVfUkVDRUlWRURfUEFETyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qJUZVTkNUSU9OOiBkaXNjb3ZlcnkKLSolQVJHVU1FTlRTOgotKiBjb25uIC0tIFBQUG9FIGNvbm5lY3Rpb24gaW5mbyBzdHJ1Y3R1cmUKLSolUkVUVVJOUzoKLSogTm90aGluZwotKiVERVNDUklQVElPTjoKLSogUGVyZm9ybXMgdGhlIFBQUG9FIGRpc2NvdmVyeSBwaGFzZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1kaXNjb3ZlcnkoUFBQb0VDb25uZWN0aW9uICpjb25uKQotewotICAgIGludCBwYWRpQXR0ZW1wdHMgPSAwOwotICAgIGludCB0aW1lb3V0ID0gUEFESV9USU1FT1VUOwotCi0gICAgY29ubi0+ZGlzY292ZXJ5U29ja2V0ID0KLQlvcGVuSW50ZXJmYWNlKGNvbm4tPmlmTmFtZSwgRXRoX1BQUE9FX0Rpc2NvdmVyeSwgY29ubi0+bXlFdGgpOwotCi0gICAgZG8gewotCXBhZGlBdHRlbXB0cysrOwotCWlmIChwYWRpQXR0ZW1wdHMgPiBNQVhfUEFESV9BVFRFTVBUUykgewotCSAgICBmcHJpbnRmKHN0ZGVyciwgIlRpbWVvdXQgd2FpdGluZyBmb3IgUEFETyBwYWNrZXRzXG4iKTsKLQkgICAgY2xvc2UoY29ubi0+ZGlzY292ZXJ5U29ja2V0KTsKLQkgICAgY29ubi0+ZGlzY292ZXJ5U29ja2V0ID0gLTE7Ci0JICAgIHJldHVybjsKLQl9Ci0Jc2VuZFBBREkoY29ubik7Ci0JY29ubi0+ZGlzY292ZXJ5U3RhdGUgPSBTVEFURV9TRU5UX1BBREk7Ci0Jd2FpdEZvclBBRE8oY29ubiwgdGltZW91dCk7Ci0gICAgfSB3aGlsZSAoIWNvbm4tPm51bVBBRE9zKTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgICBpbnQgb3B0OwotICAgIFBQUG9FQ29ubmVjdGlvbiAqY29ubjsKLQotICAgIGNvbm4gPSBtYWxsb2Moc2l6ZW9mKFBQUG9FQ29ubmVjdGlvbikpOwotICAgIGlmICghY29ubikKLQlmYXRhbFN5cygibWFsbG9jIik7Ci0KLSAgICBtZW1zZXQoY29ubiwgMCwgc2l6ZW9mKFBQUG9FQ29ubmVjdGlvbikpOwotCi0gICAgd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgIkk6RDpWVUFTOkM6aCIpKSA+IDApIHsKLQlzd2l0Y2gob3B0KSB7Ci0JY2FzZSAnUyc6Ci0JICAgIGNvbm4tPnNlcnZpY2VOYW1lID0geHN0cmR1cChvcHRhcmcpOwotCSAgICBicmVhazsKLQljYXNlICdDJzoKLQkgICAgY29ubi0+YWNOYW1lID0geHN0cmR1cChvcHRhcmcpOwotCSAgICBicmVhazsKLQljYXNlICdVJzoKLQkgICAgY29ubi0+dXNlSG9zdFVuaXEgPSAxOwotCSAgICBicmVhazsKLQljYXNlICdEJzoKLQkgICAgY29ubi0+ZGVidWdGaWxlID0gZm9wZW4ob3B0YXJnLCAidyIpOwotCSAgICBpZiAoIWNvbm4tPmRlYnVnRmlsZSkgewotCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuICVzOiAlc1xuIiwKLQkJCW9wdGFyZywgc3RyZXJyb3IoZXJybm8pKTsKLQkJZXhpdCgxKTsKLQkgICAgfQotCSAgICBmcHJpbnRmKGNvbm4tPmRlYnVnRmlsZSwgInBwcG9lLWRpc2NvdmVyeSAlc1xuIiwgUlBfVkVSU0lPTik7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ0knOgotCSAgICBjb25uLT5pZk5hbWUgPSB4c3RyZHVwKG9wdGFyZyk7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ0EnOgotCSAgICAvKiB0aGlzIGlzIHRoZSBkZWZhdWx0ICovCi0JICAgIGJyZWFrOwotCWNhc2UgJ1YnOgotCWNhc2UgJ2gnOgotCSAgICB1c2FnZSgpOwotCSAgICBleGl0KDApOwotCWRlZmF1bHQ6Ci0JICAgIHVzYWdlKCk7Ci0JICAgIGV4aXQoMSk7Ci0JfQotICAgIH0KLQotICAgIC8qIGRlZmF1bHQgaW50ZXJmYWNlIG5hbWUgKi8KLSAgICBpZiAoIWNvbm4tPmlmTmFtZSkKLQljb25uLT5pZk5hbWUgPSBzdHJkdXAoImV0aDAiKTsKLQotICAgIGNvbm4tPmRpc2NvdmVyeVNvY2tldCA9IC0xOwotICAgIGNvbm4tPnNlc3Npb25Tb2NrZXQgPSAtMTsKLSAgICBjb25uLT5wcmludEFDTmFtZXMgPSAxOwotCi0gICAgZGlzY292ZXJ5KGNvbm4pOwotICAgIGV4aXQoMCk7Ci19Ci0KLXZvaWQgcnBfZmF0YWwoY2hhciBjb25zdCAqc3RyKQotewotICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIHN0cik7Ci0gICAgZXhpdCgxKTsKLX0KLQotdm9pZCBmYXRhbFN5cyhjaGFyIGNvbnN0ICpzdHIpCi17Ci0gICAgcGVycm9yKHN0cik7Ci0gICAgZXhpdCgxKTsKLX0KLQotdm9pZCBzeXNFcnIoY2hhciBjb25zdCAqc3RyKQotewotICAgIHJwX2ZhdGFsKHN0cik7Ci19Ci0KLWNoYXIgKnhzdHJkdXAoY29uc3QgY2hhciAqcykKLXsKLSAgICByZWdpc3RlciBjaGFyICpyZXQgPSBzdHJkdXAocyk7Ci0gICAgaWYgKCFyZXQpCi0Jc3lzRXJyKCJzdHJkdXAiKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi12b2lkIHVzYWdlKHZvaWQpCi17Ci0gICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogcHBwb2UtZGlzY292ZXJ5IFtvcHRpb25zXVxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICJcblZlcnNpb24gIiBSUF9WRVJTSU9OICJcbiIpOwotfQpkaWZmIC0tZ2l0IGEvcHBwZC9wbHVnaW5zL3JwLXBwcG9lL3BwcG9lLmggYi9wcHBkL3BsdWdpbnMvcnAtcHBwb2UvcHBwb2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFiMmVlZS4uMDAwMDAwMAotLS0gYS9wcHBkL3BsdWdpbnMvcnAtcHBwb2UvcHBwb2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogcHBwb2UuaAotKgotKiBEZWNsYXJhdGlvbiBvZiB2YXJpb3VzIFBQUG9FIGNvbnN0YW50cwotKgotKiBDb3B5cmlnaHQgKEMpIDIwMDAgUm9hcmluZyBQZW5ndWluIFNvZnR3YXJlIEluYy4KLSoKLSogVGhpcyBwcm9ncmFtIG1heSBiZSBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUKLSogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0qCi0qICRJZDogcHBwb2UuaCx2IDEuNCAyMDA4LzA2LzE1IDA0OjM1OjUwIHBhdWx1cyBFeHAgJAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2lmIGRlZmluZWQoSEFWRV9ORVRQQUNLRVRfUEFDS0VUX0gpIHx8IGRlZmluZWQoSEFWRV9MSU5VWF9JRl9QQUNLRVRfSCkKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxIC8qIEZvciBzaWdhY3Rpb24gZGVmaW5lcyAqLwotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgkJLyogRm9yIEZJTEUgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4JCS8qIEZvciBwaWRfdCAqLwotCi0vKiBIb3cgZG8gd2UgYWNjZXNzIHJhdyBFdGhlcm5ldCBkZXZpY2VzPyAqLwotI3VuZGVmIFVTRV9MSU5VWF9QQUNLRVQKLSN1bmRlZiBVU0VfQlBGCi0KLSNpZiBkZWZpbmVkKEhBVkVfTkVUUEFDS0VUX1BBQ0tFVF9IKSB8fCBkZWZpbmVkKEhBVkVfTElOVVhfSUZfUEFDS0VUX0gpCi0jZGVmaW5lIFVTRV9MSU5VWF9QQUNLRVQgMQotI2VsaWYgZGVmaW5lZChIQVZFX1NZU19ETFBJX0gpCi0jZGVmaW5lIFVTRV9ETFBJCi0jZWxpZiBkZWZpbmVkKEhBVkVfTkVUX0JQRl9IKQotI2RlZmluZSBVU0VfQlBGIDEKLSNlbmRpZgotCi0vKiBTYW5pdHkgY2hlY2sgKi8KLSNpZiAhZGVmaW5lZChVU0VfQlBGKSAmJiAhZGVmaW5lZChVU0VfTElOVVhfUEFDS0VUKSAmJiAhZGVmaW5lZChVU0VfRExQSSkKLSNlcnJvciBVbmtub3duIG1ldGhvZCBmb3IgYWNjZXNzaW5nIHJhdyBFdGhlcm5ldCBmcmFtZXMKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TWVNfQ0RFRlNfSAotI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNlbmRpZgotCi0vKiBVZ2x5IGhlYWRlciBmaWxlcyBvbiBzb21lIExpbnV4IGJveGVzLi4uICovCi0jaWYgZGVmaW5lZChIQVZFX0xJTlVYX0lGX0gpCi0jaW5jbHVkZSA8bGludXgvaWYuaD4KLSNlbGlmIGRlZmluZWQoSEFWRV9ORVRfSUZfSCkKLSNpbmNsdWRlIDxuZXQvaWYuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9ORVRfSUZfVFlQRVNfSAotI2luY2x1ZGUgPG5ldC9pZl90eXBlcy5oPgotI2VuZGlmCi0KLSNkZWZpbmUgQlBGX0JVRkZFUl9JU19FTVBUWSAxCi0jZGVmaW5lIEJQRl9CVUZGRVJfSEFTX0RBVEEgMAotCi0vKiBEZWZpbmUgdmFyaW91cyBpbnRlZ2VyIHR5cGVzIC0tIGFzc3VtZXMgYSBjaGFyIGlzIDggYml0cyAqLwotI2lmIFNJWkVPRl9VTlNJR05FRF9TSE9SVCA9PSAyCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVJTlQxNl90OwotI2VsaWYgU0laRU9GX1VOU0lHTkVEX0lOVCA9PSAyCi10eXBlZGVmIHVuc2lnbmVkIGludCBVSU5UMTZfdDsKLSNlbHNlCi0jZXJyb3IgQ291bGQgbm90IGZpbmQgYSAxNi1iaXQgaW50ZWdlciB0eXBlCi0jZW5kaWYKLQotI2lmIFNJWkVPRl9VTlNJR05FRF9TSE9SVCA9PSA0Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVJTlQzMl90OwotI2VsaWYgU0laRU9GX1VOU0lHTkVEX0lOVCA9PSA0Ci10eXBlZGVmIHVuc2lnbmVkIGludCBVSU5UMzJfdDsKLSNlbGlmIFNJWkVPRl9VTlNJR05FRF9MT05HID09IDQKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBVSU5UMzJfdDsKLSNlbHNlCi0jZXJyb3IgQ291bGQgbm90IGZpbmQgYSAzMi1iaXQgaW50ZWdlciB0eXBlCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfTElOVVhfSUZfRVRIRVJfSAotI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLQotI2lmZGVmIEhBVkVfTkVUSU5FVF9JRl9FVEhFUl9ICi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNlbmRpZgotI2lmbmRlZiBIQVZFX1NZU19ETFBJX0gKLSNpbmNsdWRlIDxuZXRpbmV0L2lmX2V0aGVyLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0KLQotLyogRXRoZXJuZXQgZnJhbWUgdHlwZXMgYWNjb3JkaW5nIHRvIFJGQyAyNTE2ICovCi0jZGVmaW5lIEVUSF9QUFBPRV9ESVNDT1ZFUlkgMHg4ODYzCi0jZGVmaW5lIEVUSF9QUFBPRV9TRVNTSU9OICAgMHg4ODY0Ci0KLS8qIEJ1dCBzb21lIGJyYWluLWRlYWQgcGVlcnMgZGlzb2JleSB0aGUgUkZDLCBzbyBmcmFtZSB0eXBlcyBhcmUgdmFyaWFibGVzICovCi1leHRlcm4gVUlOVDE2X3QgRXRoX1BQUE9FX0Rpc2NvdmVyeTsKLWV4dGVybiBVSU5UMTZfdCBFdGhfUFBQT0VfU2Vzc2lvbjsKLQotLyogUFBQb0UgY29kZXMgKi8KLSNkZWZpbmUgQ09ERV9QQURJICAgICAgICAgICAweDA5Ci0jZGVmaW5lIENPREVfUEFETyAgICAgICAgICAgMHgwNwotI2RlZmluZSBDT0RFX1BBRFIgICAgICAgICAgIDB4MTkKLSNkZWZpbmUgQ09ERV9QQURTICAgICAgICAgICAweDY1Ci0jZGVmaW5lIENPREVfUEFEVCAgICAgICAgICAgMHhBNwotCi0vKiBFeHRlbnNpb25zIGZyb20gZHJhZnQtY2FycmVsLWluZm8tcHBwb2UtZXh0LTAwICovCi0vKiBJIGRvIE5PVCBsaWtlIFBBRE0gb3IgUEFETiwgYnV0IHRoZXkgYXJlIGhlcmUgZm9yIGNvbXBsZXRlbmVzcyAqLwotI2RlZmluZSBDT0RFX1BBRE0gICAgICAgICAgIDB4RDMKLSNkZWZpbmUgQ09ERV9QQUROICAgICAgICAgICAweEQ0Ci0KLSNkZWZpbmUgQ09ERV9TRVNTICAgICAgICAgICAweDAwCi0KLS8qIFBQUG9FIFRhZ3MgKi8KLSNkZWZpbmUgVEFHX0VORF9PRl9MSVNUICAgICAgICAweDAwMDAKLSNkZWZpbmUgVEFHX1NFUlZJQ0VfTkFNRSAgICAgICAweDAxMDEKLSNkZWZpbmUgVEFHX0FDX05BTUUgICAgICAgICAgICAweDAxMDIKLSNkZWZpbmUgVEFHX0hPU1RfVU5JUSAgICAgICAgICAweDAxMDMKLSNkZWZpbmUgVEFHX0FDX0NPT0tJRSAgICAgICAgICAweDAxMDQKLSNkZWZpbmUgVEFHX1ZFTkRPUl9TUEVDSUZJQyAgICAweDAxMDUKLSNkZWZpbmUgVEFHX1JFTEFZX1NFU1NJT05fSUQgICAweDAxMTAKLSNkZWZpbmUgVEFHX1BQUF9NQVhfUEFZTE9BRCAgICAweDAxMjAKLSNkZWZpbmUgVEFHX1NFUlZJQ0VfTkFNRV9FUlJPUiAweDAyMDEKLSNkZWZpbmUgVEFHX0FDX1NZU1RFTV9FUlJPUiAgICAweDAyMDIKLSNkZWZpbmUgVEFHX0dFTkVSSUNfRVJST1IgICAgICAweDAyMDMKLQotLyogRXh0ZW5zaW9ucyBmcm9tIGRyYWZ0LWNhcnJlbC1pbmZvLXBwcG9lLWV4dC0wMCAqLwotLyogSSBkbyBOT1QgbGlrZSB0aGVzZSB0YWdzIG9uZSBsaXR0bGUgYml0ICovCi0jZGVmaW5lIFRBR19IVVJMICAgICAgICAgICAgICAgMHgxMTEKLSNkZWZpbmUgVEFHX01PVE0gICAgICAgICAgICAgICAweDExMgotI2RlZmluZSBUQUdfSVBfUk9VVEVfQUREICAgICAgIDB4MTIxCi0KLS8qIERpc2NvdmVyeSBwaGFzZSBzdGF0ZXMgKi8KLSNkZWZpbmUgU1RBVEVfU0VOVF9QQURJICAgICAwCi0jZGVmaW5lIFNUQVRFX1JFQ0VJVkVEX1BBRE8gMQotI2RlZmluZSBTVEFURV9TRU5UX1BBRFIgICAgIDIKLSNkZWZpbmUgU1RBVEVfU0VTU0lPTiAgICAgICAzCi0jZGVmaW5lIFNUQVRFX1RFUk1JTkFURUQgICAgNAotCi0vKiBIb3cgbWFueSBQQURJL1BBRFMgYXR0ZW1wdHM/ICovCi0jZGVmaW5lIE1BWF9QQURJX0FUVEVNUFRTIDMKLQotLyogSW5pdGlhbCB0aW1lb3V0IGZvciBQQURPL1BBRFMgKi8KLSNkZWZpbmUgUEFESV9USU1FT1VUIDUKLQotLyogU3RhdGVzIGZvciBzY2FubmluZyBQUFAgZnJhbWVzICovCi0jZGVmaW5lIFNUQVRFX1dBSVRGT1JfRlJBTUVfQUREUiAwCi0jZGVmaW5lIFNUQVRFX0RST1BfUFJPVE8gICAgICAgICAxCi0jZGVmaW5lIFNUQVRFX0JVSUxESU5HX1BBQ0tFVCAgICAyCi0KLS8qIFNwZWNpYWwgUFBQIGZyYW1lIGNoYXJhY3RlcnMgKi8KLSNkZWZpbmUgRlJBTUVfRVNDICAgIDB4N0QKLSNkZWZpbmUgRlJBTUVfRkxBRyAgIDB4N0UKLSNkZWZpbmUgRlJBTUVfQUREUiAgIDB4RkYKLSNkZWZpbmUgRlJBTUVfQ1RSTCAgIDB4MDMKLSNkZWZpbmUgRlJBTUVfRU5DICAgIDB4MjAKLQotI2RlZmluZSBJUFY0QUxFTiAgICAgNAotI2RlZmluZSBTTUFMTEJVRiAgIDI1NgotCi0vKiBUaGVyZSBhcmUgb3RoZXIgZml4ZWQtc2l6ZSBidWZmZXJzIHByZXZlbnRpbmcKLSAgIHRoaXMgZnJvbSBiZWluZyBpbmNyZWFzZWQgdG8gMTYxMTAuIFRoZSBidWZmZXIKLSAgIHNpemVzIHdvdWxkIG5lZWQgdG8gYmUgcHJvcGVybHkgZGUtY291cGxlZCBmcm9tCi0gICB0aGUgZGVmYXVsdCBNUlUuIEZvciBub3csIGdldHRpbmcgdXAgdG8gMTUwMCBpcwotICAgZW5vdWdoLiAqLwotI2RlZmluZSBFVEhfSlVNQk9fTEVOIDE1MDgKLQotLyogQSBQUFBvRSBQYWNrZXQsIGluY2x1ZGluZyBFdGhlcm5ldCBoZWFkZXJzICovCi10eXBlZGVmIHN0cnVjdCBQUFBvRVBhY2tldFN0cnVjdCB7Ci0gICAgc3RydWN0IGV0aGhkciBldGhIZHI7CS8qIEV0aGVybmV0IGhlYWRlciAqLwotICAgIHVuc2lnbmVkIGludCB2ZXJ0eXBlOjg7CS8qIFBQUG9FIFZlcnNpb24gYW5kIFR5cGUgKG11c3QgYm90aCBiZSAxKSAqLwotICAgIHVuc2lnbmVkIGludCBjb2RlOjg7CS8qIFBQUG9FIGNvZGUgKi8KLSAgICB1bnNpZ25lZCBpbnQgc2Vzc2lvbjoxNjsJLyogUFBQb0Ugc2Vzc2lvbiAqLwotICAgIHVuc2lnbmVkIGludCBsZW5ndGg6MTY7CS8qIFBheWxvYWQgbGVuZ3RoICovCi0gICAgdW5zaWduZWQgY2hhciBwYXlsb2FkW0VUSF9KVU1CT19MRU5dOyAvKiBBIGJpdCBvZiByb29tIHRvIHNwYXJlICovCi19IFBQUG9FUGFja2V0OwotCi0jZGVmaW5lIFBQUE9FX1ZFUih2dCkJCSgodnQpID4+IDQpCi0jZGVmaW5lIFBQUE9FX1RZUEUodnQpCQkoKHZ0KSAmIDB4ZikKLSNkZWZpbmUgUFBQT0VfVkVSX1RZUEUodiwgdCkJKCgodikgPDwgNCkgfCAodCkpCi0KLS8qIEhlYWRlciBzaXplIG9mIGEgUFBQb0UgcGFja2V0ICovCi0jZGVmaW5lIFBQUE9FX09WRVJIRUFEIDYgIC8qIHR5cGUsIGNvZGUsIHNlc3Npb24sIGxlbmd0aCAqLwotI2RlZmluZSBIRFJfU0laRSAoc2l6ZW9mKHN0cnVjdCBldGhoZHIpICsgUFBQT0VfT1ZFUkhFQUQpCi0jZGVmaW5lIE1BWF9QUFBPRV9QQVlMT0FEIChFVEhfSlVNQk9fTEVOIC0gUFBQT0VfT1ZFUkhFQUQpCi0jZGVmaW5lIFBQUF9PVkVSSEVBRCAyICAvKiBwcm90b2NvbCAqLwotI2RlZmluZSBNQVhfUFBQT0VfTVRVIChNQVhfUFBQT0VfUEFZTE9BRCAtIFBQUF9PVkVSSEVBRCkKLSNkZWZpbmUgVE9UQUxfT1ZFUkhFQUQgKFBQUE9FX09WRVJIRUFEICsgUFBQX09WRVJIRUFEKQotI2RlZmluZSBFVEhfUFBQT0VfTVRVIChFVEhfREFUQV9MRU4gLSBUT1RBTF9PVkVSSEVBRCkKLQotLyogUFBQb0UgVGFnICovCi0KLXR5cGVkZWYgc3RydWN0IFBQUG9FVGFnU3RydWN0IHsKLSAgICB1bnNpZ25lZCBpbnQgdHlwZToxNjsJLyogdGFnIHR5cGUgKi8KLSAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoOjE2OwkvKiBMZW5ndGggb2YgcGF5bG9hZCAqLwotICAgIHVuc2lnbmVkIGNoYXIgcGF5bG9hZFtFVEhfSlVNQk9fTEVOXTsgLyogQSBMT1Qgb2Ygcm9vbSB0byBzcGFyZSAqLwotfSBQUFBvRVRhZzsKLS8qIEhlYWRlciBzaXplIG9mIGEgUFBQb0UgdGFnICovCi0jZGVmaW5lIFRBR19IRFJfU0laRSA0Ci0KLS8qIENodW5rIHRvIHJlYWQgZnJvbSBzdGRpbiAqLwotI2RlZmluZSBSRUFEX0NIVU5LIDQwOTYKLQotLyogRnVuY3Rpb24gcGFzc2VkIHRvIHBhcnNlUGFja2V0ICovCi10eXBlZGVmIHZvaWQgUGFyc2VGdW5jKFVJTlQxNl90IHR5cGUsCi0JCSAgICAgICBVSU5UMTZfdCBsZW4sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICpkYXRhLAotCQkgICAgICAgdm9pZCAqZXh0cmEpOwotCi0jZGVmaW5lIFBQUElOSVRGQ1MxNiAgICAweGZmZmYgIC8qIEluaXRpYWwgRkNTIHZhbHVlICovCi0KLS8qIEtlZXAgdHJhY2sgb2YgdGhlIHN0YXRlIG9mIGEgY29ubmVjdGlvbiAtLSBjb2xsZWN0IGV2ZXJ5dGhpbmcgaW4KLSAgIG9uZSBzcG90ICovCi0KLXR5cGVkZWYgc3RydWN0IFBQUG9FQ29ubmVjdGlvblN0cnVjdCB7Ci0gICAgaW50IGRpc2NvdmVyeVN0YXRlOwkJLyogV2hlcmUgd2UgYXJlIGluIGRpc2NvdmVyeSAqLwotICAgIGludCBkaXNjb3ZlcnlTb2NrZXQ7CS8qIFJhdyBzb2NrZXQgZm9yIGRpc2NvdmVyeSBmcmFtZXMgKi8KLSAgICBpbnQgc2Vzc2lvblNvY2tldDsJCS8qIFJhdyBzb2NrZXQgZm9yIHNlc3Npb24gZnJhbWVzICovCi0gICAgdW5zaWduZWQgY2hhciBteUV0aFtFVEhfQUxFTl07IC8qIE15IE1BQyBhZGRyZXNzICovCi0gICAgdW5zaWduZWQgY2hhciBwZWVyRXRoW0VUSF9BTEVOXTsgLyogUGVlcidzIE1BQyBhZGRyZXNzICovCi0gICAgdW5zaWduZWQgY2hhciByZXFfcGVlcl9tYWNbRVRIX0FMRU5dOyAvKiByZXF1aXJlZCBwZWVyIE1BQyBhZGRyZXNzICovCi0gICAgdW5zaWduZWQgY2hhciByZXFfcGVlcjsJLyogcmVxdWlyZSBtYWMgYWRkciB0byBtYXRjaCByZXFfcGVlcl9tYWMgKi8KLSAgICBVSU5UMTZfdCBzZXNzaW9uOwkJLyogU2Vzc2lvbiBJRCAqLwotICAgIGNoYXIgKmlmTmFtZTsJCS8qIEludGVyZmFjZSBuYW1lICovCi0gICAgY2hhciAqc2VydmljZU5hbWU7CQkvKiBEZXNpcmVkIHNlcnZpY2UgbmFtZSwgaWYgYW55ICovCi0gICAgY2hhciAqYWNOYW1lOwkJLyogRGVzaXJlZCBBQyBuYW1lLCBpZiBhbnkgKi8KLSAgICBpbnQgc3luY2hyb25vdXM7CQkvKiBVc2Ugc3luY2hyb25vdXMgUFBQICovCi0gICAgaW50IHVzZUhvc3RVbmlxOwkJLyogVXNlIEhvc3QtVW5pcSB0YWcgKi8KLSAgICBpbnQgcHJpbnRBQ05hbWVzOwkJLyogSnVzdCBwcmludCBBQyBuYW1lcyAqLwotICAgIEZJTEUgKmRlYnVnRmlsZTsJCS8qIERlYnVnIGZpbGUgZm9yIGR1bXBpbmcgcGFja2V0cyAqLwotICAgIGludCBudW1QQURPczsJCS8qIE51bWJlciBvZiBQQURPIHBhY2tldHMgcmVjZWl2ZWQgKi8KLSAgICBQUFBvRVRhZyBjb29raWU7CQkvKiBXZSBoYXZlIHRvIHNlbmQgdGhpcyBpZiB3ZSBnZXQgaXQgKi8KLSAgICBQUFBvRVRhZyByZWxheUlkOwkJLyogRGl0dG8gKi8KLSAgICBpbnQgZXJyb3I7CQkJLyogRXJyb3IgcGFja2V0IHJlY2VpdmVkICovCi0gICAgaW50IGRlYnVnOwkJCS8qIFNldCB0byBsb2cgcGFja2V0cyBzZW50IGFuZCByZWNlaXZlZCAqLwotICAgIGludCBkaXNjb3ZlcnlUaW1lb3V0OyAgICAgICAvKiBUaW1lb3V0IGZvciBkaXNjb3ZlcnkgcGFja2V0cyAqLwotICAgIGludCBzZWVuTWF4UGF5bG9hZDsKLSAgICBpbnQgbXR1OwkJCS8qIFN0b3JlZCBNVFUgKi8KLSAgICBpbnQgbXJ1OwkJCS8qIFN0b3JlZCBNUlUgKi8KLX0gUFBQb0VDb25uZWN0aW9uOwotCi0vKiBTdHJ1Y3R1cmUgdXNlZCB0byBkZXRlcm1pbmUgYWNjZXB0YWJsZSBQQURPIG9yIFBBRFMgcGFja2V0ICovCi1zdHJ1Y3QgUGFja2V0Q3JpdGVyaWEgewotICAgIFBQUG9FQ29ubmVjdGlvbiAqY29ubjsKLSAgICBpbnQgYWNOYW1lT0s7Ci0gICAgaW50IHNlcnZpY2VOYW1lT0s7Ci0gICAgaW50IHNlZW5BQ05hbWU7Ci0gICAgaW50IHNlZW5TZXJ2aWNlTmFtZTsKLX07Ci0KLS8qIEZ1bmN0aW9uIFByb3RvdHlwZXMgKi8KLVVJTlQxNl90IGV0aGVyVHlwZShQUFBvRVBhY2tldCAqcGFja2V0KTsKLWludCBvcGVuSW50ZXJmYWNlKGNoYXIgY29uc3QgKmlmbmFtZSwgVUlOVDE2X3QgdHlwZSwgdW5zaWduZWQgY2hhciAqaHdhZGRyKTsKLWludCBzZW5kUGFja2V0KFBQUG9FQ29ubmVjdGlvbiAqY29ubiwgaW50IHNvY2ssIFBQUG9FUGFja2V0ICpwa3QsIGludCBzaXplKTsKLWludCByZWNlaXZlUGFja2V0KGludCBzb2NrLCBQUFBvRVBhY2tldCAqcGt0LCBpbnQgKnNpemUpOwotdm9pZCBmYXRhbFN5cyhjaGFyIGNvbnN0ICpzdHIpOwotdm9pZCBycF9mYXRhbChjaGFyIGNvbnN0ICpzdHIpOwotdm9pZCBwcmludEVycihjaGFyIGNvbnN0ICpzdHIpOwotdm9pZCBzeXNFcnIoY2hhciBjb25zdCAqc3RyKTsKLXZvaWQgZHVtcFBhY2tldChGSUxFICpmcCwgUFBQb0VQYWNrZXQgKnBhY2tldCwgY2hhciBjb25zdCAqZGlyKTsKLXZvaWQgZHVtcEhleChGSUxFICpmcCwgdW5zaWduZWQgY2hhciBjb25zdCAqYnVmLCBpbnQgbGVuKTsKLWludCBwYXJzZVBhY2tldChQUFBvRVBhY2tldCAqcGFja2V0LCBQYXJzZUZ1bmMgKmZ1bmMsIHZvaWQgKmV4dHJhKTsKLXZvaWQgcGFyc2VMb2dFcnJzKFVJTlQxNl90IHR5cCwgVUlOVDE2X3QgbGVuLCB1bnNpZ25lZCBjaGFyICpkYXRhLCB2b2lkICp4dHJhKTsKLXZvaWQgc3luY1JlYWRGcm9tUFBQKFBQUG9FQ29ubmVjdGlvbiAqY29ubiwgUFBQb0VQYWNrZXQgKnBhY2tldCk7Ci12b2lkIGFzeW5jUmVhZEZyb21QUFAoUFBQb0VDb25uZWN0aW9uICpjb25uLCBQUFBvRVBhY2tldCAqcGFja2V0KTsKLXZvaWQgYXN5bmNSZWFkRnJvbUV0aChQUFBvRUNvbm5lY3Rpb24gKmNvbm4sIGludCBzb2NrLCBpbnQgY2xhbXBNc3MpOwotdm9pZCBzeW5jUmVhZEZyb21FdGgoUFBQb0VDb25uZWN0aW9uICpjb25uLCBpbnQgc29jaywgaW50IGNsYW1wTXNzKTsKLWNoYXIgKnN0ckR1cChjaGFyIGNvbnN0ICpzdHIpOwotdm9pZCBzZW5kUEFEVChQUFBvRUNvbm5lY3Rpb24gKmNvbm4sIGNoYXIgY29uc3QgKm1zZyk7Ci12b2lkIHNlbmRTZXNzaW9uUGFja2V0KFBQUG9FQ29ubmVjdGlvbiAqY29ubiwKLQkJICAgICAgIFBQUG9FUGFja2V0ICpwYWNrZXQsIGludCBsZW4pOwotdm9pZCBpbml0UFBQKHZvaWQpOwotdm9pZCBjbGFtcE1TUyhQUFBvRVBhY2tldCAqcGFja2V0LCBjaGFyIGNvbnN0ICpkaXIsIGludCBjbGFtcE1zcyk7Ci1VSU5UMTZfdCBjb21wdXRlVENQQ2hlY2tzdW0odW5zaWduZWQgY2hhciAqaXBIZHIsIHVuc2lnbmVkIGNoYXIgKnRjcEhkcik7Ci1VSU5UMTZfdCBwcHBGQ1MxNihVSU5UMTZfdCBmY3MsIHVuc2lnbmVkIGNoYXIgKmNwLCBpbnQgbGVuKTsKLXZvaWQgZGlzY292ZXJ5KFBQUG9FQ29ubmVjdGlvbiAqY29ubik7Ci11bnNpZ25lZCBjaGFyICpmaW5kVGFnKFBQUG9FUGFja2V0ICpwYWNrZXQsIFVJTlQxNl90IHRhZ1R5cGUsCi0JCSAgICAgICBQUFBvRVRhZyAqdGFnKTsKLQotdm9pZCBwcHBvZV9wcmludHBrdChQUFBvRVBhY2tldCAqcGFja2V0LAotCQkgICAgdm9pZCAoKnByaW50ZXIpKHZvaWQgKiwgY2hhciAqLCAuLi4pLCB2b2lkICphcmcpOwotdm9pZCBwcHBvZV9sb2dfcGFja2V0KGNvbnN0IGNoYXIgKnByZWZpeCwgUFBQb0VQYWNrZXQgKnBhY2tldCk7Ci0KLSNkZWZpbmUgU0VUX1NUUklORyh2YXIsIHZhbCkgZG8geyBpZiAodmFyKSBmcmVlKHZhcik7IHZhciA9IHN0ckR1cCh2YWwpOyB9IHdoaWxlKDApOwotCi0jZGVmaW5lIENIRUNLX1JPT00oY3Vyc29yLCBzdGFydCwgbGVuKSBcCi1kbyB7XAotICAgIGlmICgoKGN1cnNvciktKHN0YXJ0KSkrKGxlbikgPiBNQVhfUFBQT0VfUEFZTE9BRCkgeyBcCi0JZXJyb3IoIldvdWxkIGNyZWF0ZSB0b28tbG9uZyBwYWNrZXQiKTsJXAotICAgICAgICByZXR1cm47IFwKLSAgICB9IFwKLX0gd2hpbGUoMCkKLQotLyogVHJ1ZSBpZiBFdGhlcm5ldCBhZGRyZXNzIGlzIGJyb2FkY2FzdCBvciBtdWx0aWNhc3QgKi8KLSNkZWZpbmUgTk9UX1VOSUNBU1QoZSkgKChlWzBdICYgMHgwMSkgIT0gMCkKLSNkZWZpbmUgQlJPQURDQVNUKGUpICgoZVswXSAmIGVbMV0gJiBlWzJdICYgZVszXSAmIGVbNF0gJiBlWzVdKSA9PSAweEZGKQotI2RlZmluZSBOT1RfQlJPQURDQVNUKGUpICgoZVswXSAmIGVbMV0gJiBlWzJdICYgZVszXSAmIGVbNF0gJiBlWzVdKSAhPSAweEZGKQpkaWZmIC0tZ2l0IGEvcHBwZC9wbHVnaW5zL3dpbmJpbmQuYyBiL3BwcGQvcGx1Z2lucy93aW5iaW5kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMDVhY2QuLjAwMDAwMDAKLS0tIGEvcHBwZC9wbHVnaW5zL3dpbmJpbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDY2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogd2luYmluZC5jCi0qCi0qIFdJTkJJTkQgcGx1Z2luIGZvciBwcHBkLiAgUGVyZm9ybXMgUEFQLCBDSEFQLCBNUy1DSEFQLCBNUy1DSEFQdjIKLSogYXV0aGVudGljYXRpb24gdXNpbmcgV0lOQklORCB0byBjb250YWN0IGEgTlQtc3R5bGUgUERDLgotKiAKLSogQmFzZWQgb24gdGhlIHN0cnVjdHVyZSBvZiB0aGUgcmFkaXVzIG1vZHVsZS4KLSoKLSogQ29weXJpZ2h0IChDKSAyMDAzIEFuZHJldyBCYXJ0bGV0IDxhYmFydGxldEBzYW1iYS5vcmc+Ci0qCi0qIENvcHlyaWdodCAxOTk5IFBhdWwgTWFja2VycmFzLCBBbGFuIEN1cnJ5LiAKLSogKHBpcGUgcmVhZCBjb2RlIGZyb20gcGFzc3Byb210LmMpCi0qCi0qIENvcHlyaWdodCAoQykgMjAwMiBSb2FyaW5nIFBlbmd1aW4gU29mdHdhcmUgSW5jLgotKgotKiBCYXNlZCBvbiBhIHBhdGNoIGZvciBpcHBwZCwgd2hpY2ggaXM6Ci0qICAgIENvcHlyaWdodCAoQykgMTk5NiwgTWF0amF6IEdvZGVjIDxnb2R5QGVsZ28uc2k+Ci0qICAgIENvcHlyaWdodCAoQykgMTk5NiwgTGFycyBGZW5uZWJlcmcgPGluNXkwNTBAcHVibGljLnVuaS1oYW1idXJnLmRlPgotKiAgICBDb3B5cmlnaHQgKEMpIDE5OTcsIE1pZ3VlbCBBLkwuIFBhcmF6IDxtYXBAaXBoaWwubmV0PgotKgotKiBVc2VzIHJhZGl1c2NsaWVudCBsaWJyYXJ5LCB3aGljaCBpczoKLSogICAgQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYsMTk5NywxOTk4IExhcnMgRmVubmViZXJnIDxsZkBlbGVtZW50YWwubmV0PgotKiAgICBDb3B5cmlnaHQgKEMpIDIwMDIgUm9hcmluZyBQZW5ndWluIFNvZnR3YXJlIEluYy4KLSoKLSogTVBQRSBzdXBwb3J0IGlzIGJ5IFJhbGYgSG9mbWFubiwgPHJhbGYuaG9mbWFubkBlbHZpZG8ubmV0Piwgd2l0aAotKiBtb2RpZmljYXRpb24gZnJvbSBGcmFuayBDdXNhY2ssIDxmcmFua0Bnb29nbGUuY29tPi4KLSoKLSogVXBkYXRlZCBvbiAyMDAzLTEyLTEyIHRvIHN1cHBvcnQgdXBkYXRlZCBQUFAgcGx1Z2luIEFQSSBmcm9tIGxhdGVzdCBDVlMKLSogICAgQ29weXJpZ2h0IChDKSAyMDAzLCBTZWFuIEUuIE1pbGxpY2hhbXAgPHNlYW4gYXQgYnJ1ZW5vciBkb3Qgb3JnPgotKgotKiBUaGlzIHBsdWdpbiBtYXkgYmUgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VCi0qIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwcHBkLmgiCi0jaW5jbHVkZSAiY2hhcC1uZXcuaCIKLSNpbmNsdWRlICJjaGFwX21zLmgiCi0jaWZkZWYgTVBQRQotI2luY2x1ZGUgIm1kNS5oIgotI2VuZGlmCi0jaW5jbHVkZSAiZnNtLmgiCi0jaW5jbHVkZSAiaXBjcC5oIgotI2luY2x1ZGUgPHN5c2xvZy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jZGVmaW5lIEJVRl9MRU4gMTAyNAotCi0jZGVmaW5lIE5PVF9BVVRIRU5USUNBVEVEIDAKLSNkZWZpbmUgQVVUSEVOVElDQVRFRCAxCi0KLXN0YXRpYyBjaGFyICpudGxtX2F1dGggPSBOVUxMOwotCi1zdGF0aWMgaW50IHNldF9udGxtX2F1dGgoY2hhciAqKmFyZ3YpCi17Ci0JY2hhciAqcDsKLQotCXAgPSBhcmd2WzBdOwotCWlmIChwWzBdICE9ICcvJykgewotCQlvcHRpb25fZXJyb3IoIm50bG1fYXV0aC1oZWxwZXIgYXJndW1lbnQgbXVzdCBiZSBmdWxsIHBhdGgiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXAgPSBzdHJkdXAocCk7Ci0JaWYgKHAgPT0gTlVMTCkgewotCQlub3ZtKCJudGxtX2F1dGgtaGVscGVyIGFyZ3VtZW50Iik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAobnRsbV9hdXRoICE9IE5VTEwpCi0JCWZyZWUobnRsbV9hdXRoKTsKLQludGxtX2F1dGggPSBwOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgb3B0aW9uX3QgT3B0aW9uc1tdID0gewotCXsgIm50bG1fYXV0aC1oZWxwZXIiLCBvX3NwZWNpYWwsICh2b2lkICopICZzZXRfbnRsbV9hdXRoLAotCSAgIlBhdGggdG8gbnRsbV9hdXRoIGV4ZWN1dGFibGUiLCBPUFRfUFJJViB9LAotCXsgTlVMTCB9Ci19OwotCi1zdGF0aWMgaW50Ci13aW5iaW5kX3NlY3JldF9jaGVjayh2b2lkKTsKLQotc3RhdGljIGludCB3aW5iaW5kX3BhcF9hdXRoKGNoYXIgKnVzZXIsCi0JCQkgICBjaGFyICpwYXNzd2QsCi0JCQkgICBjaGFyICoqbXNncCwKLQkJCSAgIHN0cnVjdCB3b3JkbGlzdCAqKnBhZGRycywKLQkJCSAgIHN0cnVjdCB3b3JkbGlzdCAqKnBvcHRzKTsKLXN0YXRpYyBpbnQgd2luYmluZF9jaGFwX3ZlcmlmeShjaGFyICp1c2VyLCBjaGFyICpvdXJuYW1lLCBpbnQgaWQsCi0JCQkgICAgICAgc3RydWN0IGNoYXBfZGlnZXN0X3R5cGUgKmRpZ2VzdCwKLQkJCSAgICAgICB1bnNpZ25lZCBjaGFyICpjaGFsbGVuZ2UsCi0JCQkgICAgICAgdW5zaWduZWQgY2hhciAqcmVzcG9uc2UsCi0JCQkgICAgICAgY2hhciAqbWVzc2FnZSwgaW50IG1lc3NhZ2Vfc3BhY2UpOwotc3RhdGljIGludCB3aW5iaW5kX2FsbG93ZWRfYWRkcmVzcyh1X2ludDMyX3QgYWRkcik7IAotCi1jaGFyIHBwcGRfdmVyc2lvbltdID0gVkVSU0lPTjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogJUZVTkNUSU9OOiBwbHVnaW5faW5pdAotKiAlQVJHVU1FTlRTOgotKiAgTm9uZQotKiAlUkVUVVJOUzoKLSogIE5vdGhpbmcKLSogJURFU0NSSVBUSU9OOgotKiAgSW5pdGlhbGl6ZXMgV0lOQklORCBwbHVnaW4uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLXBsdWdpbl9pbml0KHZvaWQpCi17Ci0gICAgcGFwX2NoZWNrX2hvb2sgPSB3aW5iaW5kX3NlY3JldF9jaGVjazsKLSAgICBwYXBfYXV0aF9ob29rID0gd2luYmluZF9wYXBfYXV0aDsKLQotICAgIGNoYXBfY2hlY2tfaG9vayA9IHdpbmJpbmRfc2VjcmV0X2NoZWNrOwotICAgIGNoYXBfdmVyaWZ5X2hvb2sgPSB3aW5iaW5kX2NoYXBfdmVyaWZ5OwotCi0gICAgYWxsb3dlZF9hZGRyZXNzX2hvb2sgPSB3aW5iaW5kX2FsbG93ZWRfYWRkcmVzczsKLQotICAgIC8qIERvbid0IGFzayB0aGUgcGVlciBmb3IgYW55dGhpbmcgb3RoZXIgdGhhbiBNUy1DSEFQIG9yIE1TLUNIQVAgVjIgKi8KLSAgICBjaGFwX21kdHlwZV9hbGwgJj0gKE1EVFlQRV9NSUNST1NPRlRfVjIgfCBNRFRZUEVfTUlDUk9TT0ZUKTsKLSAgICAKLSAgICBhZGRfb3B0aW9ucyhPcHRpb25zKTsKLQotICAgIGluZm8oIldJTkJJTkQgcGx1Z2luIGluaXRpYWxpemVkLiIpOwotfQotCi0vKioKLSBSb3V0aW5lIHRvIGdldCBoZXggY2hhcmFjdGVycyBhbmQgdHVybiB0aGVtIGludG8gYSAxNiBieXRlIGFycmF5LgotIHRoZSBhcnJheSBjYW4gYmUgdmFyaWFibGUgbGVuZ3RoLCBhbmQgYW55IG5vbi1oZXgtbnVtZXJpYwotIGNoYXJhY3RlcnMgYXJlIHNraXBwZWQuICAiMHhubiIgb3IgIjBYbm4iIGlzIHNwZWNpYWxseSBjYXRlcmVkCi0gZm9yLgotCi0gdmFsaWQgZXhhbXBsZXM6ICIwQTVEMTUiOyAiMHgxNSwgMHg0OSwgMHhhMiI7ICI1OVx0YTlcdGUzXG4iCi0KLSoqLwotCi0vKiAKLSAgIFVuaXggU01CL0NJRlMgaW1wbGVtZW50YXRpb24uCi0gICBTYW1iYSB1dGlsaXR5IGZ1bmN0aW9ucwotICAgCi0gICBDb3B5cmlnaHQgKEMpIEFuZHJldyBUcmlkZ2VsbCAxOTkyLTIwMDEKLSAgIENvcHlyaWdodCAoQykgU2ltbyBTb3JjZSAgICAgIDIwMDEtMjAwMgotICAgQ29weXJpZ2h0IChDKSBNYXJ0aW4gUG9vbCAgICAgMjAwMwotICAgCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICAgCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotKi8KLQotc2l6ZV90IHN0cmhleF90b19zdHIoY2hhciAqcCwgc2l6ZV90IGxlbiwgY29uc3QgY2hhciAqc3RyaGV4KQotewotCXNpemVfdCBpOwotCXNpemVfdCBudW1fY2hhcnMgPSAwOwotCXVuc2lnbmVkIGNoYXIgICBsb255YmJsZSwgaGlueWJibGU7Ci0JY29uc3QgY2hhciAgICAgKmhleGNoYXJzID0gIjAxMjM0NTY3ODlBQkNERUYiOwotCWNoYXIgICAgICAgICAgICpwMSA9IE5VTEwsICpwMiA9IE5VTEw7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuICYmIHN0cmhleFtpXSAhPSAwOyBpKyspIHsKLQkJaWYgKHN0cm5jbXAoaGV4Y2hhcnMsICIweCIsIDIpID09IDApIHsKLQkJCWkrKzsgLyogc2tpcCB0d28gY2hhcnMgKi8KLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKCEocDEgPSBzdHJjaHIoaGV4Y2hhcnMsIHRvdXBwZXIoc3RyaGV4W2ldKSkpKQotCQkJYnJlYWs7Ci0KLQkJaSsrOyAvKiBuZXh0IGhleCBkaWdpdCAqLwotCi0JCWlmICghKHAyID0gc3RyY2hyKGhleGNoYXJzLCB0b3VwcGVyKHN0cmhleFtpXSkpKSkKLQkJCWJyZWFrOwotCi0JCS8qIGdldCB0aGUgdHdvIG55YmJsZXMgKi8KLQkJaGlueWJibGUgPSAocDEgLSBoZXhjaGFycyk7Ci0JCWxvbnliYmxlID0gKHAyIC0gaGV4Y2hhcnMpOwotCi0JCXBbbnVtX2NoYXJzXSA9IChoaW55YmJsZSA8PCA0KSB8IGxvbnliYmxlOwotCQludW1fY2hhcnMrKzsKLQotCQlwMSA9IE5VTEw7Ci0JCXAyID0gTlVMTDsKLQl9Ci0JcmV0dXJuIG51bV9jaGFyczsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmI2NCA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKLQotLyoqCi0gKiBFbmNvZGUgYSBiYXNlNjQgc3RyaW5nIGludG8gYSBtYWxsb2MoKWVkIHN0cmluZyBjYWxsZXIgdG8gZnJlZS4KLSAqCi0gKkZyb20gU1FVSUQ6IGFkb3B0ZWQgZnJvbSBodHRwOi8vZnRwLnN1bmV0LnNlL3B1YjIvZ251L3ZtL2Jhc2U2NC1lbmNvZGUuYyB3aXRoIGFkanVzdG1lbnRzCi0gKiovCi1jaGFyICogYmFzZTY0X2VuY29kZShjb25zdCBjaGFyICpkYXRhKQotewotCXNpemVfdCBvdXRfY250ID0gMDsKLQlzaXplX3QgbGVuID0gc3RybGVuKGRhdGEpOwotCXNpemVfdCBvdXRwdXRfbGVuID0gNCAqICgobGVuICsgMikgLyAzKSArIDI7Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqcHRyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgZGF0YTsKLQljaGFyICpyZXN1bHQgPSBtYWxsb2Mob3V0cHV0X2xlbik7IC8qIGdldCB1cyBwbGVudHkgb2Ygc3BhY2UgKi8KLQl1bnNpZ25lZCBpbnQgYml0czsKLQotCWZvciAoOyBsZW4gPj0gMzsgbGVuIC09IDMpIHsKLQkJYml0cyA9IChwdHJbMF0gPDwgMTYpICsgKHB0clsxXSA8PCA4KSArIHB0clsyXTsKLQkJcHRyICs9IDM7Ci0JCXJlc3VsdFtvdXRfY250KytdID0gYjY0W2JpdHMgPj4gMThdOwotCQlyZXN1bHRbb3V0X2NudCsrXSA9IGI2NFsoYml0cyA+PiAxMikgJiAweDNmXTsKLQkJcmVzdWx0W291dF9jbnQrK10gPSBiNjRbKGJpdHMgPj4gNikgJiAweDNmXTsKLQkJcmVzdWx0W291dF9jbnQrK10gPSBiNjRbYml0cyAmIDB4M2ZdOwotCX0KLQlpZiAobGVuICE9IDApIHsKLQkJYml0cyA9IHB0clswXSA8PCAxNjsKLQkJaWYgKGxlbiA+IDEpCi0JCQliaXRzIHw9IHB0clsxXSA8PCA4OwotCQlyZXN1bHRbb3V0X2NudCsrXSA9IGI2NFtiaXRzID4+IDE4XTsKLQkJcmVzdWx0W291dF9jbnQrK10gPSBiNjRbKGJpdHMgPj4gMTIpICYgMHgzZl07Ci0JCXJlc3VsdFtvdXRfY250KytdID0gKGxlbiA+IDEpPyBiNjRbKGJpdHMgPj4gNikgJiAweDNmXTogJz0nOwotCQlyZXN1bHRbb3V0X2NudCsrXSA9ICc9JzsKLQl9Ci0KLQlyZXN1bHRbb3V0X2NudF0gPSAnXDAnOwkvKiB0ZXJtaW5hdGUgKi8KLQlyZXR1cm4gcmVzdWx0OwotfQotCi11bnNpZ25lZCBpbnQgcnVuX250bG1fYXV0aChjb25zdCBjaGFyICp1c2VybmFtZSwgCi0JCQkgICBjb25zdCBjaGFyICpkb21haW4sIAotCQkJICAgY29uc3QgY2hhciAqZnVsbF91c2VybmFtZSwKLQkJCSAgIGNvbnN0IGNoYXIgKnBsYWludGV4dF9wYXNzd29yZCwKLQkJCSAgIGNvbnN0IHVfY2hhciAqY2hhbGxlbmdlLAotCQkJICAgc2l6ZV90IGNoYWxsZW5nZV9sZW5ndGgsCi0JCQkgICBjb25zdCB1X2NoYXIgKmxtX3Jlc3BvbnNlLCAKLQkJCSAgIHNpemVfdCBsbV9yZXNwb25zZV9sZW5ndGgsCi0JCQkgICBjb25zdCB1X2NoYXIgKm50X3Jlc3BvbnNlLCAKLQkJCSAgIHNpemVfdCBudF9yZXNwb25zZV9sZW5ndGgsCi0JCQkgICB1X2NoYXIgbnRfa2V5WzE2XSwgCi0JCQkgICBjaGFyICoqZXJyb3Jfc3RyaW5nKSAKLXsKLQkKLQlwaWRfdCBmb3JrcmV0OwotICAgICAgICBpbnQgY2hpbGRfaW5bMl07Ci0gICAgICAgIGludCBjaGlsZF9vdXRbMl07Ci0JaW50IHN0YXR1czsKLQotCWludCBhdXRoZW50aWNhdGVkID0gTk9UX0FVVEhFTlRJQ0FURUQ7IC8qIG5vdCBhdXRoICovCi0JaW50IGdvdF91c2VyX3Nlc3Npb25fa2V5ID0gMDsgLyogbm90IGdvdCBrZXkgKi8KLQotCWNoYXIgYnVmZmVyWzEwMjRdOwotCi0JRklMRSAqcGlwZV9pbjsKLQlGSUxFICpwaXBlX291dDsKLQkKLQlpbnQgaTsKLQljaGFyICpjaGFsbGVuZ2VfaGV4OwotCWNoYXIgKmxtX2hleF9oYXNoOwotCWNoYXIgKm50X2hleF9oYXNoOwotCi0JLyogRmlyc3Qgc2VlIGlmIHdlIGhhdmUgYSBwcm9ncmFtIHRvIHJ1bi4uLiAqLwotCWlmIChudGxtX2F1dGggPT0gTlVMTCkKLQkJcmV0dXJuIE5PVF9BVVRIRU5USUNBVEVEOwotCi0gICAgICAgIC8qIE1ha2UgZmlyc3QgY2hpbGQgKi8KLSAgICAgICAgaWYgKHBpcGUoY2hpbGRfb3V0KSA9PSAtMSkgewotICAgICAgICAgICAgICAgIGVycm9yKCJwaXBlIGNyZWF0aW9uIGZhaWxlZCBmb3IgY2hpbGQgT1VUISIpOwotCQlyZXR1cm4gTk9UX0FVVEhFTlRJQ0FURUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGlwZShjaGlsZF9pbikgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBlcnJvcigicGlwZSBjcmVhdGlvbiBmYWlsZWQgZm9yIGNoaWxkIElOISIpOwotCQlyZXR1cm4gTk9UX0FVVEhFTlRJQ0FURUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3JrcmV0ID0gc2FmZV9mb3JrKGNoaWxkX2luWzBdLCBjaGlsZF9vdXRbMV0sIDIpOwotICAgICAgICBpZiAoZm9ya3JldCA9PSAtMSkgewotCQlpZiAoZXJyb3Jfc3RyaW5nKSB7Ci0JCQkqZXJyb3Jfc3RyaW5nID0gc3RyZHVwKCJmb3JrIGZhaWxlZCEiKTsKLQkJfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9BVVRIRU5USUNBVEVEOwotICAgICAgICB9Ci0KLQlpZiAoZm9ya3JldCA9PSAwKSB7Ci0JCS8qIGNoaWxkIHByb2Nlc3MgKi8KLQkJdWlkX3QgdWlkOwotCi0JCWNsb3NlKGNoaWxkX291dFswXSk7Ci0JCWNsb3NlKGNoaWxkX2luWzFdKTsKLQotCQkvKiBydW4gd2luYmluZCBhcyB0aGUgdXNlciB0aGF0IGludm9rZWQgcHBwZCAqLwotCQlzZXRnaWQoZ2V0Z2lkKCkpOwotCQl1aWQgPSBnZXR1aWQoKTsKLQkJaWYgKHNldHVpZCh1aWQpID09IC0xIHx8IGdldHVpZCgpICE9IHVpZCkKLQkJCWZhdGFsKCJwcHBkL3dpbmJpbmQ6IGNvdWxkIG5vdCBzZXR1aWQgdG8gJWQ6ICVtIiwgdWlkKTsKLQkJZXhlY2woIi9iaW4vc2giLCAic2giLCAiLWMiLCBudGxtX2F1dGgsIE5VTEwpOyAgCi0JCWZhdGFsKCJwcHBkL3dpbmJpbmQ6IGNvdWxkIG5vdCBleGVjIC9iaW4vc2g6ICVtIik7Ci0JfQotCi0gICAgICAgIC8qIHBhcmVudCAqLwotCWNsb3NlKGNoaWxkX291dFsxXSk7Ci0JY2xvc2UoY2hpbGRfaW5bMF0pOwotCi0JLyogTmVlZCB0byB3cml0ZSB0aGUgVXNlcidzIGluZm8gb250byB0aGUgcGlwZSAqLwotCi0JcGlwZV9pbiA9IGZkb3BlbihjaGlsZF9pblsxXSwgInciKTsKLQotCXBpcGVfb3V0ID0gZmRvcGVuKGNoaWxkX291dFswXSwgInIiKTsKLQotCS8qIGxvb2sgZm9yIHNlc3Npb24ga2V5IGNvbWluZyBiYWNrICovCi0KLQlpZiAodXNlcm5hbWUpIHsKLQkJY2hhciAqYjY0X3VzZXJuYW1lID0gYmFzZTY0X2VuY29kZSh1c2VybmFtZSk7Ci0JCWZwcmludGYocGlwZV9pbiwgIlVzZXJuYW1lOjogJXNcbiIsIGI2NF91c2VybmFtZSk7Ci0JCWZyZWUoYjY0X3VzZXJuYW1lKTsKLQl9Ci0KLQlpZiAoZG9tYWluKSB7Ci0JCWNoYXIgKmI2NF9kb21haW4gPSBiYXNlNjRfZW5jb2RlKGRvbWFpbik7Ci0JCWZwcmludGYocGlwZV9pbiwgIk5ULURvbWFpbjo6ICVzXG4iLCBiNjRfZG9tYWluKTsKLQkJZnJlZShiNjRfZG9tYWluKTsKLQl9Ci0KLQlpZiAoZnVsbF91c2VybmFtZSkgewotCQljaGFyICpiNjRfZnVsbF91c2VybmFtZSA9IGJhc2U2NF9lbmNvZGUoZnVsbF91c2VybmFtZSk7Ci0JCWZwcmludGYocGlwZV9pbiwgIkZ1bGwtVXNlcm5hbWU6OiAlc1xuIiwgYjY0X2Z1bGxfdXNlcm5hbWUpOwotCQlmcmVlKGI2NF9mdWxsX3VzZXJuYW1lKTsKLQl9Ci0KLQlpZiAocGxhaW50ZXh0X3Bhc3N3b3JkKSB7Ci0JCWNoYXIgKmI2NF9wbGFpbnRleHRfcGFzc3dvcmQgPSBiYXNlNjRfZW5jb2RlKHBsYWludGV4dF9wYXNzd29yZCk7Ci0JCWZwcmludGYocGlwZV9pbiwgIlBhc3N3b3JkOjogJXNcbiIsIGI2NF9wbGFpbnRleHRfcGFzc3dvcmQpOwotCQlmcmVlKGI2NF9wbGFpbnRleHRfcGFzc3dvcmQpOwotCX0KLQotCWlmIChjaGFsbGVuZ2VfbGVuZ3RoKSB7Ci0JCWZwcmludGYocGlwZV9pbiwgIlJlcXVlc3QtVXNlci1TZXNzaW9uLUtleTogeWVzXG4iKTsKLQotCQljaGFsbGVuZ2VfaGV4ID0gbWFsbG9jKGNoYWxsZW5nZV9sZW5ndGgqMisxKTsKLQkJCi0JCWZvciAoaSA9IDA7IGkgPCBjaGFsbGVuZ2VfbGVuZ3RoOyBpKyspCi0JCQlzcHJpbnRmKGNoYWxsZW5nZV9oZXggKyBpICogMiwgIiUwMlgiLCBjaGFsbGVuZ2VbaV0pOwotCQkKLQkJZnByaW50ZihwaXBlX2luLCAiTEFOTUFOLUNoYWxsZW5nZTogJXNcbiIsIGNoYWxsZW5nZV9oZXgpOwotCQlmcmVlKGNoYWxsZW5nZV9oZXgpOwotCX0KLQkKLQlpZiAobG1fcmVzcG9uc2VfbGVuZ3RoKSB7Ci0JCWxtX2hleF9oYXNoID0gbWFsbG9jKGxtX3Jlc3BvbnNlX2xlbmd0aCoyKzEpOwotCQkKLQkJZm9yIChpID0gMDsgaSA8IGxtX3Jlc3BvbnNlX2xlbmd0aDsgaSsrKQotCQkJc3ByaW50ZihsbV9oZXhfaGFzaCArIGkgKiAyLCAiJTAyWCIsIGxtX3Jlc3BvbnNlW2ldKTsKLQkJCi0JCWZwcmludGYocGlwZV9pbiwgIkxBTk1BTi1yZXNwb25zZTogJXNcbiIsIGxtX2hleF9oYXNoKTsKLQkJZnJlZShsbV9oZXhfaGFzaCk7Ci0JfQotCQotCWlmIChudF9yZXNwb25zZV9sZW5ndGgpIHsKLQkJbnRfaGV4X2hhc2ggPSBtYWxsb2MobnRfcmVzcG9uc2VfbGVuZ3RoKjIrMSk7Ci0JCQotCQlmb3IgKGkgPSAwOyBpIDwgbnRfcmVzcG9uc2VfbGVuZ3RoOyBpKyspCi0JCQlzcHJpbnRmKG50X2hleF9oYXNoICsgaSAqIDIsICIlMDJYIiwgbnRfcmVzcG9uc2VbaV0pOwotCQkKLQkJZnByaW50ZihwaXBlX2luLCAiTlQtcmVzcG9uc2U6ICVzXG4iLCBudF9oZXhfaGFzaCk7Ci0JCWZyZWUobnRfaGV4X2hhc2gpOwotCX0KLQkKLQlmcHJpbnRmKHBpcGVfaW4sICIuXG4iKTsKLQlmZmx1c2gocGlwZV9pbik7Ci0JCi0Jd2hpbGUgKGZnZXRzKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciktMSwgcGlwZV9vdXQpICE9IE5VTEwpIHsKLQkJY2hhciAqbWVzc2FnZSwgKnBhcmFtZXRlcjsKLQkJaWYgKGJ1ZmZlcltzdHJsZW4oYnVmZmVyKS0xXSAhPSAnXG4nKSB7Ci0JCQlicmVhazsKLQkJfQotCQlidWZmZXJbc3RybGVuKGJ1ZmZlciktMV0gPSAnXDAnOwotCQltZXNzYWdlID0gYnVmZmVyOwotCi0JCWlmICghKHBhcmFtZXRlciA9IHN0cnN0cihidWZmZXIsICI6ICIpKSkgewotCQkJYnJlYWs7Ci0JCX0KLQkJCi0JCXBhcmFtZXRlclswXSA9ICdcMCc7Ci0JCXBhcmFtZXRlcisrOwotCQlwYXJhbWV0ZXJbMF0gPSAnXDAnOwotCQlwYXJhbWV0ZXIrKzsKLQkJCi0JCWlmIChzdHJjbXAobWVzc2FnZSwgIi4iKSA9PSAwKSB7Ci0JCQkvKiBlbmQgb2Ygc2VxdWVuY2UgKi8KLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKHN0cmNhc2VjbXAobWVzc2FnZSwgIkF1dGhlbnRpY2F0ZWQiKSA9PSAwKSB7Ci0JCQlpZiAoc3RyY2FzZWNtcChwYXJhbWV0ZXIsICJZZXMiKSA9PSAwKSB7Ci0JCQkJYXV0aGVudGljYXRlZCA9IEFVVEhFTlRJQ0FURUQ7Ci0JCQl9IGVsc2UgewotCQkJCW5vdGljZSgiV2luYmluZCBoYXMgZGVjbGluZWQgYXV0aGVudGljYXRpb24gZm9yIHVzZXIhIik7Ci0JCQkJYXV0aGVudGljYXRlZCA9IE5PVF9BVVRIRU5USUNBVEVEOwotCQkJfQotCQl9IGVsc2UgaWYgKHN0cmNhc2VjbXAobWVzc2FnZSwgIlVzZXItc2Vzc2lvbi1rZXkiKSA9PSAwKSB7Ci0JCQkvKiBsZW5ndGggaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHBhcnNlICovCi0JCQlpZiAobnRfa2V5KSB7IAotCQkJCWlmIChzdHJoZXhfdG9fc3RyKG50X2tleSwgMzIsIHBhcmFtZXRlcikgPT0gMTYpIHsKLQkJCQkJZ290X3VzZXJfc2Vzc2lvbl9rZXkgPSAxOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW5vdGljZSgiTlQgc2Vzc2lvbiBrZXkgZm9yIHVzZXIgd2FzIG5vdCAxNiBieXRlcyEiKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc3RyY2FzZWNtcChtZXNzYWdlLCAiRXJyb3IiKSA9PSAwKSB7Ci0JCQlhdXRoZW50aWNhdGVkID0gTk9UX0FVVEhFTlRJQ0FURUQ7Ci0JCQlpZiAoZXJyb3Jfc3RyaW5nKQotCQkJCSplcnJvcl9zdHJpbmcgPSBzdHJkdXAocGFyYW1ldGVyKTsKLQkJfSBlbHNlIGlmIChzdHJjYXNlY21wKG1lc3NhZ2UsICJBdXRoZW50aWNhdGlvbi1FcnJvciIpID09IDApIHsKLQkJCWF1dGhlbnRpY2F0ZWQgPSBOT1RfQVVUSEVOVElDQVRFRDsKLQkJCWlmIChlcnJvcl9zdHJpbmcpCi0JCQkJKmVycm9yX3N0cmluZyA9IHN0cmR1cChwYXJhbWV0ZXIpOwotCQl9IGVsc2UgewotCQkJbm90aWNlKCJ1bnJlY29nbmlzZWQgaW5wdXQgZnJvbSBudGxtX2F1dGggaGVscGVyIC0gJXM6ICVzIiwgbWVzc2FnZSwgcGFyYW1ldGVyKTsgCi0JCX0KLQl9Ci0KLSAgICAgICAgLyogcGFyZW50ICovCi0gICAgICAgIGlmIChjbG9zZShjaGlsZF9vdXRbMF0pID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgbm90aWNlKCJlcnJvciBjbG9zaW5nIHBpcGU/IT8gZm9yIGNoaWxkIE9VVFswXSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOT1RfQVVUSEVOVElDQVRFRDsKLSAgICAgICAgfQotCi0gICAgICAgLyogcGFyZW50ICovCi0gICAgICAgIGlmIChjbG9zZShjaGlsZF9pblsxXSkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBub3RpY2UoImVycm9yIGNsb3NpbmcgcGlwZT8hPyBmb3IgY2hpbGQgSU5bMV0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0FVVEhFTlRJQ0FURUQ7Ci0gICAgICAgIH0KLQotCXdoaWxlICgod2FpdCgmc3RhdHVzKSA9PSAtMSkgJiYgZXJybm8gPT0gRUlOVFIpCi0gICAgICAgICAgICAgICAgOwotCi0JaWYgKChhdXRoZW50aWNhdGVkID09IEFVVEhFTlRJQ0FURUQpICYmIG50X2tleSAmJiAhZ290X3VzZXJfc2Vzc2lvbl9rZXkpIHsKLQkJbm90aWNlKCJEaWQgbm90IGdldCB1c2VyIHNlc3Npb24ga2V5LCBkZXNwaXRlIGJlaW5nIGF1dGhlbnRpY2F0ZWQhIik7Ci0JCXJldHVybiBOT1RfQVVUSEVOVElDQVRFRDsKLQl9Ci0JcmV0dXJuIGF1dGhlbnRpY2F0ZWQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICVGVU5DVElPTjogd2luYmluZF9zZWNyZXRfY2hlY2sKLSogJUFSR1VNRU5UUzoKLSogIE5vbmUKLSogJVJFVFVSTlM6Ci0qICAwIGlmIHdlIGRvbid0IGhhdmUgYW4gbnRsbV9hdXRoIHByb2dyYW0gdG8gcnVuLCBvdGhlcndpc2UgMS4KLSogJURFU0NSSVBUSU9OOgotKiBUZWxscyBwcHBkIHRoYXQgd2Ugd2lsbCB0cnkgdG8gYXV0aGVudGljYXRlIHRoZSBwZWVyLCBhbmQgbm90IHRvCi0qIHdvcnJ5IGFib3V0IGxvb2tpbmcgaW4gL2V0Yy9wcHAvICotc2VjcmV0cwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50Ci13aW5iaW5kX3NlY3JldF9jaGVjayh2b2lkKQotewotCXJldHVybiBudGxtX2F1dGggIT0gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogJUZVTkNUSU9OOiB3aW5iaW5kX3BhcF9hdXRoCi0qICVBUkdVTUVOVFM6Ci0qICB1c2VyIC0tIHVzZXItbmFtZSBvZiBwZWVyCi0qICBwYXNzd2QgLS0gcGFzc3dvcmQgc3VwcGxpZWQgYnkgcGVlcgotKiAgbXNncCAtLSBNZXNzYWdlIHdoaWNoIHdpbGwgYmUgc2VudCBpbiBQQVAgcmVzcG9uc2UKLSogIHBhZGRycyAtLSBzZXQgdG8gYSBsaXN0IG9mIHBvc3NpYmxlIHBlZXIgSVAgYWRkcmVzc2VzCi0qICBwb3B0cyAtLSBzZXQgdG8gYSBsaXN0IG9mIGFkZGl0aW9uYWwgcHBwZCBvcHRpb25zCi0qICVSRVRVUk5TOgotKiAgMSBpZiB3ZSBjYW4gYXV0aGVudGljYXRlLCAtMSBpZiB3ZSBjYW5ub3QuCi0qICVERVNDUklQVElPTjoKLSogUGVyZm9ybXMgUEFQIGF1dGhlbnRpY2F0aW9uIHVzaW5nIFdJTkJJTkQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludAotd2luYmluZF9wYXBfYXV0aChjaGFyICp1c2VyLAotCQljaGFyICpwYXNzd29yZCwKLQkJY2hhciAqKm1zZ3AsCi0JCXN0cnVjdCB3b3JkbGlzdCAqKnBhZGRycywKLQkJc3RydWN0IHdvcmRsaXN0ICoqcG9wdHMpCi17Ci0JaWYgKHJ1bl9udGxtX2F1dGgoTlVMTCwgTlVMTCwgdXNlciwgcGFzc3dvcmQsIE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIG1zZ3ApID09IEFVVEhFTlRJQ0FURUQpIHsKLQkJcmV0dXJuIDE7Ci0JfSAKLQlyZXR1cm4gLTE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICVGVU5DVElPTjogd2luYmluZF9jaGFwX2F1dGgKLSogJUFSR1VNRU5UUzoKLSogIHVzZXIgLS0gdXNlci1uYW1lIG9mIHBlZXIKLSogIHJlbW1kIC0tIGhhc2ggcmVjZWl2ZWQgZnJvbSBwZWVyCi0qICByZW1tZF9sZW4gLS0gbGVuZ3RoIG9mIHJlbW1kCi0qICBjc3RhdGUgLS0gcHBwZCdzIGNoYXBfc3RhdGUgc3RydWN0dXJlCi0qICVSRVRVUk5TOgotKiAgQVVUSEVOVElDQVRFRCAoMSkgaWYgd2UgY2FuIGF1dGhlbnRpY2F0ZSwgTk9UX0FVVEhFTlRJQ0FURUQgKDApIGlmIHdlIGNhbm5vdC4KLSogJURFU0NSSVBUSU9OOgotKiBQZXJmb3JtcyBNUy1DSEFQIGFuZCBNUy1DSEFQdjIgYXV0aGVudGljYXRpb24gdXNpbmcgV0lOQklORC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50IAotd2luYmluZF9jaGFwX3ZlcmlmeShjaGFyICp1c2VyLCBjaGFyICpvdXJuYW1lLCBpbnQgaWQsCi0JCSAgICBzdHJ1Y3QgY2hhcF9kaWdlc3RfdHlwZSAqZGlnZXN0LAotCQkgICAgdW5zaWduZWQgY2hhciAqY2hhbGxlbmdlLAotCQkgICAgdW5zaWduZWQgY2hhciAqcmVzcG9uc2UsCi0JCSAgICBjaGFyICptZXNzYWdlLCBpbnQgbWVzc2FnZV9zcGFjZSkKLXsKLQlpbnQgY2hhbGxlbmdlX2xlbiwgcmVzcG9uc2VfbGVuOwotCWNoYXIgZG9tYWlubmFtZVsyNTZdOwotCWNoYXIgKmRvbWFpbjsKLQljaGFyICp1c2VybmFtZTsKLQljaGFyICpwOwotCWNoYXIgc2FyZXNwb25zZVtNU19BVVRIX1JFU1BPTlNFX0xFTkdUSCsxXTsKLQotCS8qIFRoZSBmaXJzdCBieXRlIG9mIGVhY2ggb2YgdGhlc2Ugc3RyaW5ncyBjb250YWlucyB0aGVpciBsZW5ndGggKi8KLQljaGFsbGVuZ2VfbGVuID0gKmNoYWxsZW5nZSsrOwotCXJlc3BvbnNlX2xlbiA9ICpyZXNwb25zZSsrOwotCQotCS8qIHJlbW92ZSBkb21haW4gZnJvbSAiZG9tYWluXHVzZXJuYW1lIiAqLwotCWlmICgodXNlcm5hbWUgPSBzdHJyY2hyKHVzZXIsICdcXCcpKSAhPSBOVUxMKQotCQkrK3VzZXJuYW1lOwotCWVsc2UKLQkJdXNlcm5hbWUgPSB1c2VyOwotCQotCXN0cmxjcHkoZG9tYWlubmFtZSwgdXNlciwgc2l6ZW9mKGRvbWFpbm5hbWUpKTsKLQkKLQkvKiByZW1vdmUgZG9tYWluIGZyb20gImRvbWFpblx1c2VybmFtZSIgKi8KLQlpZiAoKHAgPSBzdHJyY2hyKGRvbWFpbm5hbWUsICdcXCcpKSAhPSBOVUxMKSB7Ci0JCSpwID0gJ1wwJzsKLQkJZG9tYWluID0gZG9tYWlubmFtZTsKLQl9IGVsc2UgewotCQlkb21haW4gPSBOVUxMOwotCX0KLQkKLQkvKiAgZ2VuZXJhdGUgTUQgYmFzZWQgb24gbmVnb3RpYXRlZCB0eXBlICovCi0Jc3dpdGNoIChkaWdlc3QtPmNvZGUpIHsKLQkJCi0JY2FzZSBDSEFQX01JQ1JPU09GVDoKLQl7Ci0JCWNoYXIgKmVycm9yX3N0cmluZyA9IE5VTEw7Ci0JCXVfY2hhciAqbnRfcmVzcG9uc2UgPSBOVUxMOwotCQl1X2NoYXIgKmxtX3Jlc3BvbnNlID0gTlVMTDsKLQkJaW50IG50X3Jlc3BvbnNlX3NpemUgPSAwOwotCQlpbnQgbG1fcmVzcG9uc2Vfc2l6ZSA9IDA7Ci0JCXVfY2hhciBzZXNzaW9uX2tleVsxNl07Ci0JCQotCQlpZiAocmVzcG9uc2VfbGVuICE9IE1TX0NIQVBfUkVTUE9OU0VfTEVOKQotCQkJYnJlYWs7CQkJLyogbm90IGV2ZW4gdGhlIHJpZ2h0IGxlbmd0aCAqLwotCQkKLQkJLyogRGV0ZXJtaW5lIHdoaWNoIHBhcnQgb2YgcmVzcG9uc2UgdG8gdmVyaWZ5IGFnYWluc3QgKi8KLQkJaWYgKHJlc3BvbnNlW01TX0NIQVBfVVNFTlRdKSB7Ci0JCQludF9yZXNwb25zZSA9ICZyZXNwb25zZVtNU19DSEFQX05UUkVTUF07Ci0JCQludF9yZXNwb25zZV9zaXplID0gTVNfQ0hBUF9OVFJFU1BfTEVOOwotCQl9IGVsc2UgewotI2lmZGVmIE1TTEFOTUFOCi0JCQlsbV9yZXNwb25zZSA9ICZyZXNwb25zZVtNU19DSEFQX0xBTk1BTlJFU1BdOwotCQkJbG1fcmVzcG9uc2Vfc2l6ZSA9IE1TX0NIQVBfTEFOTUFOUkVTUF9MRU47Ci0jZWxzZQotCQkJLyogU2hvdWxkIHJlYWxseSBwcm9wYWdhdGUgdGhpcyBpbnRvIHRoZSBlcnJvciBwYWNrZXQuICovCi0JCQlub3RpY2UoIlBlZXIgcmVxdWVzdCBmb3IgTEFOTUFOIGF1dGggbm90IHN1cHBvcnRlZCIpOwotCQkJcmV0dXJuIE5PVF9BVVRIRU5USUNBVEVEOwotI2VuZGlmIC8qIE1TTEFOTUFOICovCi0JCX0KLQkJCi0JCS8qIHNoaXAgb2ZmIHRvIHdpbmJpbmQsIGFuZCBjaGVjayAqLwotCQkKLQkJaWYgKHJ1bl9udGxtX2F1dGgodXNlcm5hbWUsIAotCQkJCSAgZG9tYWluLAotCQkJCSAgTlVMTCwKLQkJCQkgIE5VTEwsCi0JCQkJICBjaGFsbGVuZ2UsIGNoYWxsZW5nZV9sZW4sCi0JCQkJICBsbV9yZXNwb25zZSwgbG1fcmVzcG9uc2Vfc2l6ZSwKLQkJCQkgIG50X3Jlc3BvbnNlLCBudF9yZXNwb25zZV9zaXplLAotCQkJCSAgc2Vzc2lvbl9rZXksCi0JCQkJICAmZXJyb3Jfc3RyaW5nKSA9PSBBVVRIRU5USUNBVEVEKSB7Ci0JCQltcHBlX3NldF9rZXlzKGNoYWxsZW5nZSwgc2Vzc2lvbl9rZXkpOwotCQkJc2xwcmludGYobWVzc2FnZSwgbWVzc2FnZV9zcGFjZSwgIkFjY2VzcyBncmFudGVkIik7Ci0JCQlyZXR1cm4gQVVUSEVOVElDQVRFRDsKLQkJCQotCQl9IGVsc2UgewotCQkJaWYgKGVycm9yX3N0cmluZykgewotCQkJCW5vdGljZShlcnJvcl9zdHJpbmcpOwotCQkJCWZyZWUoZXJyb3Jfc3RyaW5nKTsKLQkJCX0KLQkJCXNscHJpbnRmKG1lc3NhZ2UsIG1lc3NhZ2Vfc3BhY2UsICJFPTY5MSBSPTEgQz0lMC4qQiBWPTAiLAotCQkJCSBjaGFsbGVuZ2VfbGVuLCBjaGFsbGVuZ2UpOwotCQkJcmV0dXJuIE5PVF9BVVRIRU5USUNBVEVEOwotCQl9Ci0JCWJyZWFrOwotCX0KLQkKLQljYXNlIENIQVBfTUlDUk9TT0ZUX1YyOgotCXsKLQkJdV9jaGFyIENoYWxsZW5nZVs4XTsKLQkJdV9jaGFyIHNlc3Npb25fa2V5W01ENF9TSUdOQVRVUkVfU0laRV07Ci0JCWNoYXIgKmVycm9yX3N0cmluZyA9IE5VTEw7Ci0JCQotCQlpZiAocmVzcG9uc2VfbGVuICE9IE1TX0NIQVAyX1JFU1BPTlNFX0xFTikKLQkJCWJyZWFrOwkJCS8qIG5vdCBldmVuIHRoZSByaWdodCBsZW5ndGggKi8KLQkJCi0JCUNoYWxsZW5nZUhhc2goJnJlc3BvbnNlW01TX0NIQVAyX1BFRVJfQ0hBTExFTkdFXSwgY2hhbGxlbmdlLAotCQkJICAgICAgdXNlciwgQ2hhbGxlbmdlKTsKLQkJCi0JCS8qIHNoaXAgb2ZmIHRvIHdpbmJpbmQsIGFuZCBjaGVjayAqLwotCQkKLQkJaWYgKHJ1bl9udGxtX2F1dGgodXNlcm5hbWUsIAotCQkJCSAgZG9tYWluLCAKLQkJCQkgIE5VTEwsCi0JCQkJICBOVUxMLAotCQkJCSAgQ2hhbGxlbmdlLCA4LAotCQkJCSAgTlVMTCwgMCwKLQkJCQkgICZyZXNwb25zZVtNU19DSEFQMl9OVFJFU1BdLAotCQkJCSAgTVNfQ0hBUDJfTlRSRVNQX0xFTiwKLQkJCQkgIHNlc3Npb25fa2V5LAotCQkJCSAgJmVycm9yX3N0cmluZykgPT0gQVVUSEVOVElDQVRFRCkgewotCQkJCi0JCQlHZW5lcmF0ZUF1dGhlbnRpY2F0b3JSZXNwb25zZShzZXNzaW9uX2tleSwKLQkJCQkmcmVzcG9uc2VbTVNfQ0hBUDJfTlRSRVNQXSwKLQkJCQkmcmVzcG9uc2VbTVNfQ0hBUDJfUEVFUl9DSEFMTEVOR0VdLAotCQkJCWNoYWxsZW5nZSwgdXNlciwgc2FyZXNwb25zZSk7Ci0JCQltcHBlX3NldF9rZXlzMihzZXNzaW9uX2tleSwgJnJlc3BvbnNlW01TX0NIQVAyX05UUkVTUF0sCi0JCQkJICAgICAgIE1TX0NIQVAyX0FVVEhFTlRJQ0FUT1IpOwotCQkJaWYgKHJlc3BvbnNlW01TX0NIQVAyX0ZMQUdTXSkgewotCQkJCXNscHJpbnRmKG1lc3NhZ2UsIG1lc3NhZ2Vfc3BhY2UsICJTPSVzIiwgc2FyZXNwb25zZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNscHJpbnRmKG1lc3NhZ2UsIG1lc3NhZ2Vfc3BhY2UsICJTPSVzIE09JXMiLAotCQkJCQkgc2FyZXNwb25zZSwgIkFjY2VzcyBncmFudGVkIik7Ci0JCQl9Ci0JCQlyZXR1cm4gQVVUSEVOVElDQVRFRDsKLQkJCQotCQl9IGVsc2UgewotCQkJaWYgKGVycm9yX3N0cmluZykgewotCQkJCW5vdGljZShlcnJvcl9zdHJpbmcpOwotCQkJCXNscHJpbnRmKG1lc3NhZ2UsIG1lc3NhZ2Vfc3BhY2UsICJFPTY5MSBSPTEgQz0lMC4qQiBWPTAgTT0lcyIsCi0JCQkJCSBjaGFsbGVuZ2VfbGVuLCBjaGFsbGVuZ2UsIGVycm9yX3N0cmluZyk7Ci0JCQkJZnJlZShlcnJvcl9zdHJpbmcpOwotCQkJfSBlbHNlIHsKLQkJCQlzbHByaW50ZihtZXNzYWdlLCBtZXNzYWdlX3NwYWNlLCAiRT02OTEgUj0xIEM9JTAuKkIgVj0wIE09JXMiLAotCQkJCQkgY2hhbGxlbmdlX2xlbiwgY2hhbGxlbmdlLCAiQWNjZXNzIGRlbmllZCIpOwotCQkJfQotCQkJcmV0dXJuIE5PVF9BVVRIRU5USUNBVEVEOwotCQl9Ci0JCWJyZWFrOwotCX0KLQkKLQlkZWZhdWx0OgotCQllcnJvcigiV0lOQklORDogQ2hhbGxlbmdlIHR5cGUgJXUgdW5zdXBwb3J0ZWQiLCBkaWdlc3QtPmNvZGUpOwotCX0KLQlyZXR1cm4gTk9UX0FVVEhFTlRJQ0FURUQ7Ci19Ci0KLXN0YXRpYyBpbnQgCi13aW5iaW5kX2FsbG93ZWRfYWRkcmVzcyh1X2ludDMyX3QgYWRkcikgCi17Ci0JaXBjcF9vcHRpb25zICp3byA9ICZpcGNwX3dhbnRvcHRpb25zWzBdOwotCWlmICh3by0+aGlzYWRkciAhPTAgJiYgd28tPmhpc2FkZHIgPT0gYWRkcikgewotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIC0xOwotfQpkaWZmIC0tZ2l0IGEvcHBwZC9wcHAucGFtIGIvcHBwZC9wcHAucGFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDZmODA5Li4wMDAwMDAwCi0tLSBhL3BwcGQvcHBwLnBhbQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyVQQU0tMS4wCi0jIEluZm9ybWF0aW9uIGZvciB0aGUgUFBQRCBwcm9jZXNzIHdpdGggdGhlICdsb2dpbicgb3B0aW9uLgotYXV0aAlyZXF1aXJlZAlwYW1fbm9sb2dpbi5zbwotYXV0aAlyZXF1aXJlZAlwYW1fdW5peC5zbwotYWNjb3VudAlyZXF1aXJlZAlwYW1fdW5peC5zbwotc2Vzc2lvbglyZXF1aXJlZAlwYW1fdW5peC5zbwpkaWZmIC0tZ2l0IGEvcHBwZC9wcHBjcnlwdC5jIGIvcHBwZC9wcHBjcnlwdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjJhMTFiLi4wMDAwMDAwCi0tLSBhL3BwcGQvcHBwY3J5cHQuYworKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKgotICogcHBwY3J5cHQuYyAtIFBQUC9ERVMgbGlua2FnZSBmb3IgTVMtQ0hBUCBhbmQgRUFQIFNSUC1TSEExCi0gKgotICogRXh0cmFjdGVkIGZyb20gY2hhcF9tcy5jIGJ5IEphbWVzIENhcmxzb24uCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk1IEVyaWMgUm9zZW5xdWlzdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLSAqIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotICogQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSAicHBwZC5oIgotI2luY2x1ZGUgInBwcGNyeXB0LmgiCi0KLSNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKQotLyogVGhpcyBjb2RlIGNhbiB1c2Ugb25lIG9mIHRocmVlIERFUyBsaWJyYXJpZXMuIFRoZSBmaXJzdCwgaWYgVVNFX0xJQkRFUyBpcwotICogZGVmaW5lZCwgYXJlIHRoZSBsaWJkZXMgZnVuY3Rpb25zLiBUaGlzIGludGVyZmFjZSBpcyBzdGlsbCBzdXBwb3J0ZWQgYnkKLSAqIE9wZW5TU0wgYXMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIElmIFVTRV9DUllQVCBpcyBkZWZpbmVkIHRoZW4gdGhlCi0gKiBsaWJjcnlwdCBmdW5jdGlvbnMgYXJlIHVzZWQuIExhc3RseSwgaWYgVVNFX09QRU5TU0wgaXMgZGVmaW5lZCB0aGUgIm1vZGVybiIKLSAqIE9wZW5TU0wgaW50ZXJmYWNlIGlzIHVzZWQuICovCi0KLSNpZiBkZWZpbmVkKFVTRV9DUllQVCkKLSNpbmNsdWRlIDxjcnlwdC5oPgotI2VsaWYgZGVmaW5lZChVU0VfT1BFTlNTTCkKLSNpbmNsdWRlIDxvcGVuc3NsL2Rlcy5oPgotI2VsaWYgZGVmaW5lZChVU0VfTElCREVTKQotI2luY2x1ZGUgPGRlcy5oPgotI2Vsc2UKLSNlcnJvciAiTXVzdCBkZWZpbmUgb25lIG9mIFVTRV9DUllQVCwgVVNFX0xJQkRFUyBvciBVU0VfT1BFTlNTTCIKLSNlbmRpZgotCi0jZW5kaWYKLQotc3RhdGljIHVfY2hhcgotR2V0N0JpdHMoaW5wdXQsIHN0YXJ0Qml0KQotdV9jaGFyICppbnB1dDsKLWludCBzdGFydEJpdDsKLXsKLQl1bnNpZ25lZCBpbnQgd29yZDsKLQotCXdvcmQgID0gKHVuc2lnbmVkKWlucHV0W3N0YXJ0Qml0IC8gOF0gPDwgODsKLQl3b3JkIHw9ICh1bnNpZ25lZClpbnB1dFtzdGFydEJpdCAvIDggKyAxXTsKLQotCXdvcmQgPj49IDE1IC0gKHN0YXJ0Qml0ICUgOCArIDcpOwotCi0JcmV0dXJuIHdvcmQgJiAweEZFOwotfQotCi1zdGF0aWMgdm9pZAotTWFrZUtleShrZXksIGRlc19rZXkpCi11X2NoYXIgKmtleTsJCS8qIElOICA1NiBiaXQgREVTIGtleSBtaXNzaW5nIHBhcml0eSBiaXRzICovCi11X2NoYXIgKmRlc19rZXk7CS8qIE9VVCA2NCBiaXQgREVTIGtleSB3aXRoIHBhcml0eSBiaXRzIGFkZGVkICovCi17Ci0JZGVzX2tleVswXSA9IEdldDdCaXRzKGtleSwgIDApOwotCWRlc19rZXlbMV0gPSBHZXQ3Qml0cyhrZXksICA3KTsKLQlkZXNfa2V5WzJdID0gR2V0N0JpdHMoa2V5LCAxNCk7Ci0JZGVzX2tleVszXSA9IEdldDdCaXRzKGtleSwgMjEpOwotCWRlc19rZXlbNF0gPSBHZXQ3Qml0cyhrZXksIDI4KTsKLQlkZXNfa2V5WzVdID0gR2V0N0JpdHMoa2V5LCAzNSk7Ci0JZGVzX2tleVs2XSA9IEdldDdCaXRzKGtleSwgNDIpOwotCWRlc19rZXlbN10gPSBHZXQ3Qml0cyhrZXksIDQ5KTsKLQotI2lmIGRlZmluZWQoVVNFX0xJQkRFUykKLQlkZXNfc2V0X29kZF9wYXJpdHkoKGRlc19jYmxvY2sgKilkZXNfa2V5KTsKLSNlbmRpZgotfQotCi0jaWYgZGVmaW5lZChVU0VfQ1JZUFQpCi0vKgotICogaW4gPT0gOC1ieXRlIHN0cmluZyAoZXhwYW5kZWQgdmVyc2lvbiBvZiB0aGUgNTYtYml0IGtleSkKLSAqIG91dCA9PSA2NC1ieXRlIHN0cmluZyB3aGVyZSBlYWNoIGJ5dGUgaXMgZWl0aGVyIDEgb3IgMAotICogTm90ZSB0aGF0IHRoZSBsb3ctb3JkZXIgImJpdCIgaXMgYWx3YXlzIGlnbm9yZWQgYnkgYnkgc2V0a2V5KCkKLSAqLwotc3RhdGljIHZvaWQKLUV4cGFuZChpbiwgb3V0KQotdV9jaGFyICppbjsKLXVfY2hhciAqb3V0OwotewotICAgICAgICBpbnQgaiwgYzsKLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpbisrKXsKLQkJYyA9ICppbjsKLSAgICAgICAgICAgICAgICBmb3IgKGogPSA3OyBqID49IDA7IGotLSkKLSAgICAgICAgICAgICAgICAgICAgICAgICpvdXQrKyA9IChjID4+IGopICYgMDE7Ci0gICAgICAgICAgICAgICAgaSArPSA4OwotICAgICAgICB9Ci19Ci0KLS8qIFRoZSBpbnZlcnNlIG9mIEV4cGFuZAotICovCi1zdGF0aWMgdm9pZAotQ29sbGFwc2UoaW4sIG91dCkKLXVfY2hhciAqaW47Ci11X2NoYXIgKm91dDsKLXsKLSAgICAgICAgaW50IGo7Ci0gICAgICAgIGludCBpOwotCXVuc2lnbmVkIGludCBjOwotCi0JZm9yIChpID0gMDsgaSA8IDY0OyBpICs9IDgsIG91dCsrKSB7Ci0JICAgIGMgPSAwOwotCSAgICBmb3IgKGogPSA3OyBqID49IDA7IGotLSwgaW4rKykKLQkJYyB8PSAqaW4gPDwgajsKLQkgICAgKm91dCA9IGMgJiAweGZmOwotCX0KLX0KLQotYm9vbAotRGVzU2V0a2V5KGtleSkKLXVfY2hhciAqa2V5OwotewotCXVfY2hhciBkZXNfa2V5WzhdOwotCXVfY2hhciBjcnlwdF9rZXlbNjZdOwotCi0JTWFrZUtleShrZXksIGRlc19rZXkpOwotCUV4cGFuZChkZXNfa2V5LCBjcnlwdF9rZXkpOwotCWVycm5vID0gMDsKLQlzZXRrZXkoKGNvbnN0IGNoYXIgKiljcnlwdF9rZXkpOwotCWlmIChlcnJubyAhPSAwKQotCQlyZXR1cm4gKDApOwotCXJldHVybiAoMSk7Ci19Ci0KLWJvb2wKLURlc0VuY3J5cHQoY2xlYXIsIGNpcGhlcikKLXVfY2hhciAqY2xlYXI7CS8qIElOICA4IG9jdGV0cyAqLwotdV9jaGFyICpjaXBoZXI7CS8qIE9VVCA4IG9jdGV0cyAqLwotewotCXVfY2hhciBkZXNfaW5wdXRbNjZdOwotCi0JRXhwYW5kKGNsZWFyLCBkZXNfaW5wdXQpOwotCWVycm5vID0gMDsKLQllbmNyeXB0KChjaGFyICopZGVzX2lucHV0LCAwKTsKLQlpZiAoZXJybm8gIT0gMCkKLQkJcmV0dXJuICgwKTsKLQlDb2xsYXBzZShkZXNfaW5wdXQsIGNpcGhlcik7Ci0JcmV0dXJuICgxKTsKLX0KLQotYm9vbAotRGVzRGVjcnlwdChjaXBoZXIsIGNsZWFyKQotdV9jaGFyICpjaXBoZXI7CS8qIElOICA4IG9jdGV0cyAqLwotdV9jaGFyICpjbGVhcjsJLyogT1VUIDggb2N0ZXRzICovCi17Ci0JdV9jaGFyIGRlc19pbnB1dFs2Nl07Ci0KLQlFeHBhbmQoY2lwaGVyLCBkZXNfaW5wdXQpOwotCWVycm5vID0gMDsKLQllbmNyeXB0KChjaGFyICopZGVzX2lucHV0LCAxKTsKLQlpZiAoZXJybm8gIT0gMCkKLQkJcmV0dXJuICgwKTsKLQlDb2xsYXBzZShkZXNfaW5wdXQsIGNsZWFyKTsKLQlyZXR1cm4gKDEpOwotfQotCi0jZWxpZiBkZWZpbmVkKFVTRV9PUEVOU1NMKQotc3RhdGljIERFU19rZXlfc2NoZWR1bGUga2V5X3NjaGVkdWxlOwotCi1ib29sCi1EZXNTZXRrZXkoa2V5KQotdV9jaGFyICprZXk7Ci17Ci0JREVTX2NibG9jayBkZXNfa2V5OwotCU1ha2VLZXkoa2V5LCAodV9jaGFyKikgJmRlc19rZXkpOwotCURFU19zZXRfa2V5KCZkZXNfa2V5LCAma2V5X3NjaGVkdWxlKTsKLQlyZXR1cm4gKDEpOwotfQotCi1ib29sCi1EZXNFbmNyeXB0KGNsZWFyLCBjaXBoZXIpCi11X2NoYXIgKmNsZWFyOwkvKiBJTiAgOCBvY3RldHMgKi8KLXVfY2hhciAqY2lwaGVyOwkvKiBPVVQgOCBvY3RldHMgKi8KLXsKLQlERVNfZWNiX2VuY3J5cHQoKERFU19jYmxvY2sgKiljbGVhciwgKERFU19jYmxvY2sgKiljaXBoZXIsCi0JICAgICZrZXlfc2NoZWR1bGUsIDEgLyogZW5jcnlwdCAqLyk7Ci0JcmV0dXJuICgxKTsKLX0KLQotYm9vbAotRGVzRGVjcnlwdChjaXBoZXIsIGNsZWFyKQotdV9jaGFyICpjaXBoZXI7CS8qIElOICA4IG9jdGV0cyAqLwotdV9jaGFyICpjbGVhcjsJLyogT1VUIDggb2N0ZXRzICovCi17Ci0JREVTX2VjYl9lbmNyeXB0KChERVNfY2Jsb2NrICopY2lwaGVyLCAoREVTX2NibG9jayAqKWNsZWFyLAotCSAgICAma2V5X3NjaGVkdWxlLCAwIC8qIGRlY3J5cHQgKi8pOwotCXJldHVybiAoMSk7Ci19Ci0KLSNlbGlmIGRlZmluZWQoVVNFX0xJQkRFUykKLXN0YXRpYyBkZXNfa2V5X3NjaGVkdWxlCWtleV9zY2hlZHVsZTsKLQotYm9vbAotRGVzU2V0a2V5KGtleSkKLXVfY2hhciAqa2V5OwotewotCWRlc19jYmxvY2sgZGVzX2tleTsKLQlNYWtlS2V5KGtleSwgZGVzX2tleSk7Ci0JZGVzX3NldF9rZXkoJmRlc19rZXksIGtleV9zY2hlZHVsZSk7Ci0JcmV0dXJuICgxKTsKLX0KLQotYm9vbAotI2lmIGRlZmluZWQoX19BTkRST0lEX18pCi1EZXNFbmNyeXB0KGNsZWFyLCBjaXBoZXIpCi0jZWxzZQotRGVzRW5jcnlwdChjbGVhciwga2V5LCBjaXBoZXIpCi0jZW5kaWYKLXVfY2hhciAqY2xlYXI7CS8qIElOICA4IG9jdGV0cyAqLwotdV9jaGFyICpjaXBoZXI7CS8qIE9VVCA4IG9jdGV0cyAqLwotewotCWRlc19lY2JfZW5jcnlwdCgoZGVzX2NibG9jayAqKWNsZWFyLCAoZGVzX2NibG9jayAqKWNpcGhlciwKLQkgICAga2V5X3NjaGVkdWxlLCAxKTsKLQlyZXR1cm4gKDEpOwotfQotCi1ib29sCi1EZXNEZWNyeXB0KGNpcGhlciwgY2xlYXIpCi11X2NoYXIgKmNpcGhlcjsJLyogSU4gIDggb2N0ZXRzICovCi11X2NoYXIgKmNsZWFyOwkvKiBPVVQgOCBvY3RldHMgKi8KLXsKLQlkZXNfZWNiX2VuY3J5cHQoKGRlc19jYmxvY2sgKiljaXBoZXIsIChkZXNfY2Jsb2NrICopY2xlYXIsCi0JICAgIGtleV9zY2hlZHVsZSwgMCk7Ci0JcmV0dXJuICgxKTsKLX0KLQotI2Vsc2UKLQotI2Vycm9yICJNdXN0IGRlZmluZSBvbmUgb2YgVVNFX0NSWVBULCBVU0VfTElCREVTIG9yIFVTRV9PUEVOU1NMIgotCi0jZW5kaWYgLyogVVNFX0NSWVBUICovCmRpZmYgLS1naXQgYS9wcHBkL3BwcGNyeXB0LmggYi9wcHBkL3BwcGNyeXB0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZGVjY2QuLjAwMDAwMDAKLS0tIGEvcHBwZC9wcHBjcnlwdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIHBwcGNyeXB0LmMgLSBQUFAvREVTIGxpbmthZ2UgZm9yIE1TLUNIQVAgYW5kIEVBUCBTUlAtU0hBMQotICoKLSAqIEV4dHJhY3RlZCBmcm9tIGNoYXBfbXMuYyBieSBKYW1lcyBDYXJsc29uLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NSBFcmljIFJvc2VucXVpc3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBuYW1lKHMpIG9mIHRoZSBhdXRob3JzIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSEUgQVVUSE9SUyBPRiBUSElTIFNPRlRXQVJFIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi0gKiBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLSAqIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLSAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLSAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpZm5kZWYgUFBQQ1JZUFRfSAotI2RlZmluZQlQUFBDUllQVF9ICi0KLWV4dGVybiBib29sCURlc1NldGtleSBfX1AoKHVfY2hhciAqKSk7Ci1leHRlcm4gYm9vbAlEZXNFbmNyeXB0IF9fUCgodV9jaGFyICosIHVfY2hhciAqKSk7Ci1leHRlcm4gYm9vbAlEZXNEZWNyeXB0IF9fUCgodV9jaGFyICosIHVfY2hhciAqKSk7Ci0KLSNlbmRpZiAvKiBQUFBDUllQVF9IICovCmRpZmYgLS1naXQgYS9wcHBkL3BwcGQuOCBiL3BwcGQvcHBwZC44CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGFhZDk1Li4wMDAwMDAwCi0tLSBhL3BwcGQvcHBwZC44CisrKyAvZGV2L251bGwKQEAgLTEsMTk3MiArMCwwIEBACi0uXCIgbWFudWFsIHBhZ2UgW10gZm9yIHBwcGQgMi40Ci0uXCIgJElkOiBwcHBkLjgsdiAxLjkwIDIwMDgvMDMvMjYgMTI6MDk6NDAgcGF1bHVzIEV4cCAkCi0uXCIgU0ggc2VjdGlvbiBoZWFkaW5nCi0uXCIgU1Mgc3Vic2VjdGlvbiBoZWFkaW5nCi0uXCIgTFAgcGFyYWdyYXBoCi0uXCIgSVAgaW5kZW50ZWQgcGFyYWdyYXBoCi0uXCIgVFAgaGFuZ2luZyBsYWJlbAotLlwiIAotLlwiIENvcHlyaWdodCAoYykgMTk5My0yMDAzIFBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPgotLlwiCi0uXCIgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0uXCIgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotLlwiIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0uXCIKLS5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1JTIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTCi0uXCIgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0uXCIgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotLlwiIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotLlwiIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0uXCIgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLS5cIgotLlRIIFBQUEQgOAotLlNIIE5BTUUKLXBwcGQgXC0gUG9pbnQtdG8tUG9pbnQgUHJvdG9jb2wgRGFlbW9uCi0uU0ggU1lOT1BTSVMKLS5CIHBwcGQKLVsKLS5JIG9wdGlvbnMKLV0KLS5TSCBERVNDUklQVElPTgotLkxQCi1QUFAgaXMgdGhlIHByb3RvY29sIHVzZWQgZm9yIGVzdGFibGlzaGluZyBpbnRlcm5ldCBsaW5rcyBvdmVyIGRpYWwtdXAKLW1vZGVtcywgRFNMIGNvbm5lY3Rpb25zLCBhbmQgbWFueSBvdGhlciB0eXBlcyBvZiBwb2ludC10by1wb2ludAotbGlua3MuICBUaGUgXGZJcHBwZFxmUiBkYWVtb24gd29ya3MgdG9nZXRoZXIgd2l0aCB0aGUga2VybmVsIFBQUAotZHJpdmVyIHRvIGVzdGFibGlzaCBhbmQgbWFpbnRhaW4gYSBQUFAgbGluayB3aXRoIGFub3RoZXIgc3lzdGVtCi0oY2FsbGVkIHRoZSBcZklwZWVyXGZSKSBhbmQgdG8gbmVnb3RpYXRlIEludGVybmV0IFByb3RvY29sIChJUCkKLWFkZHJlc3NlcyBmb3IgZWFjaCBlbmQgb2YgdGhlIGxpbmsuICBQcHBkIGNhbiBhbHNvIGF1dGhlbnRpY2F0ZSB0aGUKLXBlZXIgYW5kL29yIHN1cHBseSBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiB0byB0aGUgcGVlci4gIFBQUCBjYW4gYmUKLXVzZWQgd2l0aCBvdGhlciBuZXR3b3JrIHByb3RvY29scyBiZXNpZGVzIElQLCBidXQgc3VjaCB1c2UgaXMgYmVjb21pbmcKLWluY3JlYXNpbmdseSByYXJlLgotLlNIIEZSRVFVRU5UTFkgVVNFRCBPUFRJT05TCi0uVFAKLS5JIHR0eW5hbWUKLVVzZSB0aGUgc2VyaWFsIHBvcnQgY2FsbGVkIFxmSXR0eW5hbWVcZlIgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUKLXBlZXIuICBJZiBcZkl0dHluYW1lXGZSIGRvZXMgbm90IGJlZ2luIHdpdGggYSBzbGFzaCAoLyksCi10aGUgc3RyaW5nICIvZGV2LyIgaXMgcHJlcGVuZGVkIHRvIFxmSXR0eW5hbWVcZlIgdG8gZm9ybSB0aGUKLW5hbWUgb2YgdGhlIGRldmljZSB0byBvcGVuLiAgSWYgbm8gZGV2aWNlIG5hbWUgaXMgZ2l2ZW4sIG9yIGlmIHRoZQotbmFtZSBvZiB0aGUgdGVybWluYWwKLWNvbm5lY3RlZCB0byB0aGUgc3RhbmRhcmQgaW5wdXQgaXMgZ2l2ZW4sIHBwcGQgd2lsbCB1c2UgdGhhdCB0ZXJtaW5hbCwKLWFuZCB3aWxsIG5vdCBmb3JrIHRvIHB1dCBpdHNlbGYgaW4gdGhlIGJhY2tncm91bmQuICBBIHZhbHVlIGZvciB0aGlzCi1vcHRpb24gZnJvbSBhIHByaXZpbGVnZWQgc291cmNlIGNhbm5vdCBiZSBvdmVycmlkZGVuIGJ5IGEKLW5vbi1wcml2aWxlZ2VkIHVzZXIuCi0uVFAKLS5JIHNwZWVkCi1BbiBvcHRpb24gdGhhdCBpcyBhIGRlY2ltYWwgbnVtYmVyIGlzIHRha2VuIGFzIHRoZSBkZXNpcmVkIGJhdWQgcmF0ZQotZm9yIHRoZSBzZXJpYWwgZGV2aWNlLiAgT24gc3lzdGVtcyBzdWNoIGFzCi00LjRCU0QgYW5kIE5ldEJTRCwgYW55IHNwZWVkIGNhbiBiZSBzcGVjaWZpZWQuICBPdGhlciBzeXN0ZW1zCi0oZS5nLiBMaW51eCwgU3VuT1MpIG9ubHkgc3VwcG9ydCB0aGUgY29tbW9ubHktdXNlZCBiYXVkIHJhdGVzLgotLlRQCi0uQiBhc3luY21hcCBcZkltYXAKLVRoaXMgb3B0aW9uIHNldHMgdGhlIEFzeW5jLUNvbnRyb2wtQ2hhcmFjdGVyLU1hcCAoQUNDTSkgZm9yIHRoaXMgZW5kCi1vZiB0aGUgbGluay4gIFRoZSBBQ0NNIGlzIGEgc2V0IG9mIDMyIGJpdHMsIG9uZSBmb3IgZWFjaCBvZiB0aGUKLUFTQ0lJIGNvbnRyb2wgY2hhcmFjdGVycyB3aXRoIHZhbHVlcyBmcm9tIDAgdG8gMzEsIHdoZXJlIGEgMSBiaXQKLWluZGljYXRlcyB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIGNvbnRyb2wgY2hhcmFjdGVyIHNob3VsZCBub3QgYmUgdXNlZAotaW4gUFBQIHBhY2tldHMgc2VudCB0byB0aGlzIHN5c3RlbS4gIFRoZSBtYXAgaXMgZW5jb2RlZCBhcyBhCi1oZXhhZGVjaW1hbCBudW1iZXIgKHdpdGhvdXQgYSBsZWFkaW5nIDB4KSB3aGVyZSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQKLWJpdCAoMDAwMDAwMDEpIHJlcHJlc2VudHMgY2hhcmFjdGVyIDAgYW5kIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdAotKDgwMDAwMDAwKSByZXByZXNlbnRzIGNoYXJhY3RlciAzMS4KLVBwcGQgd2lsbCBhc2sgdGhlIHBlZXIgdG8gc2VuZCB0aGVzZSBjaGFyYWN0ZXJzIGFzIGEgMi1ieXRlCi1lc2NhcGUgc2VxdWVuY2UuCi1JZiBtdWx0aXBsZSBcZklhc3luY21hcFxmUiBvcHRpb25zIGFyZSBnaXZlbiwgdGhlIHZhbHVlcyBhcmUgT1JlZAotdG9nZXRoZXIuICBJZiBubyBcZklhc3luY21hcFxmUiBvcHRpb24gaXMgZ2l2ZW4sIHRoZSBkZWZhdWx0IGlzIHplcm8sCi1zbyBwcHBkIHdpbGwgYXNrIHRoZSBwZWVyIG5vdCB0byBlc2NhcGUgYW55IGNvbnRyb2wgY2hhcmFjdGVycy4KLVRvIGVzY2FwZSB0cmFuc21pdHRlZCBjaGFyYWN0ZXJzLCB1c2UgdGhlIFxmSWVzY2FwZVxmUiBvcHRpb24uCi0uVFAKLS5CIGF1dGgKLVJlcXVpcmUgdGhlIHBlZXIgdG8gYXV0aGVudGljYXRlIGl0c2VsZiBiZWZvcmUgYWxsb3dpbmcgbmV0d29yawotcGFja2V0cyB0byBiZSBzZW50IG9yIHJlY2VpdmVkLiAgVGhpcyBvcHRpb24gaXMgdGhlIGRlZmF1bHQgaWYgdGhlCi1zeXN0ZW0gaGFzIGEgZGVmYXVsdCByb3V0ZS4gIElmIG5laXRoZXIgdGhpcyBvcHRpb24gbm9yIHRoZQotXGZJbm9hdXRoXGZSIG9wdGlvbiBpcyBzcGVjaWZpZWQsIHBwcGQgd2lsbCBvbmx5IGFsbG93IHRoZSBwZWVyIHRvIHVzZQotSVAgYWRkcmVzc2VzIHRvIHdoaWNoIHRoZSBzeXN0ZW0gZG9lcyBub3QgYWxyZWFkeSBoYXZlIGEgcm91dGUuCi0uVFAKLS5CIGNhbGwgXGZJbmFtZQotUmVhZCBhZGRpdGlvbmFsIG9wdGlvbnMgZnJvbSB0aGUgZmlsZSAvZXRjL3BwcC9wZWVycy9cZkluYW1lXGZSLiAgVGhpcwotZmlsZSBtYXkgY29udGFpbiBwcml2aWxlZ2VkIG9wdGlvbnMsIHN1Y2ggYXMgXGZJbm9hdXRoXGZSLCBldmVuIGlmIHBwcGQKLWlzIG5vdCBiZWluZyBydW4gYnkgcm9vdC4gIFRoZSBcZkluYW1lXGZSIHN0cmluZyBtYXkgbm90IGJlZ2luIHdpdGggLwotb3IgaW5jbHVkZSAuLiBhcyBhIHBhdGhuYW1lIGNvbXBvbmVudC4gIFRoZSBmb3JtYXQgb2YgdGhlIG9wdGlvbnMgZmlsZQotaXMgZGVzY3JpYmVkIGJlbG93LgotLlRQCi0uQiBjb25uZWN0IFxmSXNjcmlwdAotVXN1YWxseSB0aGVyZSBpcyBzb21ldGhpbmcgd2hpY2ggbmVlZHMgdG8gYmUgZG9uZSB0byBwcmVwYXJlIHRoZSBsaW5rCi1iZWZvcmUgdGhlIFBQUCBwcm90b2NvbCBjYW4gYmUgc3RhcnRlZDsgZm9yIGluc3RhbmNlLCB3aXRoIGEgZGlhbC11cAotbW9kZW0sIGNvbW1hbmRzIG5lZWQgdG8gYmUgc2VudCB0byB0aGUgbW9kZW0gdG8gZGlhbCB0aGUgYXBwcm9wcmlhdGUKLXBob25lIG51bWJlci4gIFRoaXMgb3B0aW9uIHNwZWNpZmllcyBhbiBjb21tYW5kIGZvciBwcHBkIHRvIGV4ZWN1dGUKLShieSBwYXNzaW5nIGl0IHRvIGEgc2hlbGwpIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHN0YXJ0IFBQUCBuZWdvdGlhdGlvbi4KLVRoZSBjaGF0ICg4KSBwcm9ncmFtIGlzIG9mdGVuIHVzZWZ1bCBoZXJlLCBhcyBpdCBwcm92aWRlcyBhIHdheSB0bwotc2VuZCBhcmJpdHJhcnkgc3RyaW5ncyB0byBhIG1vZGVtIGFuZCByZXNwb25kIHRvIHJlY2VpdmVkIGNoYXJhY3RlcnMuCi1BIHZhbHVlCi1mb3IgdGhpcyBvcHRpb24gZnJvbSBhIHByaXZpbGVnZWQgc291cmNlIGNhbm5vdCBiZSBvdmVycmlkZGVuIGJ5IGEKLW5vbi1wcml2aWxlZ2VkIHVzZXIuCi0uVFAKLS5CIGNydHNjdHMKLVNwZWNpZmllcyB0aGF0IHBwcGQgc2hvdWxkIHNldCB0aGUgc2VyaWFsIHBvcnQgdG8gdXNlIGhhcmR3YXJlIGZsb3cKLWNvbnRyb2wgdXNpbmcgdGhlIFJUUyBhbmQgQ1RTIHNpZ25hbHMgaW4gdGhlIFJTLTIzMiBpbnRlcmZhY2UuCi1JZiBuZWl0aGVyIHRoZSBcZkljcnRzY3RzXGZSLCB0aGUKLVxmSW5vY3J0c2N0c1xmUiwgdGhlIFxmSWNkdHJjdHNcZlIgbm9yIHRoZSBcZklub2NkdHJjdHNcZlIgb3B0aW9uCi1pcyBnaXZlbiwgdGhlIGhhcmR3YXJlIGZsb3cgY29udHJvbCBzZXR0aW5nIGZvciB0aGUgc2VyaWFsIHBvcnQgaXMKLWxlZnQgdW5jaGFuZ2VkLgotU29tZSBzZXJpYWwgcG9ydHMgKHN1Y2ggYXMgTWFjaW50b3NoIHNlcmlhbCBwb3J0cykgbGFjayBhIHRydWUKLVJUUyBvdXRwdXQuIFN1Y2ggc2VyaWFsIHBvcnRzIHVzZSB0aGlzIG1vZGUgdG8gaW1wbGVtZW50Ci11bmlkaXJlY3Rpb25hbCBmbG93IGNvbnRyb2wuIFRoZSBzZXJpYWwgcG9ydCB3aWxsCi1zdXNwZW5kIHRyYW5zbWlzc2lvbiB3aGVuIHJlcXVlc3RlZCBieSB0aGUgbW9kZW0gKHZpYSBDVFMpCi1idXQgd2lsbCBiZSB1bmFibGUgdG8gcmVxdWVzdCB0aGUgbW9kZW0gdG8gc3RvcCBzZW5kaW5nIHRvIHRoZQotY29tcHV0ZXIuIFRoaXMgbW9kZSByZXRhaW5zIHRoZSBhYmlsaXR5IHRvIHVzZSBEVFIgYXMKLWEgbW9kZW0gY29udHJvbCBsaW5lLgotLlRQCi0uQiBkZWZhdWx0cm91dGUKLUFkZCBhIGRlZmF1bHQgcm91dGUgdG8gdGhlIHN5c3RlbSByb3V0aW5nIHRhYmxlcywgdXNpbmcgdGhlIHBlZXIgYXMKLXRoZSBnYXRld2F5LCB3aGVuIElQQ1AgbmVnb3RpYXRpb24gaXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC4KLVRoaXMgZW50cnkgaXMgcmVtb3ZlZCB3aGVuIHRoZSBQUFAgY29ubmVjdGlvbiBpcyBicm9rZW4uICBUaGlzIG9wdGlvbgotaXMgcHJpdmlsZWdlZCBpZiB0aGUgXGZJbm9kZWZhdWx0cm91dGVcZlIgb3B0aW9uIGhhcyBiZWVuIHNwZWNpZmllZC4KLS5UUAotLkIgZGlzY29ubmVjdCBcZklzY3JpcHQKLUV4ZWN1dGUgdGhlIGNvbW1hbmQgc3BlY2lmaWVkIGJ5IFxmSXNjcmlwdFxmUiwgYnkgcGFzc2luZyBpdCB0byBhCi1zaGVsbCwgYWZ0ZXIKLXBwcGQgaGFzIHRlcm1pbmF0ZWQgdGhlIGxpbmsuICBUaGlzIGNvbW1hbmQgY291bGQsIGZvciBleGFtcGxlLCBpc3N1ZQotY29tbWFuZHMgdG8gdGhlIG1vZGVtIHRvIGNhdXNlIGl0IHRvIGhhbmcgdXAgaWYgaGFyZHdhcmUgbW9kZW0gY29udHJvbAotc2lnbmFscyB3ZXJlIG5vdCBhdmFpbGFibGUuICBUaGUgZGlzY29ubmVjdCBzY3JpcHQgaXMgbm90IHJ1biBpZiB0aGUKLW1vZGVtIGhhcyBhbHJlYWR5IGh1bmcgdXAuICBBIHZhbHVlIGZvciB0aGlzIG9wdGlvbiBmcm9tIGEgcHJpdmlsZWdlZAotc291cmNlIGNhbm5vdCBiZSBvdmVycmlkZGVuIGJ5IGEgbm9uLXByaXZpbGVnZWQgdXNlci4KLS5UUAotLkIgZXNjYXBlIFxmSXh4LHl5LC4uLgotU3BlY2lmaWVzIHRoYXQgY2VydGFpbiBjaGFyYWN0ZXJzIHNob3VsZCBiZSBlc2NhcGVkIG9uIHRyYW5zbWlzc2lvbgotKHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcGVlciByZXF1ZXN0cyB0aGVtIHRvIGJlIGVzY2FwZWQgd2l0aCBpdHMKLWFzeW5jIGNvbnRyb2wgY2hhcmFjdGVyIG1hcCkuICBUaGUgY2hhcmFjdGVycyB0byBiZSBlc2NhcGVkIGFyZQotc3BlY2lmaWVkIGFzIGEgbGlzdCBvZiBoZXggbnVtYmVycyBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgTm90ZSB0aGF0Ci1hbG1vc3QgYW55IGNoYXJhY3RlciBjYW4gYmUgc3BlY2lmaWVkIGZvciB0aGUgXGZJZXNjYXBlXGZSIG9wdGlvbiwKLXVubGlrZSB0aGUgXGZJYXN5bmNtYXBcZlIgb3B0aW9uIHdoaWNoIG9ubHkgYWxsb3dzIGNvbnRyb2wgY2hhcmFjdGVycwotdG8gYmUgc3BlY2lmaWVkLiAgVGhlIGNoYXJhY3RlcnMgd2hpY2ggbWF5IG5vdCBiZSBlc2NhcGVkIGFyZSB0aG9zZQotd2l0aCBoZXggdmFsdWVzIDB4MjAgLSAweDNmIG9yIDB4NWUuCi0uVFAKLS5CIGZpbGUgXGZJbmFtZQotUmVhZCBvcHRpb25zIGZyb20gZmlsZSBcZkluYW1lXGZSICh0aGUgZm9ybWF0IGlzIGRlc2NyaWJlZCBiZWxvdykuCi1UaGUgZmlsZSBtdXN0IGJlIHJlYWRhYmxlIGJ5IHRoZSB1c2VyIHdobyBoYXMgaW52b2tlZCBwcHBkLgotLlRQCi0uQiBpbml0IFxmSXNjcmlwdAotRXhlY3V0ZSB0aGUgY29tbWFuZCBzcGVjaWZpZWQgYnkgXGZJc2NyaXB0XGZSLCBieSBwYXNzaW5nIGl0IHRvIGEgc2hlbGwsIHRvCi1pbml0aWFsaXplIHRoZSBzZXJpYWwgbGluZS4gIFRoaXMgc2NyaXB0IHdvdWxkIHR5cGljYWxseSB1c2UgdGhlCi1jaGF0KDgpIHByb2dyYW0gdG8gY29uZmlndXJlIHRoZSBtb2RlbSB0byBlbmFibGUgYXV0byBhbnN3ZXIuICBBIHZhbHVlCi1mb3IgdGhpcyBvcHRpb24gZnJvbSBhIHByaXZpbGVnZWQgc291cmNlIGNhbm5vdCBiZSBvdmVycmlkZGVuIGJ5IGEKLW5vbi1wcml2aWxlZ2VkIHVzZXIuCi0uVFAKLS5CIGxvY2sKLVNwZWNpZmllcyB0aGF0IHBwcGQgc2hvdWxkIGNyZWF0ZSBhIFVVQ1Atc3R5bGUgbG9jayBmaWxlIGZvciB0aGUKLXNlcmlhbCBkZXZpY2UgdG8gZW5zdXJlIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIGRldmljZS4gIEJ5IGRlZmF1bHQsCi1wcHBkIHdpbGwgbm90IGNyZWF0ZSBhIGxvY2sgZmlsZS4KLS5UUAotLkIgbXJ1IFxmSW4KLVNldCB0aGUgTVJVIFtNYXhpbXVtIFJlY2VpdmUgVW5pdF0gdmFsdWUgdG8gXGZJblxmUi4gUHBwZAotd2lsbCBhc2sgdGhlIHBlZXIgdG8gc2VuZCBwYWNrZXRzIG9mIG5vIG1vcmUgdGhhbiBcZkluXGZSIGJ5dGVzLgotVGhlIHZhbHVlIG9mIFxmSW5cZlIgbXVzdCBiZSBiZXR3ZWVuIDEyOCBhbmQgMTYzODQ7IHRoZSBkZWZhdWx0IGlzIDE1MDAuCi1BIHZhbHVlIG9mCi0yOTYgd29ya3Mgd2VsbCBvbiB2ZXJ5IHNsb3cgbGlua3MgKDQwIGJ5dGVzIGZvciBUQ1AvSVAgaGVhZGVyICsgMjU2Ci1ieXRlcyBvZiBkYXRhKS4KLU5vdGUgdGhhdCBmb3IgdGhlIElQdjYgcHJvdG9jb2wsIHRoZSBNUlUgbXVzdCBiZSBhdCBsZWFzdCAxMjgwLgotLlRQCi0uQiBtdHUgXGZJbgotU2V0IHRoZSBNVFUgW01heGltdW0gVHJhbnNtaXQgVW5pdF0gdmFsdWUgdG8gXGZJblxmUi4gIFVubGVzcyB0aGUKLXBlZXIgcmVxdWVzdHMgYSBzbWFsbGVyIHZhbHVlIHZpYSBNUlUgbmVnb3RpYXRpb24sIHBwcGQgd2lsbAotcmVxdWVzdCB0aGF0IHRoZSBrZXJuZWwgbmV0d29ya2luZyBjb2RlIHNlbmQgZGF0YSBwYWNrZXRzIG9mIG5vIG1vcmUKLXRoYW4gXGZJblxmUiBieXRlcyB0aHJvdWdoIHRoZSBQUFAgbmV0d29yayBpbnRlcmZhY2UuICBOb3RlIHRoYXQgZm9yIAotdGhlIElQdjYgcHJvdG9jb2wsIHRoZSBNVFUgbXVzdCBiZSBhdCBsZWFzdCAxMjgwLgotLlRQCi0uQiBwYXNzaXZlCi1FbmFibGVzIHRoZSAicGFzc2l2ZSIgb3B0aW9uIGluIHRoZSBMQ1AuICBXaXRoIHRoaXMgb3B0aW9uLCBwcHBkIHdpbGwKLWF0dGVtcHQgdG8gaW5pdGlhdGUgYSBjb25uZWN0aW9uOyBpZiBubyByZXBseSBpcyByZWNlaXZlZCBmcm9tIHRoZQotcGVlciwgcHBwZCB3aWxsIHRoZW4ganVzdCB3YWl0IHBhc3NpdmVseSBmb3IgYSB2YWxpZCBMQ1AgcGFja2V0IGZyb20KLXRoZSBwZWVyLCBpbnN0ZWFkIG9mIGV4aXRpbmcsIGFzIGl0IHdvdWxkIHdpdGhvdXQgdGhpcyBvcHRpb24uCi0uU0ggT1BUSU9OUwotLlRQCi0uSSA8bG9jYWxfSVBfYWRkcmVzcz5cZkI6XGZJPHJlbW90ZV9JUF9hZGRyZXNzPgotU2V0IHRoZSBsb2NhbCBhbmQvb3IgcmVtb3RlIGludGVyZmFjZSBJUCBhZGRyZXNzZXMuICBFaXRoZXIgb25lIG1heSBiZQotb21pdHRlZC4gIFRoZSBJUCBhZGRyZXNzZXMgY2FuIGJlIHNwZWNpZmllZCB3aXRoIGEgaG9zdCBuYW1lIG9yIGluCi1kZWNpbWFsIGRvdCBub3RhdGlvbiAoZS5nLiAxNTAuMjM0LjU2Ljc4KS4gIFRoZSBkZWZhdWx0IGxvY2FsCi1hZGRyZXNzIGlzIHRoZSAoZmlyc3QpIElQIGFkZHJlc3Mgb2YgdGhlIHN5c3RlbSAodW5sZXNzIHRoZQotXGZJbm9pcGRlZmF1bHRcZlIKLW9wdGlvbiBpcyBnaXZlbikuICBUaGUgcmVtb3RlIGFkZHJlc3Mgd2lsbCBiZSBvYnRhaW5lZCBmcm9tIHRoZSBwZWVyCi1pZiBub3Qgc3BlY2lmaWVkIGluIGFueSBvcHRpb24uICBUaHVzLCBpbiBzaW1wbGUgY2FzZXMsIHRoaXMgb3B0aW9uIGlzCi1ub3QgcmVxdWlyZWQuICBJZiBhIGxvY2FsIGFuZC9vciByZW1vdGUgSVAgYWRkcmVzcyBpcyBzcGVjaWZpZWQgd2l0aAotdGhpcyBvcHRpb24sIHBwcGQKLXdpbGwgbm90IGFjY2VwdCBhIGRpZmZlcmVudCB2YWx1ZSBmcm9tIHRoZSBwZWVyIGluIHRoZSBJUENQCi1uZWdvdGlhdGlvbiwgdW5sZXNzIHRoZSBcZklpcGNwXC1hY2NlcHRcLWxvY2FsXGZSIGFuZC9vcgotXGZJaXBjcFwtYWNjZXB0XC1yZW1vdGVcZlIgb3B0aW9ucyBhcmUgZ2l2ZW4sIHJlc3BlY3RpdmVseS4KLS5UUAotLkIgK2lwdjYKLUVuYWJsZSB0aGUgSVB2NkNQIGFuZCBJUHY2IHByb3RvY29scy4KLS5UUAotLkIgaXB2NiBcZkk8bG9jYWxfaW50ZXJmYWNlX2lkZW50aWZpZXI+XGZSLFxmSTxyZW1vdGVfaW50ZXJmYWNlX2lkZW50aWZpZXI+Ci1TZXQgdGhlIGxvY2FsIGFuZC9vciByZW1vdGUgNjQtYml0IGludGVyZmFjZSBpZGVudGlmaWVyLiBFaXRoZXIgb25lIG1heSBiZQotb21pdHRlZC4gVGhlIGlkZW50aWZpZXIgbXVzdCBiZSBzcGVjaWZpZWQgaW4gc3RhbmRhcmQgQVNDSUkgbm90YXRpb24gb2YKLUlQdjYgYWRkcmVzc2VzIChlLmcuIDo6ZGVhZDpiZWVmKS4gSWYgdGhlCi1cZklpcHY2Y3BcLXVzZVwtaXBhZGRyXGZSCi1vcHRpb24gaXMgZ2l2ZW4sIHRoZSBsb2NhbCBpZGVudGlmaWVyIGlzIHRoZSBsb2NhbCBJUHY0IGFkZHJlc3MgKHNlZSBhYm92ZSkuCi1PbiBzeXN0ZW1zIHdoaWNoIHN1cHBvcnRzIGEgdW5pcXVlIHBlcnNpc3RlbnQgaWQsIHN1Y2ggYXMgRVVJXC00OCBkZXJpdmVkCi1mcm9tIHRoZSBFdGhlcm5ldCBNQUMgYWRkcmVzcywgXGZJaXB2NmNwXC11c2VcLXBlcnNpc3RlbnRcZlIgb3B0aW9uIGNhbiBiZQotdXNlZCB0byByZXBsYWNlIHRoZSBcZklpcHY2IDxsb2NhbD4sPHJlbW90ZT5cZlIgb3B0aW9uLiBPdGhlcndpc2UgdGhlIAotaWRlbnRpZmllciBpcyByYW5kb21pemVkLgotLlRQCi0uQiBhY3RpdmVcLWZpbHRlciBcZklmaWx0ZXJcLWV4cHJlc3Npb24KLVNwZWNpZmllcyBhIHBhY2tldCBmaWx0ZXIgdG8gYmUgYXBwbGllZCB0byBkYXRhIHBhY2tldHMgdG8gZGV0ZXJtaW5lCi13aGljaCBwYWNrZXRzIGFyZSB0byBiZSByZWdhcmRlZCBhcyBsaW5rIGFjdGl2aXR5LCBhbmQgdGhlcmVmb3JlIHJlc2V0Ci10aGUgaWRsZSB0aW1lciwgb3IgY2F1c2UgdGhlIGxpbmsgdG8gYmUgYnJvdWdodCB1cCBpbiBkZW1hbmQtZGlhbGxpbmcKLW1vZGUuICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKLVxmQmlkbGVcZlIgb3B0aW9uIGlmIHRoZXJlIGFyZSBwYWNrZXRzIGJlaW5nIHNlbnQgb3IgcmVjZWl2ZWQKLXJlZ3VsYXJseSBvdmVyIHRoZSBsaW5rIChmb3IgZXhhbXBsZSwgcm91dGluZyBpbmZvcm1hdGlvbiBwYWNrZXRzKQotd2hpY2ggd291bGQgb3RoZXJ3aXNlIHByZXZlbnQgdGhlIGxpbmsgZnJvbSBldmVyIGFwcGVhcmluZyB0byBiZSBpZGxlLgotVGhlIFxmSWZpbHRlclwtZXhwcmVzc2lvblxmUiBzeW50YXggaXMgYXMgZGVzY3JpYmVkIGZvciB0Y3BkdW1wKDEpLAotZXhjZXB0IHRoYXQgcXVhbGlmaWVycyB3aGljaCBhcmUgaW5hcHByb3ByaWF0ZSBmb3IgYSBQUFAgbGluaywgc3VjaCBhcwotXGZCZXRoZXJcZlIgYW5kIFxmQmFycFxmUiwgYXJlIG5vdCBwZXJtaXR0ZWQuICBHZW5lcmFsbHkgdGhlIGZpbHRlcgotZXhwcmVzc2lvbiBzaG91bGQgYmUgZW5jbG9zZWQgaW4gc2luZ2xlLXF1b3RlcyB0byBwcmV2ZW50IHdoaXRlc3BhY2UKLWluIHRoZSBleHByZXNzaW9uIGZyb20gYmVpbmcgaW50ZXJwcmV0ZWQgYnkgdGhlIHNoZWxsLiBUaGlzIG9wdGlvbgotaXMgY3VycmVudGx5IG9ubHkgYXZhaWxhYmxlIHVuZGVyIExpbnV4LCBhbmQgcmVxdWlyZXMgdGhhdCB0aGUga2VybmVsCi13YXMgY29uZmlndXJlZCB0byBpbmNsdWRlIFBQUCBmaWx0ZXJpbmcgc3VwcG9ydCAoQ09ORklHX1BQUF9GSUxURVIpLgotTm90ZSB0aGF0IGl0Ci1pcyBwb3NzaWJsZSB0byBhcHBseSBkaWZmZXJlbnQgY29uc3RyYWludHMgdG8gaW5jb21pbmcgYW5kIG91dGdvaW5nCi1wYWNrZXRzIHVzaW5nIHRoZSBcZkJpbmJvdW5kXGZSIGFuZCBcZkJvdXRib3VuZFxmUiBxdWFsaWZpZXJzLgotLlRQCi0uQiBhbGxvd1wtaXAgXGZJYWRkcmVzcyhlcykKLUFsbG93IHBlZXJzIHRvIHVzZSB0aGUgZ2l2ZW4gSVAgYWRkcmVzcyBvciBzdWJuZXQgd2l0aG91dAotYXV0aGVudGljYXRpbmcgdGhlbXNlbHZlcy4gIFRoZSBwYXJhbWV0ZXIgaXMgcGFyc2VkIGFzIGZvciBlYWNoCi1lbGVtZW50IG9mIHRoZSBsaXN0IG9mIGFsbG93ZWQgSVAgYWRkcmVzc2VzIGluIHRoZSBzZWNyZXRzIGZpbGVzIChzZWUKLXRoZSBBVVRIRU5USUNBVElPTiBzZWN0aW9uIGJlbG93KS4KLS5UUAotLkIgYWxsb3dcLW51bWJlciBcZkludW1iZXIKLUFsbG93IHBlZXJzIHRvIGNvbm5lY3QgZnJvbSB0aGUgZ2l2ZW4gdGVsZXBob25lIG51bWJlci4gIEEgdHJhaWxpbmcKLWAqJyBjaGFyYWN0ZXIgd2lsbCBtYXRjaCBhbGwgbnVtYmVycyBiZWdpbm5pbmcgd2l0aCB0aGUgbGVhZGluZyBwYXJ0LgotLlRQCi0uQiBic2Rjb21wIFxmSW5yLG50Ci1SZXF1ZXN0IHRoYXQgdGhlIHBlZXIgY29tcHJlc3MgcGFja2V0cyB0aGF0IGl0IHNlbmRzLCB1c2luZyB0aGUKLUJTRC1Db21wcmVzcyBzY2hlbWUsIHdpdGggYSBtYXhpbXVtIGNvZGUgc2l6ZSBvZiBcZkluclxmUiBiaXRzLCBhbmQKLWFncmVlIHRvIGNvbXByZXNzIHBhY2tldHMgc2VudCB0byB0aGUgcGVlciB3aXRoIGEgbWF4aW11bSBjb2RlIHNpemUgb2YKLVxmSW50XGZSIGJpdHMuICBJZiBcZkludFxmUiBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byB0aGUgdmFsdWUKLWdpdmVuIGZvciBcZkluclxmUi4gIFZhbHVlcyBpbiB0aGUgcmFuZ2UgOSB0byAxNSBtYXkgYmUgdXNlZCBmb3IKLVxmSW5yXGZSIGFuZCBcZkludFxmUjsgbGFyZ2VyIHZhbHVlcyBnaXZlIGJldHRlciBjb21wcmVzc2lvbiBidXQKLWNvbnN1bWUgbW9yZSBrZXJuZWwgbWVtb3J5IGZvciBjb21wcmVzc2lvbiBkaWN0aW9uYXJpZXMuCi1BbHRlcm5hdGl2ZWx5LCBhIHZhbHVlIG9mIDAgZm9yIFxmSW5yXGZSIG9yIFxmSW50XGZSIGRpc2FibGVzCi1jb21wcmVzc2lvbiBpbiB0aGUgY29ycmVzcG9uZGluZyBkaXJlY3Rpb24uICBVc2UgXGZJbm9ic2Rjb21wXGZSIG9yCi1cZklic2Rjb21wIDBcZlIgdG8gZGlzYWJsZSBCU0QtQ29tcHJlc3MgY29tcHJlc3Npb24gZW50aXJlbHkuCi0uVFAKLS5CIGNkdHJjdHMKLVVzZSBhIG5vbi1zdGFuZGFyZCBoYXJkd2FyZSBmbG93IGNvbnRyb2wgKGkuZS4gRFRSL0NUUykgdG8gY29udHJvbAotdGhlIGZsb3cgb2YgZGF0YSBvbiB0aGUgc2VyaWFsIHBvcnQuICBJZiBuZWl0aGVyIHRoZSBcZkljcnRzY3RzXGZSLAotdGhlIFxmSW5vY3J0c2N0c1xmUiwgdGhlIFxmSWNkdHJjdHNcZlIgbm9yIHRoZSBcZklub2NkdHJjdHNcZlIKLW9wdGlvbiBpcyBnaXZlbiwgdGhlIGhhcmR3YXJlIGZsb3cgY29udHJvbCBzZXR0aW5nIGZvciB0aGUgc2VyaWFsCi1wb3J0IGlzIGxlZnQgdW5jaGFuZ2VkLgotU29tZSBzZXJpYWwgcG9ydHMgKHN1Y2ggYXMgTWFjaW50b3NoIHNlcmlhbCBwb3J0cykgbGFjayBhIHRydWUKLVJUUyBvdXRwdXQuIFN1Y2ggc2VyaWFsIHBvcnRzIHVzZSB0aGlzIG1vZGUgdG8gaW1wbGVtZW50IHRydWUKLWJpLWRpcmVjdGlvbmFsIGZsb3cgY29udHJvbC4gVGhlIHNhY3JpZmljZSBpcyB0aGF0IHRoaXMgZmxvdwotY29udHJvbCBtb2RlIGRvZXMgbm90IHBlcm1pdCB1c2luZyBEVFIgYXMgYSBtb2RlbSBjb250cm9sIGxpbmUuCi0uVFAKLS5CIGNoYXBcLWludGVydmFsIFxmSW4KLUlmIHRoaXMgb3B0aW9uIGlzIGdpdmVuLCBwcHBkIHdpbGwgcmVjaGFsbGVuZ2UgdGhlIHBlZXIgZXZlcnkgXGZJblxmUgotc2Vjb25kcy4KLS5UUAotLkIgY2hhcFwtbWF4XC1jaGFsbGVuZ2UgXGZJbgotU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBDSEFQIGNoYWxsZW5nZSB0cmFuc21pc3Npb25zIHRvIFxmSW5cZlIKLShkZWZhdWx0IDEwKS4KLS5UUAotLkIgY2hhcFwtcmVzdGFydCBcZkluCi1TZXQgdGhlIENIQVAgcmVzdGFydCBpbnRlcnZhbCAocmV0cmFuc21pc3Npb24gdGltZW91dCBmb3IgY2hhbGxlbmdlcykKLXRvIFxmSW5cZlIgc2Vjb25kcyAoZGVmYXVsdCAzKS4KLS5UUAotLkIgY2hpbGRcLXRpbWVvdXQgXGZJbgotV2hlbiBleGl0aW5nLCB3YWl0IGZvciB1cCB0byBcZkluXGZSIHNlY29uZHMgZm9yIGFueSBjaGlsZCBwcm9jZXNzZXMKLShzdWNoIGFzIHRoZSBjb21tYW5kIHNwZWNpZmllZCB3aXRoIHRoZSBcZkJwdHlcZlIgY29tbWFuZCkgdG8gZXhpdAotYmVmb3JlIGV4aXRpbmcuICBBdCB0aGUgZW5kIG9mIHRoZSB0aW1lb3V0LCBwcHBkIHdpbGwgc2VuZCBhIFNJR1RFUk0KLXNpZ25hbCB0byBhbnkgcmVtYWluaW5nIGNoaWxkIHByb2Nlc3NlcyBhbmQgZXhpdC4gIEEgdmFsdWUgb2YgMCBtZWFucwotbm8gdGltZW91dCwgdGhhdCBpcywgcHBwZCB3aWxsIHdhaXQgdW50aWwgYWxsIGNoaWxkIHByb2Nlc3NlcyBoYXZlCi1leGl0ZWQuCi0uVFAKLS5CIGNvbm5lY3RcLWRlbGF5IFxmSW4KLVdhaXQgZm9yIHVwIHRvIFxmSW5cZlIgbWlsbGlzZWNvbmRzIGFmdGVyIHRoZSBjb25uZWN0IHNjcmlwdCBmaW5pc2hlcyBmb3IKLWEgdmFsaWQgUFBQIHBhY2tldCBmcm9tIHRoZSBwZWVyLiAgQXQgdGhlIGVuZCBvZiB0aGlzIHRpbWUsIG9yIHdoZW4gYQotdmFsaWQgUFBQIHBhY2tldCBpcyByZWNlaXZlZCBmcm9tIHRoZSBwZWVyLCBwcHBkIHdpbGwgY29tbWVuY2UKLW5lZ290aWF0aW9uIGJ5IHNlbmRpbmcgaXRzIGZpcnN0IExDUCBwYWNrZXQuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcwotMTAwMCAoMSBzZWNvbmQpLiAgVGhpcyB3YWl0IHBlcmlvZCBvbmx5IGFwcGxpZXMgaWYgdGhlIFxmQmNvbm5lY3RcZlIKLW9yIFxmQnB0eVxmUiBvcHRpb24gaXMgdXNlZC4KLS5UUAotLkIgZGVidWcKLUVuYWJsZXMgY29ubmVjdGlvbiBkZWJ1Z2dpbmcgZmFjaWxpdGllcy4KLUlmIHRoaXMgb3B0aW9uIGlzIGdpdmVuLCBwcHBkIHdpbGwgbG9nIHRoZSBjb250ZW50cyBvZiBhbGwKLWNvbnRyb2wgcGFja2V0cyBzZW50IG9yIHJlY2VpdmVkIGluIGEgcmVhZGFibGUgZm9ybS4gIFRoZSBwYWNrZXRzIGFyZQotbG9nZ2VkIHRocm91Z2ggc3lzbG9nIHdpdGggZmFjaWxpdHkgXGZJZGFlbW9uXGZSIGFuZCBsZXZlbAotXGZJZGVidWdcZlIuICBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSBkaXJlY3RlZCB0byBhIGZpbGUgYnkgc2V0dGluZyB1cAotL2V0Yy9zeXNsb2cuY29uZiBhcHByb3ByaWF0ZWx5IChzZWUgc3lzbG9nLmNvbmYoNSkpLgotLlRQCi0uQiBkZWZhdWx0XC1hc3luY21hcAotRGlzYWJsZSBhc3luY21hcCBuZWdvdGlhdGlvbiwgZm9yY2luZyBhbGwgY29udHJvbCBjaGFyYWN0ZXJzIHRvIGJlCi1lc2NhcGVkIGZvciBib3RoIHRoZSB0cmFuc21pdCBhbmQgdGhlIHJlY2VpdmUgZGlyZWN0aW9uLgotLlRQCi0uQiBkZWZhdWx0XC1tcnUKLURpc2FibGUgTVJVIFtNYXhpbXVtIFJlY2VpdmUgVW5pdF0gbmVnb3RpYXRpb24uICBXaXRoIHRoaXMgb3B0aW9uLAotcHBwZCB3aWxsIHVzZSB0aGUgZGVmYXVsdCBNUlUgdmFsdWUgb2YgMTUwMCBieXRlcyBmb3IgYm90aCB0aGUKLXRyYW5zbWl0IGFuZCByZWNlaXZlIGRpcmVjdGlvbi4KLS5UUAotLkIgZGVmbGF0ZSBcZklucixudAotUmVxdWVzdCB0aGF0IHRoZSBwZWVyIGNvbXByZXNzIHBhY2tldHMgdGhhdCBpdCBzZW5kcywgdXNpbmcgdGhlCi1EZWZsYXRlIHNjaGVtZSwgd2l0aCBhIG1heGltdW0gd2luZG93IHNpemUgb2YgXGZJMioqbnJcZlIgYnl0ZXMsIGFuZAotYWdyZWUgdG8gY29tcHJlc3MgcGFja2V0cyBzZW50IHRvIHRoZSBwZWVyIHdpdGggYSBtYXhpbXVtIHdpbmRvdyBzaXplCi1vZiBcZkkyKipudFxmUiBieXRlcy4gIElmIFxmSW50XGZSIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvCi10aGUgdmFsdWUgZ2l2ZW4gZm9yIFxmSW5yXGZSLiAgVmFsdWVzIGluIHRoZSByYW5nZSA5IHRvIDE1IG1heSBiZSB1c2VkCi1mb3IgXGZJbnJcZlIgYW5kIFxmSW50XGZSOyBsYXJnZXIgdmFsdWVzIGdpdmUgYmV0dGVyIGNvbXByZXNzaW9uIGJ1dAotY29uc3VtZSBtb3JlIGtlcm5lbCBtZW1vcnkgZm9yIGNvbXByZXNzaW9uIGRpY3Rpb25hcmllcy4KLUFsdGVybmF0aXZlbHksIGEgdmFsdWUgb2YgMCBmb3IgXGZJbnJcZlIgb3IgXGZJbnRcZlIgZGlzYWJsZXMKLWNvbXByZXNzaW9uIGluIHRoZSBjb3JyZXNwb25kaW5nIGRpcmVjdGlvbi4gIFVzZSBcZklub2RlZmxhdGVcZlIgb3IKLVxmSWRlZmxhdGUgMFxmUiB0byBkaXNhYmxlIERlZmxhdGUgY29tcHJlc3Npb24gZW50aXJlbHkuICAoTm90ZTogcHBwZAotcmVxdWVzdHMgRGVmbGF0ZSBjb21wcmVzc2lvbiBpbiBwcmVmZXJlbmNlIHRvIEJTRC1Db21wcmVzcyBpZiB0aGUgcGVlcgotY2FuIGRvIGVpdGhlci4pCi0uVFAKLS5CIGRlbWFuZAotSW5pdGlhdGUgdGhlIGxpbmsgb25seSBvbiBkZW1hbmQsIGkuZS4gd2hlbiBkYXRhIHRyYWZmaWMgaXMgcHJlc2VudC4KLVdpdGggdGhpcyBvcHRpb24sIHRoZSByZW1vdGUgSVAgYWRkcmVzcyBtYXkgYmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyCi1vbiB0aGUgY29tbWFuZCBsaW5lIG9yIGluIGFuIG9wdGlvbnMgZmlsZSwgb3IgaWYgbm90LCBwcHBkIHdpbGwgdXNlCi1hbiBhcmJpdHJhcnkgYWRkcmVzcyBpbiB0aGUgMTAueC54LnggcmFuZ2UuICBQcHBkIHdpbGwgaW5pdGlhbGx5Ci1jb25maWd1cmUgdGhlIGludGVyZmFjZSBhbmQgZW5hYmxlIGl0IGZvciBJUCB0cmFmZmljIHdpdGhvdXQKLWNvbm5lY3RpbmcgdG8gdGhlIHBlZXIuICBXaGVuIHRyYWZmaWMgaXMgYXZhaWxhYmxlLCBwcHBkIHdpbGwKLWNvbm5lY3QgdG8gdGhlIHBlZXIgYW5kIHBlcmZvcm0gbmVnb3RpYXRpb24sIGF1dGhlbnRpY2F0aW9uLCBldGMuCi1XaGVuIHRoaXMgaXMgY29tcGxldGVkLCBwcHBkIHdpbGwgY29tbWVuY2UgcGFzc2luZyBkYXRhIHBhY2tldHMKLShpLmUuLCBJUCBwYWNrZXRzKSBhY3Jvc3MgdGhlIGxpbmsuCi0KLVRoZSBcZklkZW1hbmRcZlIgb3B0aW9uIGltcGxpZXMgdGhlIFxmSXBlcnNpc3RcZlIgb3B0aW9uLiAgSWYgdGhpcwotYmVoYXZpb3VyIGlzIG5vdCBkZXNpcmVkLCB1c2UgdGhlIFxmSW5vcGVyc2lzdFxmUiBvcHRpb24gYWZ0ZXIgdGhlCi1cZklkZW1hbmRcZlIgb3B0aW9uLiAgVGhlIFxmSWlkbGVcZlIgYW5kIFxmSWhvbGRvZmZcZlIKLW9wdGlvbnMgYXJlIGFsc28gdXNlZnVsIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFxmSWRlbWFuZFxmUiBvcHRpb24uCi0uVFAKLS5CIGRvbWFpbiBcZklkCi1BcHBlbmQgdGhlIGRvbWFpbiBuYW1lIFxmSWRcZlIgdG8gdGhlIGxvY2FsIGhvc3QgbmFtZSBmb3IgYXV0aGVudGljYXRpb24KLXB1cnBvc2VzLiAgRm9yIGV4YW1wbGUsIGlmIGdldGhvc3RuYW1lKCkgcmV0dXJucyB0aGUgbmFtZSBwb3JzY2hlLCBidXQKLXRoZSBmdWxseSBxdWFsaWZpZWQgZG9tYWluIG5hbWUgaXMgcG9yc2NoZS5RdW90cm9uLkNPTSwgeW91IGNvdWxkCi1zcGVjaWZ5IFxmSWRvbWFpbiBRdW90cm9uLkNPTVxmUi4gIFBwcGQgd291bGQgdGhlbiB1c2UgdGhlIG5hbWUKLVxmSXBvcnNjaGUuUXVvdHJvbi5DT01cZlIgZm9yIGxvb2tpbmcgdXAgc2VjcmV0cyBpbiB0aGUgc2VjcmV0cyBmaWxlLAotYW5kIGFzIHRoZSBkZWZhdWx0IG5hbWUgdG8gc2VuZCB0byB0aGUgcGVlciB3aGVuIGF1dGhlbnRpY2F0aW5nIGl0c2VsZgotdG8gdGhlIHBlZXIuICBUaGlzIG9wdGlvbiBpcyBwcml2aWxlZ2VkLgotLlRQCi0uQiBkcnlydW4KLVdpdGggdGhlIFxmQmRyeXJ1blxmUiBvcHRpb24sIHBwcGQgd2lsbCBwcmludCBvdXQgYWxsIHRoZSBvcHRpb24KLXZhbHVlcyB3aGljaCBoYXZlIGJlZW4gc2V0IGFuZCB0aGVuIGV4aXQsIGFmdGVyIHBhcnNpbmcgdGhlIGNvbW1hbmQKLWxpbmUgYW5kIG9wdGlvbnMgZmlsZXMgYW5kIGNoZWNraW5nIHRoZSBvcHRpb24gdmFsdWVzLCBidXQgYmVmb3JlCi1pbml0aWF0aW5nIHRoZSBsaW5rLiAgVGhlIG9wdGlvbiB2YWx1ZXMgYXJlIGxvZ2dlZCBhdCBsZXZlbCBpbmZvLCBhbmQKLWFsc28gcHJpbnRlZCB0byBzdGFuZGFyZCBvdXRwdXQgdW5sZXNzIHRoZSBkZXZpY2Ugb24gc3RhbmRhcmQgb3V0cHV0Ci1pcyB0aGUgZGV2aWNlIHRoYXQgcHBwZCB3b3VsZCBiZSB1c2luZyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBwZWVyLgotLlRQCi0uQiBkdW1wCi1XaXRoIHRoZSBcZkJkdW1wXGZSIG9wdGlvbiwgcHBwZCB3aWxsIHByaW50IG91dCBhbGwgdGhlIG9wdGlvbiB2YWx1ZXMKLXdoaWNoIGhhdmUgYmVlbiBzZXQuICBUaGlzIG9wdGlvbiBpcyBsaWtlIHRoZSBcZkJkcnlydW5cZlIgb3B0aW9uCi1leGNlcHQgdGhhdCBwcHBkIHByb2NlZWRzIGFzIG5vcm1hbCByYXRoZXIgdGhhbiBleGl0aW5nLgotLlRQCi0uQiBlbmFibGUtc2Vzc2lvbgotRW5hYmxlcyBzZXNzaW9uIGFjY291bnRpbmcgdmlhIFBBTSBvciB3dHdwL3d0bXB4LCBhcyBhcHByb3ByaWF0ZS4KLVdoZW4gUEFNIGlzIGVuYWJsZWQsIHRoZSBQQU0gImFjY291bnQiIGFuZCAic2Vzc2lvbiIgbW9kdWxlIHN0YWNrcwotZGV0ZXJtaW5lIGJlaGF2aW9yLCBhbmQgYXJlIGVuYWJsZWQgZm9yIGFsbCBQUFAgYXV0aGVudGljYXRpb24KLXByb3RvY29scy4gIFdoZW4gUEFNIGlzIGRpc2FibGVkLCB3dG1wL3d0bXB4IGVudHJpZXMgYXJlIHJlY29yZGVkCi1yZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHBlZXIgbmFtZSBpZGVudGlmaWVzIGEgdmFsaWQgdXNlciBvbiB0aGUKLWxvY2FsIHN5c3RlbSwgbWFraW5nIHBlZXJzIHZpc2libGUgaW4gdGhlIGxhc3QoMSkgbG9nLiAgVGhpcyBmZWF0dXJlCi1pcyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgd2hlbiB0aGUgcHBwZCBcZkJsb2dpblxmUiBvcHRpb24gaXMgdXNlZC4KLVNlc3Npb24gYWNjb3VudGluZyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgotLlRQCi0uQiBlbmRwb2ludCBcZkk8ZXBkaXNjPgotU2V0cyB0aGUgZW5kcG9pbnQgZGlzY3JpbWluYXRvciBzZW50IGJ5IHRoZSBsb2NhbCBtYWNoaW5lIHRvIHRoZSBwZWVyCi1kdXJpbmcgbXVsdGlsaW5rIG5lZ290aWF0aW9uIHRvIFxmSTxlcGRpc2M+XGZSLiAgVGhlIGRlZmF1bHQgaXMgdG8gdXNlCi10aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGV0aGVybmV0IGludGVyZmFjZSBvbiB0aGUgc3lzdGVtLCBpZiBhbnksCi1vdGhlcndpc2UgdGhlIElQdjQgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBob3N0bmFtZSwgaWYgYW55LAotcHJvdmlkZWQgaXQgaXMgbm90IGluIHRoZSBtdWx0aWNhc3Qgb3IgbG9jYWxseS1hc3NpZ25lZCBJUCBhZGRyZXNzCi1yYW5nZXMsIG9yIHRoZSBsb2NhbGhvc3QgYWRkcmVzcy4gIFRoZSBlbmRwb2ludCBkaXNjcmltaW5hdG9yIGNhbiBiZQotdGhlIHN0cmluZyBcZkJudWxsXGZSIG9yIG9mIHRoZSBmb3JtIFxmSXR5cGVcZlI6XGZJdmFsdWVcZlIsIHdoZXJlCi10eXBlIGlzIGEgZGVjaW1hbCBudW1iZXIgb3Igb25lIG9mIHRoZSBzdHJpbmdzIFxmQmxvY2FsXGZSLCBcZkJJUFxmUiwKLVxmQk1BQ1xmUiwgXGZCbWFnaWNcZlIsIG9yIFxmQnBob25lXGZSLiAgVGhlIHZhbHVlIGlzIGFuIElQIGFkZHJlc3MgaW4KLWRvdHRlZC1kZWNpbWFsIG5vdGF0aW9uIGZvciB0aGUgXGZCSVBcZlIgdHlwZSwgb3IgYSBzdHJpbmcgb2YgYnl0ZXMgaW4KLWhleGFkZWNpbWFsLCBzZXBhcmF0ZWQgYnkgcGVyaW9kcyBvciBjb2xvbnMgZm9yIHRoZSBvdGhlciB0eXBlcy4gIEZvcgotdGhlIE1BQyB0eXBlLCB0aGUgdmFsdWUgbWF5IGFsc28gYmUgdGhlIG5hbWUgb2YgYW4gZXRoZXJuZXQgb3Igc2ltaWxhcgotbmV0d29yayBpbnRlcmZhY2UuICBUaGlzIG9wdGlvbiBpcyBjdXJyZW50bHkgb25seSBhdmFpbGFibGUgdW5kZXIKLUxpbnV4LgotLlRQCi0uQiBlYXBcLWludGVydmFsIFxmSW4KLUlmIHRoaXMgb3B0aW9uIGlzIGdpdmVuIGFuZCBwcHBkIGF1dGhlbnRpY2F0ZXMgdGhlIHBlZXIgd2l0aCBFQVAKLShpLmUuLCBpcyB0aGUgc2VydmVyKSwgcHBwZCB3aWxsIHJlc3RhcnQgRUFQIGF1dGhlbnRpY2F0aW9uIGV2ZXJ5Ci1cZkluXGZSIHNlY29uZHMuICBGb3IgRUFQIFNSUFwtU0hBMSwgc2VlIGFsc28gdGhlIFxmQnNycFwtaW50ZXJ2YWxcZlIKLW9wdGlvbiwgd2hpY2ggZW5hYmxlcyBsaWdodHdlaWdodCByZWNoYWxsZW5nZS4KLS5UUAotLkIgZWFwXC1tYXhcLXJyZXEgXGZJbgotU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBFQVAgUmVxdWVzdHMgdG8gd2hpY2ggcHBwZCB3aWxsIHJlc3BvbmQgKGFzCi1hIGNsaWVudCkgd2l0aG91dCBoZWFyaW5nIEVBUCBTdWNjZXNzIG9yIEZhaWx1cmUuICAoRGVmYXVsdCBpcyAyMC4pCi0uVFAKLS5CIGVhcFwtbWF4XC1zcmVxIFxmSW4KLVNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgRUFQIFJlcXVlc3RzIHRoYXQgcHBwZCB3aWxsIGlzc3VlIChhcyBhCi1zZXJ2ZXIpIHdoaWxlIGF0dGVtcHRpbmcgYXV0aGVudGljYXRpb24uICAoRGVmYXVsdCBpcyAxMC4pCi0uVFAKLS5CIGVhcFwtcmVzdGFydCBcZkluCi1TZXQgdGhlIHJldHJhbnNtaXQgdGltZW91dCBmb3IgRUFQIFJlcXVlc3RzIHdoZW4gYWN0aW5nIGFzIGEgc2VydmVyCi0oYXV0aGVudGljYXRvcikuICAoRGVmYXVsdCBpcyAzIHNlY29uZHMuKQotLlRQCi0uQiBlYXBcLXRpbWVvdXQgXGZJbgotU2V0IHRoZSBtYXhpbXVtIHRpbWUgdG8gd2FpdCBmb3IgdGhlIHBlZXIgdG8gc2VuZCBhbiBFQVAgUmVxdWVzdCB3aGVuCi1hY3RpbmcgYXMgYSBjbGllbnQgKGF1dGhlbnRpY2F0ZWUpLiAgKERlZmF1bHQgaXMgMjAgc2Vjb25kcy4pCi0uVFAKLS5CIGhpZGVcLXBhc3N3b3JkCi1XaGVuIGxvZ2dpbmcgdGhlIGNvbnRlbnRzIG9mIFBBUCBwYWNrZXRzLCB0aGlzIG9wdGlvbiBjYXVzZXMgcHBwZCB0bwotZXhjbHVkZSB0aGUgcGFzc3dvcmQgc3RyaW5nIGZyb20gdGhlIGxvZy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQuCi0uVFAKLS5CIGhvbGRvZmYgXGZJbgotU3BlY2lmaWVzIGhvdyBtYW55IHNlY29uZHMgdG8gd2FpdCBiZWZvcmUgcmUtaW5pdGlhdGluZyB0aGUgbGluayBhZnRlcgotaXQgdGVybWluYXRlcy4gIFRoaXMgb3B0aW9uIG9ubHkgaGFzIGFueSBlZmZlY3QgaWYgdGhlIFxmSXBlcnNpc3RcZlIKLW9yIFxmSWRlbWFuZFxmUiBvcHRpb24gaXMgdXNlZC4gIFRoZSBob2xkb2ZmIHBlcmlvZCBpcyBub3QgYXBwbGllZCBpZgotdGhlIGxpbmsgd2FzIHRlcm1pbmF0ZWQgYmVjYXVzZSBpdCB3YXMgaWRsZS4KLS5UUAotLkIgaWRsZSBcZkluCi1TcGVjaWZpZXMgdGhhdCBwcHBkIHNob3VsZCBkaXNjb25uZWN0IGlmIHRoZSBsaW5rIGlzIGlkbGUgZm9yIFxmSW5cZlIKLXNlY29uZHMuICBUaGUgbGluayBpcyBpZGxlIHdoZW4gbm8gZGF0YSBwYWNrZXRzIChpLmUuIElQIHBhY2tldHMpIGFyZQotYmVpbmcgc2VudCBvciByZWNlaXZlZC4gIE5vdGU6IGl0IGlzIG5vdCBhZHZpc2FibGUgdG8gdXNlIHRoaXMgb3B0aW9uCi13aXRoIHRoZSBcZklwZXJzaXN0XGZSIG9wdGlvbiB3aXRob3V0IHRoZSBcZklkZW1hbmRcZlIgb3B0aW9uLgotSWYgdGhlIFxmQmFjdGl2ZVwtZmlsdGVyXGZSCi1vcHRpb24gaXMgZ2l2ZW4sIGRhdGEgcGFja2V0cyB3aGljaCBhcmUgcmVqZWN0ZWQgYnkgdGhlIHNwZWNpZmllZAotYWN0aXZpdHkgZmlsdGVyIGFsc28gY291bnQgYXMgdGhlIGxpbmsgYmVpbmcgaWRsZS4KLS5UUAotLkIgaXBjcFwtYWNjZXB0XC1sb2NhbAotV2l0aCB0aGlzIG9wdGlvbiwgcHBwZCB3aWxsIGFjY2VwdCB0aGUgcGVlcidzIGlkZWEgb2Ygb3VyIGxvY2FsIElQCi1hZGRyZXNzLCBldmVuIGlmIHRoZSBsb2NhbCBJUCBhZGRyZXNzIHdhcyBzcGVjaWZpZWQgaW4gYW4gb3B0aW9uLgotLlRQCi0uQiBpcGNwXC1hY2NlcHRcLXJlbW90ZQotV2l0aCB0aGlzIG9wdGlvbiwgcHBwZCB3aWxsIGFjY2VwdCB0aGUgcGVlcidzIGlkZWEgb2YgaXRzIChyZW1vdGUpIElQCi1hZGRyZXNzLCBldmVuIGlmIHRoZSByZW1vdGUgSVAgYWRkcmVzcyB3YXMgc3BlY2lmaWVkIGluIGFuIG9wdGlvbi4KLS5UUAotLkIgaXBjcFwtbWF4XC1jb25maWd1cmUgXGZJbgotU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBJUENQIGNvbmZpZ3VyZS1yZXF1ZXN0IHRyYW5zbWlzc2lvbnMgdG8KLVxmSW5cZlIgKGRlZmF1bHQgMTApLgotLlRQCi0uQiBpcGNwXC1tYXhcLWZhaWx1cmUgXGZJbgotU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBJUENQIGNvbmZpZ3VyZS1OQUtzIHJldHVybmVkIGJlZm9yZSBzdGFydGluZwotdG8gc2VuZCBjb25maWd1cmUtUmVqZWN0cyBpbnN0ZWFkIHRvIFxmSW5cZlIgKGRlZmF1bHQgMTApLgotLlRQCi0uQiBpcGNwXC1tYXhcLXRlcm1pbmF0ZSBcZkluCi1TZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIElQQ1AgdGVybWluYXRlLXJlcXVlc3QgdHJhbnNtaXNzaW9ucyB0bwotXGZJblxmUiAoZGVmYXVsdCAzKS4KLS5UUAotLkIgaXBjcFwtcmVzdGFydCBcZkluCi1TZXQgdGhlIElQQ1AgcmVzdGFydCBpbnRlcnZhbCAocmV0cmFuc21pc3Npb24gdGltZW91dCkgdG8gXGZJblxmUgotc2Vjb25kcyAoZGVmYXVsdCAzKS4KLS5UUAotLkIgaXBwYXJhbSBcZklzdHJpbmcKLVByb3ZpZGVzIGFuIGV4dHJhIHBhcmFtZXRlciB0byB0aGUgaXBcLXVwLCBpcFwtcHJlXC11cCBhbmQgaXBcLWRvd24KLXNjcmlwdHMuICBJZiB0aGlzCi1vcHRpb24gaXMgZ2l2ZW4sIHRoZSBcZklzdHJpbmdcZlIgc3VwcGxpZWQgaXMgZ2l2ZW4gYXMgdGhlIDZ0aAotcGFyYW1ldGVyIHRvIHRob3NlIHNjcmlwdHMuCi0uVFAKLS5CIGlwdjZjcFwtYWNjZXB0XC1sb2NhbAotV2l0aCB0aGlzIG9wdGlvbiwgcHBwZCB3aWxsIGFjY2VwdCB0aGUgcGVlcidzIGlkZWEgb2Ygb3VyIGxvY2FsIElQdjYKLWludGVyZmFjZSBpZGVudGlmaWVyLCBldmVuIGlmIHRoZSBsb2NhbCBJUHY2IGludGVyZmFjZSBpZGVudGlmaWVyCi13YXMgc3BlY2lmaWVkIGluIGFuIG9wdGlvbi4KLS5UUAotLkIgaXB2NmNwXC1tYXhcLWNvbmZpZ3VyZSBcZkluCi1TZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIElQdjZDUCBjb25maWd1cmUtcmVxdWVzdCB0cmFuc21pc3Npb25zIHRvCi1cZkluXGZSIChkZWZhdWx0IDEwKS4KLS5UUAotLkIgaXB2NmNwXC1tYXhcLWZhaWx1cmUgXGZJbgotU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBJUHY2Q1AgY29uZmlndXJlLU5BS3MgcmV0dXJuZWQgYmVmb3JlIHN0YXJ0aW5nCi10byBzZW5kIGNvbmZpZ3VyZS1SZWplY3RzIGluc3RlYWQgdG8gXGZJblxmUiAoZGVmYXVsdCAxMCkuCi0uVFAKLS5CIGlwdjZjcFwtbWF4XC10ZXJtaW5hdGUgXGZJbgotU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBJUHY2Q1AgdGVybWluYXRlLXJlcXVlc3QgdHJhbnNtaXNzaW9ucyB0bwotXGZJblxmUiAoZGVmYXVsdCAzKS4KLS5UUAotLkIgaXB2NmNwXC1yZXN0YXJ0IFxmSW4KLVNldCB0aGUgSVB2NkNQIHJlc3RhcnQgaW50ZXJ2YWwgKHJldHJhbnNtaXNzaW9uIHRpbWVvdXQpIHRvIFxmSW5cZlIKLXNlY29uZHMgKGRlZmF1bHQgMykuCi0uVFAKLS5CIGlweAotRW5hYmxlIHRoZSBJUFhDUCBhbmQgSVBYIHByb3RvY29scy4gIFRoaXMgb3B0aW9uIGlzIHByZXNlbnRseSBvbmx5Ci1zdXBwb3J0ZWQgdW5kZXIgTGludXgsIGFuZCBvbmx5IGlmIHlvdXIga2VybmVsIGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8KLWluY2x1ZGUgSVBYIHN1cHBvcnQuCi0uVFAKLS5CIGlweFwtbmV0d29yayBcZkluCi1TZXQgdGhlIElQWCBuZXR3b3JrIG51bWJlciBpbiB0aGUgSVBYQ1AgY29uZmlndXJlIHJlcXVlc3QgZnJhbWUgdG8KLVxmSW5cZlIsIGEgaGV4YWRlY2ltYWwgbnVtYmVyICh3aXRob3V0IGEgbGVhZGluZyAweCkuICBUaGVyZSBpcyBubwotdmFsaWQgZGVmYXVsdC4gIElmIHRoaXMgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBuZXR3b3JrIG51bWJlciBpcwotb2J0YWluZWQgZnJvbSB0aGUgcGVlci4gIElmIHRoZSBwZWVyIGRvZXMgbm90IGhhdmUgdGhlIG5ldHdvcmsgbnVtYmVyLAotdGhlIElQWCBwcm90b2NvbCB3aWxsIG5vdCBiZSBzdGFydGVkLgotLlRQCi0uQiBpcHhcLW5vZGUgXGZJblxmQjpcZkltCi1TZXQgdGhlIElQWCBub2RlIG51bWJlcnMuIFRoZSB0d28gbm9kZSBudW1iZXJzIGFyZSBzZXBhcmF0ZWQgZnJvbSBlYWNoCi1vdGhlciB3aXRoIGEgY29sb24gY2hhcmFjdGVyLiBUaGUgZmlyc3QgbnVtYmVyIFxmSW5cZlIgaXMgdGhlIGxvY2FsCi1ub2RlIG51bWJlci4gVGhlIHNlY29uZCBudW1iZXIgXGZJbVxmUiBpcyB0aGUgcGVlcidzIG5vZGUgbnVtYmVyLiBFYWNoCi1ub2RlIG51bWJlciBpcyBhIGhleGFkZWNpbWFsIG51bWJlciwgYXQgbW9zdCAxMCBkaWdpdHMgbG9uZy4gVGhlIG5vZGUKLW51bWJlcnMgb24gdGhlIGlweFwtbmV0d29yayBtdXN0IGJlIHVuaXF1ZS4gVGhlcmUgaXMgbm8gdmFsaWQKLWRlZmF1bHQuIElmIHRoaXMgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQgdGhlbiB0aGUgbm9kZSBudW1iZXJzIGFyZQotb2J0YWluZWQgZnJvbSB0aGUgcGVlci4KLS5UUAotLkIgaXB4XC1yb3V0ZXJcLW5hbWUgXGZJPHN0cmluZz4KLVNldCB0aGUgbmFtZSBvZiB0aGUgcm91dGVyLiBUaGlzIGlzIGEgc3RyaW5nIGFuZCBpcyBzZW50IHRvIHRoZSBwZWVyCi1hcyBpbmZvcm1hdGlvbiBkYXRhLgotLlRQCi0uQiBpcHhcLXJvdXRpbmcgXGZJbgotU2V0IHRoZSByb3V0aW5nIHByb3RvY29sIHRvIGJlIHJlY2VpdmVkIGJ5IHRoaXMgb3B0aW9uLiBNb3JlIHRoYW4gb25lCi1pbnN0YW5jZSBvZiBcZklpcHhcLXJvdXRpbmdcZlIgbWF5IGJlIHNwZWNpZmllZC4gVGhlICdcZklub25lXGZSJwotb3B0aW9uICgwKSBtYXkgYmUgc3BlY2lmaWVkIGFzIHRoZSBvbmx5IGluc3RhbmNlIG9mIGlweFwtcm91dGluZy4gVGhlCi12YWx1ZXMgbWF5IGJlIFxmSTBcZlIgZm9yIFxmSU5PTkVcZlIsIFxmSTJcZlIgZm9yIFxmSVJJUC9TQVBcZlIsIGFuZAotXGZJNFxmUiBmb3IgXGZJTkxTUFxmUi4KLS5UUAotLkIgaXB4Y3BcLWFjY2VwdFwtbG9jYWwKLUFjY2VwdCB0aGUgcGVlcidzIE5BSyBmb3IgdGhlIG5vZGUgbnVtYmVyIHNwZWNpZmllZCBpbiB0aGUgaXB4XC1ub2RlCi1vcHRpb24uIElmIGEgbm9kZSBudW1iZXIgd2FzIHNwZWNpZmllZCwgYW5kIG5vbi16ZXJvLCB0aGUgZGVmYXVsdCBpcwotdG8gaW5zaXN0IHRoYXQgdGhlIHZhbHVlIGJlIHVzZWQuIElmIHlvdSBpbmNsdWRlIHRoaXMgb3B0aW9uIHRoZW4geW91Ci13aWxsIHBlcm1pdCB0aGUgcGVlciB0byBvdmVycmlkZSB0aGUgZW50cnkgb2YgdGhlIG5vZGUgbnVtYmVyLgotLlRQCi0uQiBpcHhjcFwtYWNjZXB0XC1uZXR3b3JrCi1BY2NlcHQgdGhlIHBlZXIncyBOQUsgZm9yIHRoZSBuZXR3b3JrIG51bWJlciBzcGVjaWZpZWQgaW4gdGhlCi1pcHhcLW5ldHdvcmsgb3B0aW9uLiBJZiBhIG5ldHdvcmsgbnVtYmVyIHdhcyBzcGVjaWZpZWQsIGFuZCBub24temVybywgdGhlCi1kZWZhdWx0IGlzIHRvIGluc2lzdCB0aGF0IHRoZSB2YWx1ZSBiZSB1c2VkLiBJZiB5b3UgaW5jbHVkZSB0aGlzCi1vcHRpb24gdGhlbiB5b3Ugd2lsbCBwZXJtaXQgdGhlIHBlZXIgdG8gb3ZlcnJpZGUgdGhlIGVudHJ5IG9mIHRoZSBub2RlCi1udW1iZXIuCi0uVFAKLS5CIGlweGNwXC1hY2NlcHRcLXJlbW90ZQotVXNlIHRoZSBwZWVyJ3MgbmV0d29yayBudW1iZXIgc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmUgcmVxdWVzdAotZnJhbWUuIElmIGEgbm9kZSBudW1iZXIgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBlZXIgYW5kIHRoaXMgb3B0aW9uIHdhcwotbm90IHNwZWNpZmllZCwgdGhlIHBlZXIgd2lsbCBiZSBmb3JjZWQgdG8gdXNlIHRoZSB2YWx1ZSB3aGljaCB5b3UgaGF2ZQotc3BlY2lmaWVkLgotLlRQCi0uQiBpcHhjcFwtbWF4XC1jb25maWd1cmUgXGZJbgotU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBJUFhDUCBjb25maWd1cmUgcmVxdWVzdCBmcmFtZXMgd2hpY2ggdGhlCi1zeXN0ZW0gd2lsbCBzZW5kIHRvIFxmSW5cZlIuIFRoZSBkZWZhdWx0IGlzIDEwLgotLlRQCi0uQiBpcHhjcFwtbWF4XC1mYWlsdXJlIFxmSW4KLVNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgSVBYQ1AgTkFLIGZyYW1lcyB3aGljaCB0aGUgbG9jYWwgc3lzdGVtIHdpbGwKLXNlbmQgYmVmb3JlIGl0IHJlamVjdHMgdGhlIG9wdGlvbnMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDMuCi0uVFAKLS5CIGlweGNwXC1tYXhcLXRlcm1pbmF0ZSBcZkluCi1TZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIElQWENQIHRlcm1pbmF0ZSByZXF1ZXN0IGZyYW1lcyBiZWZvcmUgdGhlCi1sb2NhbCBzeXN0ZW0gY29uc2lkZXJzIHRoYXQgdGhlIHBlZXIgaXMgbm90IGxpc3RlbmluZyB0byB0aGVtLiBUaGUKLWRlZmF1bHQgdmFsdWUgaXMgMy4KLS5UUAotLkIga2RlYnVnIFxmSW4KLUVuYWJsZSBkZWJ1Z2dpbmcgY29kZSBpbiB0aGUga2VybmVsLWxldmVsIFBQUCBkcml2ZXIuICBUaGUgYXJndW1lbnQKLXZhbHVlcyBkZXBlbmQgb24gdGhlIHNwZWNpZmljIGtlcm5lbCBkcml2ZXIsIGJ1dCBpbiBnZW5lcmFsIGEgdmFsdWUgb2YKLTEgd2lsbCBlbmFibGUgZ2VuZXJhbCBrZXJuZWwgZGVidWcgbWVzc2FnZXMuICAoTm90ZSB0aGF0IHRoZXNlCi1tZXNzYWdlcyBhcmUgdXN1YWxseSBvbmx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nIHRoZSBrZXJuZWwgZHJpdmVyCi1pdHNlbGYuKSAgRm9yIHRoZSBMaW51eCAyLjIueCBrZXJuZWwgZHJpdmVyLCB0aGUgdmFsdWUgaXMgYSBzdW0gb2YKLWJpdHM6IDEgdG8KLWVuYWJsZSBnZW5lcmFsIGRlYnVnIG1lc3NhZ2VzLCAyIHRvIHJlcXVlc3QgdGhhdCB0aGUgY29udGVudHMgb2YKLXJlY2VpdmVkIHBhY2tldHMgYmUgcHJpbnRlZCwgYW5kIDQgdG8gcmVxdWVzdCB0aGF0IHRoZSBjb250ZW50cyBvZgotdHJhbnNtaXR0ZWQgcGFja2V0cyBiZSBwcmludGVkLiAgT24gbW9zdCBzeXN0ZW1zLCBtZXNzYWdlcyBwcmludGVkIGJ5Ci10aGUga2VybmVsIGFyZSBsb2dnZWQgYnkgc3lzbG9nKDEpIHRvIGEgZmlsZSBhcyBkaXJlY3RlZCBpbiB0aGUKLS9ldGMvc3lzbG9nLmNvbmYgY29uZmlndXJhdGlvbiBmaWxlLgotLlRQCi0uQiBrdHVuZQotRW5hYmxlcyBwcHBkIHRvIGFsdGVyIGtlcm5lbCBzZXR0aW5ncyBhcyBhcHByb3ByaWF0ZS4gIFVuZGVyIExpbnV4LAotcHBwZCB3aWxsIGVuYWJsZSBJUCBmb3J3YXJkaW5nIChpLmUuIHNldCAvcHJvYy9zeXMvbmV0L2lwdjQvaXBfZm9yd2FyZAotdG8gMSkgaWYgdGhlIFxmSXByb3h5YXJwXGZSIG9wdGlvbiBpcyB1c2VkLCBhbmQgd2lsbCBlbmFibGUgdGhlCi1keW5hbWljIElQIGFkZHJlc3Mgb3B0aW9uIChpLmUuIHNldCAvcHJvYy9zeXMvbmV0L2lwdjQvaXBfZHluYWRkciB0bwotMSkgaW4gZGVtYW5kIG1vZGUgaWYgdGhlIGxvY2FsIGFkZHJlc3MgY2hhbmdlcy4KLS5UUAotLkIgbGNwXC1lY2hvXC1mYWlsdXJlIFxmSW4KLUlmIHRoaXMgb3B0aW9uIGlzIGdpdmVuLCBwcHBkIHdpbGwgcHJlc3VtZSB0aGUgcGVlciB0byBiZSBkZWFkCi1pZiBcZkluXGZSIExDUCBlY2hvXC1yZXF1ZXN0cyBhcmUgc2VudCB3aXRob3V0IHJlY2VpdmluZyBhIHZhbGlkIExDUAotZWNob1wtcmVwbHkuICBJZiB0aGlzIGhhcHBlbnMsIHBwcGQgd2lsbCB0ZXJtaW5hdGUgdGhlCi1jb25uZWN0aW9uLiAgVXNlIG9mIHRoaXMgb3B0aW9uIHJlcXVpcmVzIGEgbm9uLXplcm8gdmFsdWUgZm9yIHRoZQotXGZJbGNwXC1lY2hvXC1pbnRlcnZhbFxmUiBwYXJhbWV0ZXIuICBUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBlbmFibGUKLXBwcGQgdG8gdGVybWluYXRlIGFmdGVyIHRoZSBwaHlzaWNhbCBjb25uZWN0aW9uIGhhcyBiZWVuIGJyb2tlbgotKGUuZy4sIHRoZSBtb2RlbSBoYXMgaHVuZyB1cCkgaW4gc2l0dWF0aW9ucyB3aGVyZSBubyBoYXJkd2FyZSBtb2RlbQotY29udHJvbCBsaW5lcyBhcmUgYXZhaWxhYmxlLgotLlRQCi0uQiBsY3BcLWVjaG9cLWludGVydmFsIFxmSW4KLUlmIHRoaXMgb3B0aW9uIGlzIGdpdmVuLCBwcHBkIHdpbGwgc2VuZCBhbiBMQ1AgZWNob1wtcmVxdWVzdCBmcmFtZSB0bwotdGhlIHBlZXIgZXZlcnkgXGZJblxmUiBzZWNvbmRzLiAgTm9ybWFsbHkgdGhlIHBlZXIgc2hvdWxkIHJlc3BvbmQgdG8KLXRoZSBlY2hvXC1yZXF1ZXN0IGJ5IHNlbmRpbmcgYW4gZWNob1wtcmVwbHkuICBUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZAotd2l0aCB0aGUgXGZJbGNwXC1lY2hvXC1mYWlsdXJlXGZSIG9wdGlvbiB0byBkZXRlY3QgdGhhdCB0aGUgcGVlciBpcyBubwotbG9uZ2VyIGNvbm5lY3RlZC4KLS5UUAotLkIgbGNwXC1tYXhcLWNvbmZpZ3VyZSBcZkluCi1TZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIExDUCBjb25maWd1cmUtcmVxdWVzdCB0cmFuc21pc3Npb25zIHRvCi1cZkluXGZSIChkZWZhdWx0IDEwKS4KLS5UUAotLkIgbGNwXC1tYXhcLWZhaWx1cmUgXGZJbgotU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBMQ1AgY29uZmlndXJlLU5BS3MgcmV0dXJuZWQgYmVmb3JlIHN0YXJ0aW5nCi10byBzZW5kIGNvbmZpZ3VyZS1SZWplY3RzIGluc3RlYWQgdG8gXGZJblxmUiAoZGVmYXVsdCAxMCkuCi0uVFAKLS5CIGxjcFwtbWF4XC10ZXJtaW5hdGUgXGZJbgotU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBMQ1AgdGVybWluYXRlLXJlcXVlc3QgdHJhbnNtaXNzaW9ucyB0bwotXGZJblxmUiAoZGVmYXVsdCAzKS4KLS5UUAotLkIgbGNwXC1yZXN0YXJ0IFxmSW4KLVNldCB0aGUgTENQIHJlc3RhcnQgaW50ZXJ2YWwgKHJldHJhbnNtaXNzaW9uIHRpbWVvdXQpIHRvIFxmSW5cZlIKLXNlY29uZHMgKGRlZmF1bHQgMykuCi0uVFAKLS5CIGxpbmtuYW1lIFxmSW5hbWVcZlIKLVNldHMgdGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgbGluayB0byBcZkluYW1lXGZSLiAgUHBwZCB3aWxsIGNyZWF0ZSBhCi1maWxlIG5hbWVkIFxmQnBwcFwtXGZJbmFtZVxmQi5waWRcZlIgaW4gL3Zhci9ydW4gKG9yIC9ldGMvcHBwIG9uIHNvbWUKLXN5c3RlbXMpIGNvbnRhaW5pbmcgaXRzIHByb2Nlc3MgSUQuICBUaGlzIGNhbiBiZSB1c2VmdWwgaW4gZGV0ZXJtaW5pbmcKLXdoaWNoIGluc3RhbmNlIG9mIHBwcGQgaXMgcmVzcG9uc2libGUgZm9yIHRoZSBsaW5rIHRvIGEgZ2l2ZW4gcGVlcgotc3lzdGVtLiAgVGhpcyBpcyBhIHByaXZpbGVnZWQgb3B0aW9uLgotLlRQCi0uQiBsb2NhbAotRG9uJ3QgdXNlIHRoZSBtb2RlbSBjb250cm9sIGxpbmVzLiAgV2l0aCB0aGlzIG9wdGlvbiwgcHBwZCB3aWxsIGlnbm9yZQotdGhlIHN0YXRlIG9mIHRoZSBDRCAoQ2FycmllciBEZXRlY3QpIHNpZ25hbCBmcm9tIHRoZSBtb2RlbSBhbmQgd2lsbAotbm90IGNoYW5nZSB0aGUgc3RhdGUgb2YgdGhlIERUUiAoRGF0YSBUZXJtaW5hbCBSZWFkeSkgc2lnbmFsLiAgVGhpcyBpcwotdGhlIG9wcG9zaXRlIG9mIHRoZSBcZkJtb2RlbVxmUiBvcHRpb24uCi0uVFAKLS5CIGxvZ2ZkIFxmSW4KLVNlbmQgbG9nIG1lc3NhZ2VzIHRvIGZpbGUgZGVzY3JpcHRvciBcZkluXGZSLiAgUHBwZCB3aWxsIHNlbmQgbG9nCi1tZXNzYWdlcyB0byBhdCBtb3N0IG9uZSBmaWxlIG9yIGZpbGUgZGVzY3JpcHRvciAoYXMgd2VsbCBhcyBzZW5kaW5nCi10aGUgbG9nIG1lc3NhZ2VzIHRvIHN5c2xvZyksIHNvIHRoaXMgb3B0aW9uIGFuZCB0aGUgXGZCbG9nZmlsZVxmUgotb3B0aW9uIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICBUaGUgZGVmYXVsdCBpcyBmb3IgcHBwZCB0byBzZW5kIGxvZwotbWVzc2FnZXMgdG8gc3Rkb3V0IChmaWxlIGRlc2NyaXB0b3IgMSksIHVubGVzcyB0aGUgc2VyaWFsIHBvcnQgaXMKLWFscmVhZHkgb3BlbiBvbiBzdGRvdXQuCi0uVFAKLS5CIGxvZ2ZpbGUgXGZJZmlsZW5hbWUKLUFwcGVuZCBsb2cgbWVzc2FnZXMgdG8gdGhlIGZpbGUgXGZJZmlsZW5hbWVcZlIgKGFzIHdlbGwgYXMgc2VuZGluZyB0aGUKLWxvZyBtZXNzYWdlcyB0byBzeXNsb2cpLiAgVGhlIGZpbGUgaXMgb3BlbmVkIHdpdGggdGhlIHByaXZpbGVnZXMgb2YKLXRoZSB1c2VyIHdobyBpbnZva2VkIHBwcGQsIGluIGFwcGVuZCBtb2RlLgotLlRQCi0uQiBsb2dpbgotVXNlIHRoZSBzeXN0ZW0gcGFzc3dvcmQgZGF0YWJhc2UgZm9yIGF1dGhlbnRpY2F0aW5nIHRoZSBwZWVyIHVzaW5nCi1QQVAsIGFuZCByZWNvcmQgdGhlIHVzZXIgaW4gdGhlIHN5c3RlbSB3dG1wIGZpbGUuICBOb3RlIHRoYXQgdGhlIHBlZXIKLW11c3QgaGF2ZSBhbiBlbnRyeSBpbiB0aGUgL2V0Yy9wcHAvcGFwXC1zZWNyZXRzIGZpbGUgYXMgd2VsbCBhcyB0aGUKLXN5c3RlbSBwYXNzd29yZCBkYXRhYmFzZSB0byBiZSBhbGxvd2VkIGFjY2Vzcy4gIFNlZSBhbHNvIHRoZQotXGZCZW5hYmxlXC1zZXNzaW9uXGZSIG9wdGlvbi4KLS5UUAotLkIgbWFzdGVyX2RldGFjaAotSWYgbXVsdGlsaW5rIGlzIGVuYWJsZWQgYW5kIHRoaXMgcHBwZCBwcm9jZXNzIGlzIHRoZSBtdWx0aWxpbmsgYnVuZGxlCi1tYXN0ZXIsIGFuZCB0aGUgbGluayBjb250cm9sbGVkIGJ5IHRoaXMgcHBwZCBwcm9jZXNzIHRlcm1pbmF0ZXMsIHRoaXMKLXBwcGQgcHJvY2VzcyBjb250aW51ZXMgdG8gcnVuIGluIG9yZGVyIHRvIG1haW50YWluIHRoZSBidW5kbGUuICBJZiB0aGUKLVxmQm1hc3Rlcl9kZXRhY2hcZlIgb3B0aW9uIGhhcyBiZWVuIGdpdmVuLCBwcHBkIHdpbGwgZGV0YWNoIGZyb20gaXRzCi1jb250cm9sbGluZyB0ZXJtaW5hbCBpbiB0aGlzIHNpdHVhdGlvbiwgZXZlbiBpZiB0aGUgXGZCbm9kZXRhY2hcZlIKLW9wdGlvbiBoYXMgYmVlbiBnaXZlbi4KLS5UUAotLkIgbWF4Y29ubmVjdCBcZkluCi1UZXJtaW5hdGUgdGhlIGNvbm5lY3Rpb24gd2hlbiBpdCBoYXMgYmVlbiBhdmFpbGFibGUgZm9yIG5ldHdvcmsKLXRyYWZmaWMgZm9yIFxmSW5cZlIgc2Vjb25kcyAoaS5lLiBcZkluXGZSIHNlY29uZHMgYWZ0ZXIgdGhlIGZpcnN0Ci1uZXR3b3JrIGNvbnRyb2wgcHJvdG9jb2wgY29tZXMgdXApLgotLlRQCi0uQiBtYXhmYWlsIFxmSW4KLVRlcm1pbmF0ZSBhZnRlciBcZkluXGZSIGNvbnNlY3V0aXZlIGZhaWxlZCBjb25uZWN0aW9uIGF0dGVtcHRzLiAgQQotdmFsdWUgb2YgMCBtZWFucyBubyBsaW1pdC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEwLgotLlRQCi0uQiBtb2RlbQotVXNlIHRoZSBtb2RlbSBjb250cm9sIGxpbmVzLiAgVGhpcyBvcHRpb24gaXMgdGhlIGRlZmF1bHQuICBXaXRoIHRoaXMKLW9wdGlvbiwgcHBwZCB3aWxsIHdhaXQgZm9yIHRoZSBDRCAoQ2FycmllciBEZXRlY3QpIHNpZ25hbCBmcm9tIHRoZQotbW9kZW0gdG8gYmUgYXNzZXJ0ZWQgd2hlbiBvcGVuaW5nIHRoZSBzZXJpYWwgZGV2aWNlICh1bmxlc3MgYSBjb25uZWN0Ci1zY3JpcHQgaXMgc3BlY2lmaWVkKSwgYW5kIGl0IHdpbGwgZHJvcCB0aGUgRFRSIChEYXRhIFRlcm1pbmFsIFJlYWR5KQotc2lnbmFsIGJyaWVmbHkgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyB0ZXJtaW5hdGVkIGFuZCBiZWZvcmUgZXhlY3V0aW5nCi10aGUgY29ubmVjdCBzY3JpcHQuICBPbiBVbHRyaXgsIHRoaXMgb3B0aW9uIGltcGxpZXMgaGFyZHdhcmUgZmxvdwotY29udHJvbCwgYXMgZm9yIHRoZSBcZkljcnRzY3RzXGZSIG9wdGlvbi4gIFRoaXMgaXMgdGhlIG9wcG9zaXRlIG9mIHRoZQotXGZCbG9jYWxcZlIgb3B0aW9uLgotLlRQCi0uQiBtcAotRW5hYmxlcyB0aGUgdXNlIG9mIFBQUCBtdWx0aWxpbms7IHRoaXMgaXMgYW4gYWxpYXMgZm9yIHRoZSBgbXVsdGlsaW5rJwotb3B0aW9uLiAgVGhpcyBvcHRpb24gaXMgY3VycmVudGx5IG9ubHkgYXZhaWxhYmxlIHVuZGVyIExpbnV4LgotLlRQCi0uQiBtcHBlXC1zdGF0ZWZ1bAotQWxsb3cgTVBQRSB0byB1c2Ugc3RhdGVmdWwgbW9kZS4gIFN0YXRlbGVzcyBtb2RlIGlzIHN0aWxsIGF0dGVtcHRlZCBmaXJzdC4KLVRoZSBkZWZhdWx0IGlzIHRvIGRpc2FsbG93IHN0YXRlZnVsIG1vZGUuICAKLS5UUAotLkIgbXBzaG9ydHNlcQotRW5hYmxlcyB0aGUgdXNlIG9mIHNob3J0ICgxMi1iaXQpIHNlcXVlbmNlIG51bWJlcnMgaW4gbXVsdGlsaW5rCi1oZWFkZXJzLCBhcyBvcHBvc2VkIHRvIDI0LWJpdCBzZXF1ZW5jZSBudW1iZXJzLiAgVGhpcyBvcHRpb24gaXMgb25seQotYXZhaWxhYmxlIHVuZGVyIExpbnV4LCBhbmQgb25seSBoYXMgYW55IGVmZmVjdCBpZiBtdWx0aWxpbmsgaXMKLWVuYWJsZWQgKHNlZSB0aGUgbXVsdGlsaW5rIG9wdGlvbikuCi0uVFAKLS5CIG1ycnUgXGZJbgotU2V0cyB0aGUgTWF4aW11bSBSZWNvbnN0cnVjdGVkIFJlY2VpdmUgVW5pdCB0byBcZkluXGZSLiAgVGhlIE1SUlUgaXMKLXRoZSBtYXhpbXVtIHNpemUgZm9yIGEgcmVjZWl2ZWQgcGFja2V0IG9uIGEgbXVsdGlsaW5rIGJ1bmRsZSwgYW5kIGlzCi1hbmFsb2dvdXMgdG8gdGhlIE1SVSBmb3IgdGhlIGluZGl2aWR1YWwgbGlua3MuICBUaGlzIG9wdGlvbiBpcwotY3VycmVudGx5IG9ubHkgYXZhaWxhYmxlIHVuZGVyIExpbnV4LCBhbmQgb25seSBoYXMgYW55IGVmZmVjdCBpZgotbXVsdGlsaW5rIGlzIGVuYWJsZWQgKHNlZSB0aGUgbXVsdGlsaW5rIG9wdGlvbikuCi0uVFAKLS5CIG1zXC1kbnMgXGZJPGFkZHI+Ci1JZiBwcHBkIGlzIGFjdGluZyBhcyBhIHNlcnZlciBmb3IgTWljcm9zb2Z0IFdpbmRvd3MgY2xpZW50cywgdGhpcwotb3B0aW9uIGFsbG93cyBwcHBkIHRvIHN1cHBseSBvbmUgb3IgdHdvIEROUyAoRG9tYWluIE5hbWUgU2VydmVyKQotYWRkcmVzc2VzIHRvIHRoZSBjbGllbnRzLiAgVGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoaXMgb3B0aW9uIHNwZWNpZmllcwotdGhlIHByaW1hcnkgRE5TIGFkZHJlc3M7IHRoZSBzZWNvbmQgaW5zdGFuY2UgKGlmIGdpdmVuKSBzcGVjaWZpZXMgdGhlCi1zZWNvbmRhcnkgRE5TIGFkZHJlc3MuICAoVGhpcyBvcHRpb24gd2FzIHByZXNlbnQgaW4gc29tZSBvbGRlcgotdmVyc2lvbnMgb2YgcHBwZCB1bmRlciB0aGUgbmFtZSBcZkJkbnNcLWFkZHJcZlIuKQotLlRQCi0uQiBtc1wtd2lucyBcZkk8YWRkcj4KLUlmIHBwcGQgaXMgYWN0aW5nIGFzIGEgc2VydmVyIGZvciBNaWNyb3NvZnQgV2luZG93cyBvciAiU2FtYmEiCi1jbGllbnRzLCB0aGlzIG9wdGlvbiBhbGxvd3MgcHBwZCB0byBzdXBwbHkgb25lIG9yIHR3byBXSU5TIChXaW5kb3dzCi1JbnRlcm5ldCBOYW1lIFNlcnZpY2VzKSBzZXJ2ZXIgYWRkcmVzc2VzIHRvIHRoZSBjbGllbnRzLiAgVGhlIGZpcnN0Ci1pbnN0YW5jZSBvZiB0aGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhlIHByaW1hcnkgV0lOUyBhZGRyZXNzOyB0aGUgc2Vjb25kCi1pbnN0YW5jZSAoaWYgZ2l2ZW4pIHNwZWNpZmllcyB0aGUgc2Vjb25kYXJ5IFdJTlMgYWRkcmVzcy4KLS5UUAotLkIgbXVsdGlsaW5rCi1FbmFibGVzIHRoZSB1c2Ugb2YgdGhlIFBQUCBtdWx0aWxpbmsgcHJvdG9jb2wuICBJZiB0aGUgcGVlciBhbHNvCi1zdXBwb3J0cyBtdWx0aWxpbmssIHRoZW4gdGhpcyBsaW5rIGNhbiBiZWNvbWUgcGFydCBvZiBhIGJ1bmRsZSBiZXR3ZWVuCi10aGUgbG9jYWwgc3lzdGVtIGFuZCB0aGUgcGVlci4gIElmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIGJ1bmRsZSB0byB0aGUKLXBlZXIsIHBwcGQgd2lsbCBqb2luIHRoaXMgbGluayB0byB0aGF0IGJ1bmRsZSwgb3RoZXJ3aXNlIHBwcGQgd2lsbAotY3JlYXRlIGEgbmV3IGJ1bmRsZS4gIFNlZSB0aGUgTVVMVElMSU5LIHNlY3Rpb24gYmVsb3cuICBUaGlzIG9wdGlvbiBpcwotY3VycmVudGx5IG9ubHkgYXZhaWxhYmxlIHVuZGVyIExpbnV4LgotLlRQCi0uQiBuYW1lIFxmSW5hbWUKLVNldCB0aGUgbmFtZSBvZiB0aGUgbG9jYWwgc3lzdGVtIGZvciBhdXRoZW50aWNhdGlvbiBwdXJwb3NlcyB0bwotXGZJbmFtZVxmUi4gIFRoaXMgaXMgYSBwcml2aWxlZ2VkIG9wdGlvbi4gIFdpdGggdGhpcyBvcHRpb24sIHBwcGQgd2lsbAotdXNlIGxpbmVzIGluIHRoZSBzZWNyZXRzIGZpbGVzIHdoaWNoIGhhdmUgXGZJbmFtZVxmUiBhcyB0aGUgc2Vjb25kCi1maWVsZCB3aGVuIGxvb2tpbmcgZm9yIGEgc2VjcmV0IHRvIHVzZSBpbiBhdXRoZW50aWNhdGluZyB0aGUgcGVlci4gIEluCi1hZGRpdGlvbiwgdW5sZXNzIG92ZXJyaWRkZW4gd2l0aCB0aGUgXGZJdXNlclxmUiBvcHRpb24sIFxmSW5hbWVcZlIKLXdpbGwgYmUgdXNlZCBhcyB0aGUgbmFtZSB0byBzZW5kIHRvIHRoZSBwZWVyIHdoZW4gYXV0aGVudGljYXRpbmcgdGhlCi1sb2NhbCBzeXN0ZW0gdG8gdGhlIHBlZXIuICAoTm90ZSB0aGF0IHBwcGQgZG9lcyBub3QgYXBwZW5kIHRoZSBkb21haW4KLW5hbWUgdG8gXGZJbmFtZVxmUi4pCi0uVFAKLS5CIG5vYWNjb21wCi1EaXNhYmxlIEFkZHJlc3MvQ29udHJvbCBjb21wcmVzc2lvbiBpbiBib3RoIGRpcmVjdGlvbnMgKHNlbmQgYW5kCi1yZWNlaXZlKS4KLS5UUAotLkIgbm9hdXRoCi1EbyBub3QgcmVxdWlyZSB0aGUgcGVlciB0byBhdXRoZW50aWNhdGUgaXRzZWxmLiAgVGhpcyBvcHRpb24gaXMKLXByaXZpbGVnZWQuCi0uVFAKLS5CIG5vYnNkY29tcAotRGlzYWJsZXMgQlNELUNvbXByZXNzIGNvbXByZXNzaW9uOyBcZkJwcHBkXGZSIHdpbGwgbm90IHJlcXVlc3Qgb3IKLWFncmVlIHRvIGNvbXByZXNzIHBhY2tldHMgdXNpbmcgdGhlIEJTRC1Db21wcmVzcyBzY2hlbWUuCi0uVFAKLS5CIG5vY2NwCi1EaXNhYmxlIENDUCAoQ29tcHJlc3Npb24gQ29udHJvbCBQcm90b2NvbCkgbmVnb3RpYXRpb24uICBUaGlzIG9wdGlvbgotc2hvdWxkIG9ubHkgYmUgcmVxdWlyZWQgaWYgdGhlIHBlZXIgaXMgYnVnZ3kgYW5kIGdldHMgY29uZnVzZWQgYnkKLXJlcXVlc3RzIGZyb20gcHBwZCBmb3IgQ0NQIG5lZ290aWF0aW9uLgotLlRQCi0uQiBub2NydHNjdHMKLURpc2FibGUgaGFyZHdhcmUgZmxvdyBjb250cm9sIChpLmUuIFJUUy9DVFMpIG9uIHRoZSBzZXJpYWwgcG9ydC4KLUlmIG5laXRoZXIgdGhlIFxmSWNydHNjdHNcZlIgbm9yIHRoZSBcZklub2NydHNjdHNcZlIgbm9yIHRoZQotXGZJY2R0cmN0c1xmUiBub3IgdGhlIFxmSW5vY2R0cmN0c1xmUiBvcHRpb24gaXMgZ2l2ZW4sIHRoZSBoYXJkd2FyZQotZmxvdyBjb250cm9sIHNldHRpbmcgZm9yIHRoZSBzZXJpYWwgcG9ydCBpcyBsZWZ0IHVuY2hhbmdlZC4KLS5UUAotLkIgbm9jZHRyY3RzCi1UaGlzIG9wdGlvbiBpcyBhIHN5bm9ueW0gZm9yIFxmSW5vY3J0c2N0c1xmUi4gRWl0aGVyIG9mIHRoZXNlIG9wdGlvbnMgd2lsbAotZGlzYWJsZSBib3RoIGZvcm1zIG9mIGhhcmR3YXJlIGZsb3cgY29udHJvbC4KLS5UUAotLkIgbm9kZWZhdWx0cm91dGUKLURpc2FibGUgdGhlIFxmSWRlZmF1bHRyb3V0ZVxmUiBvcHRpb24uICBUaGUgc3lzdGVtIGFkbWluaXN0cmF0b3Igd2hvCi13aXNoZXMgdG8gcHJldmVudCB1c2VycyBmcm9tIGNyZWF0aW5nIGRlZmF1bHQgcm91dGVzIHdpdGggcHBwZAotY2FuIGRvIHNvIGJ5IHBsYWNpbmcgdGhpcyBvcHRpb24gaW4gdGhlIC9ldGMvcHBwL29wdGlvbnMgZmlsZS4KLS5UUAotLkIgbm9kZWZsYXRlCi1EaXNhYmxlcyBEZWZsYXRlIGNvbXByZXNzaW9uOyBwcHBkIHdpbGwgbm90IHJlcXVlc3Qgb3IgYWdyZWUgdG8KLWNvbXByZXNzIHBhY2tldHMgdXNpbmcgdGhlIERlZmxhdGUgc2NoZW1lLgotLlRQCi0uQiBub2RldGFjaAotRG9uJ3QgZGV0YWNoIGZyb20gdGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsLiAgV2l0aG91dCB0aGlzIG9wdGlvbiwgaWYgYQotc2VyaWFsIGRldmljZSBvdGhlciB0aGFuIHRoZSB0ZXJtaW5hbCBvbiB0aGUgc3RhbmRhcmQgaW5wdXQgaXMKLXNwZWNpZmllZCwgcHBwZCB3aWxsIGZvcmsgdG8gYmVjb21lIGEgYmFja2dyb3VuZCBwcm9jZXNzLgotLlRQCi0uQiBub2VuZHBvaW50Ci1EaXNhYmxlcyBwcHBkIGZyb20gc2VuZGluZyBhbiBlbmRwb2ludCBkaXNjcmltaW5hdG9yIHRvIHRoZSBwZWVyIG9yCi1hY2NlcHRpbmcgb25lIGZyb20gdGhlIHBlZXIgKHNlZSB0aGUgTVVMVElMSU5LIHNlY3Rpb24gYmVsb3cpLiAgVGhpcwotb3B0aW9uIHNob3VsZCBvbmx5IGJlIHJlcXVpcmVkIGlmIHRoZSBwZWVyIGlzIGJ1Z2d5LgotLlRQCi0uQiBub2lwCi1EaXNhYmxlIElQQ1AgbmVnb3RpYXRpb24gYW5kIElQIGNvbW11bmljYXRpb24uICBUaGlzIG9wdGlvbiBzaG91bGQKLW9ubHkgYmUgcmVxdWlyZWQgaWYgdGhlIHBlZXIgaXMgYnVnZ3kgYW5kIGdldHMgY29uZnVzZWQgYnkgcmVxdWVzdHMKLWZyb20gcHBwZCBmb3IgSVBDUCBuZWdvdGlhdGlvbi4KLS5UUAotLkIgbm9pcHY2Ci1EaXNhYmxlIElQdjZDUCBuZWdvdGlhdGlvbiBhbmQgSVB2NiBjb21tdW5pY2F0aW9uLiBUaGlzIG9wdGlvbiBzaG91bGQKLW9ubHkgYmUgcmVxdWlyZWQgaWYgdGhlIHBlZXIgaXMgYnVnZ3kgYW5kIGdldHMgY29uZnVzZWQgYnkgcmVxdWVzdHMKLWZyb20gcHBwZCBmb3IgSVB2NkNQIG5lZ290aWF0aW9uLgotLlRQCi0uQiBub2lwZGVmYXVsdAotRGlzYWJsZXMgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIHdoZW4gbm8gbG9jYWwgSVAgYWRkcmVzcyBpcyBzcGVjaWZpZWQsCi13aGljaCBpcyB0byBkZXRlcm1pbmUgKGlmIHBvc3NpYmxlKSB0aGUgbG9jYWwgSVAgYWRkcmVzcyBmcm9tIHRoZQotaG9zdG5hbWUuICBXaXRoIHRoaXMgb3B0aW9uLCB0aGUgcGVlciB3aWxsIGhhdmUgdG8gc3VwcGx5IHRoZSBsb2NhbCBJUAotYWRkcmVzcyBkdXJpbmcgSVBDUCBuZWdvdGlhdGlvbiAodW5sZXNzIGl0IHNwZWNpZmllZCBleHBsaWNpdGx5IG9uIHRoZQotY29tbWFuZCBsaW5lIG9yIGluIGFuIG9wdGlvbnMgZmlsZSkuCi0uVFAKLS5CIG5vaXB4Ci1EaXNhYmxlIHRoZSBJUFhDUCBhbmQgSVBYIHByb3RvY29scy4gIFRoaXMgb3B0aW9uIHNob3VsZCBvbmx5IGJlCi1yZXF1aXJlZCBpZiB0aGUgcGVlciBpcyBidWdneSBhbmQgZ2V0cyBjb25mdXNlZCBieSByZXF1ZXN0cyBmcm9tIHBwcGQKLWZvciBJUFhDUCBuZWdvdGlhdGlvbi4KLS5UUAotLkIgbm9rdHVuZQotT3Bwb3NpdGUgb2YgdGhlIFxmSWt0dW5lXGZSIG9wdGlvbjsgZGlzYWJsZXMgcHBwZCBmcm9tIGNoYW5naW5nIHN5c3RlbQotc2V0dGluZ3MuCi0uVFAKLS5CIG5vbG9jawotT3Bwb3NpdGUgb2YgdGhlIFxmSWxvY2tcZlIgb3B0aW9uOyBzcGVjaWZpZXMgdGhhdCBwcHBkIHNob3VsZCBub3QKLWNyZWF0ZSBhIFVVQ1Atc3R5bGUgbG9jayBmaWxlIGZvciB0aGUgc2VyaWFsIGRldmljZS4gIFRoaXMgb3B0aW9uIGlzCi1wcml2aWxlZ2VkLgotLlRQCi0uQiBub2xvZwotRG8gbm90IHNlbmQgbG9nIG1lc3NhZ2VzIHRvIGEgZmlsZSBvciBmaWxlIGRlc2NyaXB0b3IuICBUaGlzIG9wdGlvbgotY2FuY2VscyB0aGUgXGZCbG9nZmRcZlIgYW5kIFxmQmxvZ2ZpbGVcZlIgb3B0aW9ucy4KLS5UUAotLkIgbm9tYWdpYwotRGlzYWJsZSBtYWdpYyBudW1iZXIgbmVnb3RpYXRpb24uICBXaXRoIHRoaXMgb3B0aW9uLCBwcHBkIGNhbm5vdAotZGV0ZWN0IGEgbG9vcGVkLWJhY2sgbGluZS4gIFRoaXMgb3B0aW9uIHNob3VsZCBvbmx5IGJlIG5lZWRlZCBpZiB0aGUKLXBlZXIgaXMgYnVnZ3kuCi0uVFAKLS5CIG5vbXAKLURpc2FibGVzIHRoZSB1c2Ugb2YgUFBQIG11bHRpbGluay4gIFRoaXMgb3B0aW9uIGlzIGN1cnJlbnRseSBvbmx5Ci1hdmFpbGFibGUgdW5kZXIgTGludXguCi0uVFAKLS5CIG5vbXBwZQotRGlzYWJsZXMgTVBQRSAoTWljcm9zb2Z0IFBvaW50IHRvIFBvaW50IEVuY3J5cHRpb24pLiAgVGhpcyBpcyB0aGUgZGVmYXVsdC4KLS5UUAotLkIgbm9tcHBlXC00MAotRGlzYWJsZSA0MC1iaXQgZW5jcnlwdGlvbiB3aXRoIE1QUEUuCi0uVFAKLS5CIG5vbXBwZVwtMTI4Ci1EaXNhYmxlIDEyOC1iaXQgZW5jcnlwdGlvbiB3aXRoIE1QUEUuCi0uVFAKLS5CIG5vbXBwZVwtc3RhdGVmdWwKLURpc2FibGUgTVBQRSBzdGF0ZWZ1bCBtb2RlLiAgVGhpcyBpcyB0aGUgZGVmYXVsdC4KLS5UUAotLkIgbm9tcHNob3J0c2VxCi1EaXNhYmxlcyB0aGUgdXNlIG9mIHNob3J0ICgxMi1iaXQpIHNlcXVlbmNlIG51bWJlcnMgaW4gdGhlIFBQUAotbXVsdGlsaW5rIHByb3RvY29sLCBmb3JjaW5nIHRoZSB1c2Ugb2YgMjQtYml0IHNlcXVlbmNlIG51bWJlcnMuICBUaGlzCi1vcHRpb24gaXMgY3VycmVudGx5IG9ubHkgYXZhaWxhYmxlIHVuZGVyIExpbnV4LCBhbmQgb25seSBoYXMgYW55Ci1lZmZlY3QgaWYgbXVsdGlsaW5rIGlzIGVuYWJsZWQuCi0uVFAKLS5CIG5vbXVsdGlsaW5rCi1EaXNhYmxlcyB0aGUgdXNlIG9mIFBQUCBtdWx0aWxpbmsuICBUaGlzIG9wdGlvbiBpcyBjdXJyZW50bHkgb25seQotYXZhaWxhYmxlIHVuZGVyIExpbnV4LgotLlRQCi0uQiBub3Bjb21wCi1EaXNhYmxlIHByb3RvY29sIGZpZWxkIGNvbXByZXNzaW9uIG5lZ290aWF0aW9uIGluIGJvdGggdGhlIHJlY2VpdmUgYW5kCi10aGUgdHJhbnNtaXQgZGlyZWN0aW9uLgotLlRQCi0uQiBub3BlcnNpc3QKLUV4aXQgb25jZSBhIGNvbm5lY3Rpb24gaGFzIGJlZW4gbWFkZSBhbmQgdGVybWluYXRlZC4gIFRoaXMgaXMgdGhlCi1kZWZhdWx0IHVubGVzcyB0aGUgXGZJcGVyc2lzdFxmUiBvciBcZklkZW1hbmRcZlIgb3B0aW9uIGhhcyBiZWVuCi1zcGVjaWZpZWQuCi0uVFAKLS5CIG5vcHJlZGljdG9yMQotRG8gbm90IGFjY2VwdCBvciBhZ3JlZSB0byBQcmVkaWN0b3JcLTEgY29tcHJlc3Npb24uCi0uVFAKLS5CIG5vcHJveHlhcnAKLURpc2FibGUgdGhlIFxmSXByb3h5YXJwXGZSIG9wdGlvbi4gIFRoZSBzeXN0ZW0gYWRtaW5pc3RyYXRvciB3aG8KLXdpc2hlcyB0byBwcmV2ZW50IHVzZXJzIGZyb20gY3JlYXRpbmcgcHJveHkgQVJQIGVudHJpZXMgd2l0aCBwcHBkIGNhbgotZG8gc28gYnkgcGxhY2luZyB0aGlzIG9wdGlvbiBpbiB0aGUgL2V0Yy9wcHAvb3B0aW9ucyBmaWxlLgotLlRQCi0uQiBub3JlbW90ZWlwCi1BbGxvdyBwcHBkIHRvIG9wZXJhdGUgd2l0aG91dCBoYXZpbmcgYW4gSVAgYWRkcmVzcyBmb3IgdGhlIHBlZXIuICBUaGlzCi1vcHRpb24gaXMgb25seSBhdmFpbGFibGUgdW5kZXIgTGludXguICBOb3JtYWxseSwgcHBwZCB3aWxsIHJlcXVlc3QgdGhlCi1wZWVyJ3MgSVAgYWRkcmVzcywgYW5kIGlmIHRoZSBwZWVyIGRvZXMgbm90IHN1cHBseSBpdCwgcHBwZCB3aWxsIHVzZQotYW4gYXJiaXRyYXJ5IGFkZHJlc3MgaW4gdGhlIDEwLngueC54IHN1Ym5ldC4KLVdpdGggdGhpcyBvcHRpb24sIGlmIHRoZSBwZWVyIGRvZXMKLW5vdCBzdXBwbHkgaXRzIElQIGFkZHJlc3MsIHBwcGQgd2lsbCBub3QgYXNrIHRoZSBwZWVyIGZvciBpdCwgYW5kIHdpbGwKLW5vdCBzZXQgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhlIHBwcCBpbnRlcmZhY2UuICBJbiB0aGlzCi1zaXR1YXRpb24sIHRoZSBwcHAgaW50ZXJmYWNlIGNhbiBiZSB1c2VkIGZvciByb3V0aW5nIGJ5IGNyZWF0aW5nCi1kZXZpY2Ugcm91dGVzLCBidXQgdGhlIHBlZXIgaXRzZWxmIGNhbm5vdCBiZSBhZGRyZXNzZWQgZGlyZWN0bHkgZm9yIElQCi10cmFmZmljLgotLlRQCi0uQiBub3R0eQotTm9ybWFsbHksIHBwcGQgcmVxdWlyZXMgYSB0ZXJtaW5hbCBkZXZpY2UuICBXaXRoIHRoaXMgb3B0aW9uLCBwcHBkCi13aWxsIGFsbG9jYXRlIGl0c2VsZiBhIHBzZXVkby10dHkgbWFzdGVyL3NsYXZlIHBhaXIgYW5kIHVzZSB0aGUgc2xhdmUKLWFzIGl0cyB0ZXJtaW5hbCBkZXZpY2UuICBQcHBkIHdpbGwgY3JlYXRlIGEgY2hpbGQgcHJvY2VzcyB0byBhY3QgYXMgYQotYGNoYXJhY3RlciBzaHVudCcgdG8gdHJhbnNmZXIgY2hhcmFjdGVycyBiZXR3ZWVuIHRoZSBwc2V1ZG8tdHR5IG1hc3RlcgotYW5kIGl0cyBzdGFuZGFyZCBpbnB1dCBhbmQgb3V0cHV0LiAgVGh1cyBwcHBkIHdpbGwgdHJhbnNtaXQgY2hhcmFjdGVycwotb24gaXRzIHN0YW5kYXJkIG91dHB1dCBhbmQgcmVjZWl2ZSBjaGFyYWN0ZXJzIG9uIGl0cyBzdGFuZGFyZCBpbnB1dAotZXZlbiBpZiB0aGV5IGFyZSBub3QgdGVybWluYWwgZGV2aWNlcy4gIFRoaXMgb3B0aW9uIGluY3JlYXNlcyB0aGUKLWxhdGVuY3kgYW5kIENQVSBvdmVyaGVhZCBvZiB0cmFuc2ZlcnJpbmcgZGF0YSBvdmVyIHRoZSBwcHAgaW50ZXJmYWNlCi1hcyBhbGwgb2YgdGhlIGNoYXJhY3RlcnMgc2VudCBhbmQgcmVjZWl2ZWQgbXVzdCBmbG93IHRocm91Z2ggdGhlCi1jaGFyYWN0ZXIgc2h1bnQgcHJvY2Vzcy4gIEFuIGV4cGxpY2l0IGRldmljZSBuYW1lIG1heSBub3QgYmUgZ2l2ZW4gaWYKLXRoaXMgb3B0aW9uIGlzIHVzZWQuCi0uVFAKLS5CIG5vdmoKLURpc2FibGUgVmFuIEphY29ic29uIHN0eWxlIFRDUC9JUCBoZWFkZXIgY29tcHJlc3Npb24gaW4gYm90aCB0aGUKLXRyYW5zbWl0IGFuZCB0aGUgcmVjZWl2ZSBkaXJlY3Rpb24uCi0uVFAKLS5CIG5vdmpjY29tcAotRGlzYWJsZSB0aGUgY29ubmVjdGlvbi1JRCBjb21wcmVzc2lvbiBvcHRpb24gaW4gVmFuIEphY29ic29uIHN0eWxlCi1UQ1AvSVAgaGVhZGVyIGNvbXByZXNzaW9uLiAgV2l0aCB0aGlzIG9wdGlvbiwgcHBwZCB3aWxsIG5vdCBvbWl0IHRoZQotY29ubmVjdGlvbi1JRCBieXRlIGZyb20gVmFuIEphY29ic29uIGNvbXByZXNzZWQgVENQL0lQIGhlYWRlcnMsIG5vcgotYXNrIHRoZSBwZWVyIHRvIGRvIHNvLgotLlRQCi0uQiBwYXBjcnlwdAotSW5kaWNhdGVzIHRoYXQgYWxsIHNlY3JldHMgaW4gdGhlIC9ldGMvcHBwL3BhcFwtc2VjcmV0cyBmaWxlIHdoaWNoIGFyZQotdXNlZCBmb3IgY2hlY2tpbmcgdGhlIGlkZW50aXR5IG9mIHRoZSBwZWVyIGFyZSBlbmNyeXB0ZWQsIGFuZCB0aHVzCi1wcHBkIHNob3VsZCBub3QgYWNjZXB0IGEgcGFzc3dvcmQgd2hpY2gsIGJlZm9yZSBlbmNyeXB0aW9uLCBpcwotaWRlbnRpY2FsIHRvIHRoZSBzZWNyZXQgZnJvbSB0aGUgL2V0Yy9wcHAvcGFwXC1zZWNyZXRzIGZpbGUuCi0uVFAKLS5CIHBhcFwtbWF4XC1hdXRocmVxIFxmSW4KLVNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgUEFQIGF1dGhlbnRpY2F0ZS1yZXF1ZXN0IHRyYW5zbWlzc2lvbnMgdG8KLVxmSW5cZlIgKGRlZmF1bHQgMTApLgotLlRQCi0uQiBwYXBcLXJlc3RhcnQgXGZJbgotU2V0IHRoZSBQQVAgcmVzdGFydCBpbnRlcnZhbCAocmV0cmFuc21pc3Npb24gdGltZW91dCkgdG8gXGZJblxmUgotc2Vjb25kcyAoZGVmYXVsdCAzKS4KLS5UUAotLkIgcGFwXC10aW1lb3V0IFxmSW4KLVNldCB0aGUgbWF4aW11bSB0aW1lIHRoYXQgcHBwZCB3aWxsIHdhaXQgZm9yIHRoZSBwZWVyIHRvIGF1dGhlbnRpY2F0ZQotaXRzZWxmIHdpdGggUEFQIHRvIFxmSW5cZlIgc2Vjb25kcyAoMCBtZWFucyBubyBsaW1pdCkuCi0uVFAKLS5CIHBhc3NcLWZpbHRlciBcZklmaWx0ZXJcLWV4cHJlc3Npb24KLVNwZWNpZmllcyBhIHBhY2tldCBmaWx0ZXIgdG8gYXBwbGllZCB0byBkYXRhIHBhY2tldHMgYmVpbmcgc2VudCBvcgotcmVjZWl2ZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIHBhY2tldHMgc2hvdWxkIGJlIGFsbG93ZWQgdG8gcGFzcy4KLVBhY2tldHMgd2hpY2ggYXJlIHJlamVjdGVkIGJ5IHRoZSBmaWx0ZXIgYXJlIHNpbGVudGx5IGRpc2NhcmRlZC4gIFRoaXMKLW9wdGlvbiBjYW4gYmUgdXNlZCB0byBwcmV2ZW50IHNwZWNpZmljIG5ldHdvcmsgZGFlbW9ucyAoc3VjaCBhcwotcm91dGVkKSB1c2luZyB1cCBsaW5rIGJhbmR3aWR0aCwgb3IgdG8gcHJvdmlkZSBhIHZlcnkgYmFzaWMgZmlyZXdhbGwKLWNhcGFiaWxpdHkuCi1UaGUgXGZJZmlsdGVyXC1leHByZXNzaW9uXGZSIHN5bnRheCBpcyBhcyBkZXNjcmliZWQgZm9yIHRjcGR1bXAoMSksCi1leGNlcHQgdGhhdCBxdWFsaWZpZXJzIHdoaWNoIGFyZSBpbmFwcHJvcHJpYXRlIGZvciBhIFBQUCBsaW5rLCBzdWNoIGFzCi1cZkJldGhlclxmUiBhbmQgXGZCYXJwXGZSLCBhcmUgbm90IHBlcm1pdHRlZC4gIEdlbmVyYWxseSB0aGUgZmlsdGVyCi1leHByZXNzaW9uIHNob3VsZCBiZSBlbmNsb3NlZCBpbiBzaW5nbGUtcXVvdGVzIHRvIHByZXZlbnQgd2hpdGVzcGFjZQotaW4gdGhlIGV4cHJlc3Npb24gZnJvbSBiZWluZyBpbnRlcnByZXRlZCBieSB0aGUgc2hlbGwuICBOb3RlIHRoYXQgaXQKLWlzIHBvc3NpYmxlIHRvIGFwcGx5IGRpZmZlcmVudCBjb25zdHJhaW50cyB0byBpbmNvbWluZyBhbmQgb3V0Z29pbmcKLXBhY2tldHMgdXNpbmcgdGhlIFxmQmluYm91bmRcZlIgYW5kIFxmQm91dGJvdW5kXGZSIHF1YWxpZmllcnMuIFRoaXMKLW9wdGlvbiBpcyBjdXJyZW50bHkgb25seSBhdmFpbGFibGUgdW5kZXIgTGludXgsIGFuZCByZXF1aXJlcyB0aGF0IHRoZQota2VybmVsIHdhcyBjb25maWd1cmVkIHRvIGluY2x1ZGUgUFBQIGZpbHRlcmluZyBzdXBwb3J0IChDT05GSUdfUFBQX0ZJTFRFUikuCi0uVFAKLS5CIHBhc3N3b3JkIFxmSXBhc3N3b3JkXC1zdHJpbmcKLVNwZWNpZmllcyB0aGUgcGFzc3dvcmQgdG8gdXNlIGZvciBhdXRoZW50aWNhdGluZyB0byB0aGUgcGVlci4gIFVzZQotb2YgdGhpcyBvcHRpb24gaXMgZGlzY291cmFnZWQsIGFzIHRoZSBwYXNzd29yZCBpcyBsaWtlbHkgdG8gYmUgdmlzaWJsZQotdG8gb3RoZXIgdXNlcnMgb24gdGhlIHN5c3RlbSAoZm9yIGV4YW1wbGUsIGJ5IHVzaW5nIHBzKDEpKS4KLS5UUAotLkIgcGVyc2lzdAotRG8gbm90IGV4aXQgYWZ0ZXIgYSBjb25uZWN0aW9uIGlzIHRlcm1pbmF0ZWQ7IGluc3RlYWQgdHJ5IHRvIHJlb3BlbgotdGhlIGNvbm5lY3Rpb24uIFRoZSBcZkJtYXhmYWlsXGZSIG9wdGlvbiBzdGlsbCBoYXMgYW4gZWZmZWN0IG9uCi1wZXJzaXN0ZW50IGNvbm5lY3Rpb25zLgotLlRQCi0uQiBwbHVnaW4gXGZJZmlsZW5hbWUKLUxvYWQgdGhlIHNoYXJlZCBsaWJyYXJ5IG9iamVjdCBmaWxlIFxmSWZpbGVuYW1lXGZSIGFzIGEgcGx1Z2luLiAgVGhpcwotaXMgYSBwcml2aWxlZ2VkIG9wdGlvbi4gIElmIFxmSWZpbGVuYW1lXGZSIGRvZXMgbm90IGNvbnRhaW4gYSBzbGFzaAotKC8pLCBwcHBkIHdpbGwgbG9vayBpbiB0aGUgXGZCL3Vzci9saWIvcHBwZC9cZkl2ZXJzaW9uXGZSIGRpcmVjdG9yeQotZm9yIHRoZSBwbHVnaW4sIHdoZXJlCi1cZkl2ZXJzaW9uXGZSIGlzIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBwcHBkIChmb3IgZXhhbXBsZSwgMi40LjIpLgotLlRQCi0uQiBwcmVkaWN0b3IxCi1SZXF1ZXN0IHRoYXQgdGhlIHBlZXIgY29tcHJlc3MgZnJhbWVzIHRoYXQgaXQgc2VuZHMgdXNpbmcgUHJlZGljdG9yLTEKLWNvbXByZXNzaW9uLCBhbmQgYWdyZWUgdG8gY29tcHJlc3MgdHJhbnNtaXR0ZWQgZnJhbWVzIHdpdGggUHJlZGljdG9yLTEKLWlmIHJlcXVlc3RlZC4gIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgdW5sZXNzIHRoZSBrZXJuZWwgZHJpdmVyCi1zdXBwb3J0cyBQcmVkaWN0b3ItMSBjb21wcmVzc2lvbi4KLS5UUAotLkIgcHJpdmdyb3VwIFxmSWdyb3VwXC1uYW1lCi1BbGxvd3MgbWVtYmVycyBvZiBncm91cCBcZklncm91cFwtbmFtZVxmUiB0byB1c2UgcHJpdmlsZWdlZCBvcHRpb25zLgotVGhpcyBpcyBhIHByaXZpbGVnZWQgb3B0aW9uLiAgVXNlIG9mIHRoaXMgb3B0aW9uIHJlcXVpcmVzIGNhcmUgYXMKLXRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IG1lbWJlcnMgb2YgXGZJZ3JvdXBcLW5hbWVcZlIgY2Fubm90IHVzZSBwcHBkCi10byBiZWNvbWUgcm9vdCB0aGVtc2VsdmVzLiAgQ29uc2lkZXIgaXQgZXF1aXZhbGVudCB0byBwdXR0aW5nIHRoZQotbWVtYmVycyBvZiBcZklncm91cFwtbmFtZVxmUiBpbiB0aGUga21lbSBvciBkaXNrIGdyb3VwLgotLlRQCi0uQiBwcm94eWFycAotQWRkIGFuIGVudHJ5IHRvIHRoaXMgc3lzdGVtJ3MgQVJQIFtBZGRyZXNzIFJlc29sdXRpb24gUHJvdG9jb2xdIHRhYmxlCi13aXRoIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBwZWVyIGFuZCB0aGUgRXRoZXJuZXQgYWRkcmVzcyBvZiB0aGlzCi1zeXN0ZW0uICBUaGlzIHdpbGwgaGF2ZSB0aGUgZWZmZWN0IG9mIG1ha2luZyB0aGUgcGVlciBhcHBlYXIgdG8gb3RoZXIKLXN5c3RlbXMgdG8gYmUgb24gdGhlIGxvY2FsIGV0aGVybmV0LgotLlRQCi0uQiBwdHkgXGZJc2NyaXB0Ci1TcGVjaWZpZXMgdGhhdCB0aGUgY29tbWFuZCBcZklzY3JpcHRcZlIgaXMgdG8gYmUgdXNlZCB0byBjb21tdW5pY2F0ZQotcmF0aGVyIHRoYW4gYSBzcGVjaWZpYyB0ZXJtaW5hbCBkZXZpY2UuICBQcHBkIHdpbGwgYWxsb2NhdGUgaXRzZWxmIGEKLXBzZXVkby10dHkgbWFzdGVyL3NsYXZlIHBhaXIgYW5kIHVzZSB0aGUgc2xhdmUgYXMgaXRzIHRlcm1pbmFsCi1kZXZpY2UuICBUaGUgXGZJc2NyaXB0XGZSIHdpbGwgYmUgcnVuIGluIGEgY2hpbGQgcHJvY2VzcyB3aXRoIHRoZQotcHNldWRvLXR0eSBtYXN0ZXIgYXMgaXRzIHN0YW5kYXJkIGlucHV0IGFuZCBvdXRwdXQuICBBbiBleHBsaWNpdAotZGV2aWNlIG5hbWUgbWF5IG5vdCBiZSBnaXZlbiBpZiB0aGlzIG9wdGlvbiBpcyB1c2VkLiAgKE5vdGU6IGlmIHRoZQotXGZJcmVjb3JkXGZSIG9wdGlvbiBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFxmSXB0eVxmUiBvcHRpb24sCi10aGUgY2hpbGQgcHJvY2VzcyB3aWxsIGhhdmUgcGlwZXMgb24gaXRzIHN0YW5kYXJkIGlucHV0IGFuZCBvdXRwdXQuKQotLlRQCi0uQiByZWNlaXZlXC1hbGwKLVdpdGggdGhpcyBvcHRpb24sIHBwcGQgd2lsbCBhY2NlcHQgYWxsIGNvbnRyb2wgY2hhcmFjdGVycyBmcm9tIHRoZQotcGVlciwgaW5jbHVkaW5nIHRob3NlIG1hcmtlZCBpbiB0aGUgcmVjZWl2ZSBhc3luY21hcC4gIFdpdGhvdXQgdGhpcwotb3B0aW9uLCBwcHBkIHdpbGwgZGlzY2FyZCB0aG9zZSBjaGFyYWN0ZXJzIGFzIHNwZWNpZmllZCBpbiBSRkMxNjYyLgotVGhpcyBvcHRpb24gc2hvdWxkIG9ubHkgYmUgbmVlZGVkIGlmIHRoZSBwZWVyIGlzIGJ1Z2d5LgotLlRQCi0uQiByZWNvcmQgXGZJZmlsZW5hbWUKLVNwZWNpZmllcyB0aGF0IHBwcGQgc2hvdWxkIHJlY29yZCBhbGwgY2hhcmFjdGVycyBzZW50IGFuZCByZWNlaXZlZCB0bwotYSBmaWxlIG5hbWVkIFxmSWZpbGVuYW1lXGZSLiAgVGhpcyBmaWxlIGlzIG9wZW5lZCBpbiBhcHBlbmQgbW9kZSwKLXVzaW5nIHRoZSB1c2VyJ3MgdXNlci1JRCBhbmQgcGVybWlzc2lvbnMuICBUaGlzIG9wdGlvbiBpcyBpbXBsZW1lbnRlZAotdXNpbmcgYSBwc2V1ZG8tdHR5IGFuZCBhIHByb2Nlc3MgdG8gdHJhbnNmZXIgY2hhcmFjdGVycyBiZXR3ZWVuIHRoZQotcHNldWRvLXR0eSBhbmQgdGhlIHJlYWwgc2VyaWFsIGRldmljZSwgc28gaXQgd2lsbCBpbmNyZWFzZSB0aGUgbGF0ZW5jeQotYW5kIENQVSBvdmVyaGVhZCBvZiB0cmFuc2ZlcnJpbmcgZGF0YSBvdmVyIHRoZSBwcHAgaW50ZXJmYWNlLiAgVGhlCi1jaGFyYWN0ZXJzIGFyZSBzdG9yZWQgaW4gYSB0YWdnZWQgZm9ybWF0IHdpdGggdGltZXN0YW1wcywgd2hpY2ggY2FuIGJlCi1kaXNwbGF5ZWQgaW4gcmVhZGFibGUgZm9ybSB1c2luZyB0aGUgcHBwZHVtcCg4KSBwcm9ncmFtLgotLlRQCi0uQiByZW1vdGVuYW1lIFxmSW5hbWUKLVNldCB0aGUgYXNzdW1lZCBuYW1lIG9mIHRoZSByZW1vdGUgc3lzdGVtIGZvciBhdXRoZW50aWNhdGlvbiBwdXJwb3NlcwotdG8gXGZJbmFtZVxmUi4KLS5UUAotLkIgcmVtb3RlbnVtYmVyIFxmSW51bWJlcgotU2V0IHRoZSBhc3N1bWVkIHRlbGVwaG9uZSBudW1iZXIgb2YgdGhlIHJlbW90ZSBzeXN0ZW0gZm9yIGF1dGhlbnRpY2F0aW9uCi1wdXJwb3NlcyB0byBcZkludW1iZXJcZlIuCi0uVFAKLS5CIHJlZnVzZVwtY2hhcAotV2l0aCB0aGlzIG9wdGlvbiwgcHBwZCB3aWxsIG5vdCBhZ3JlZSB0byBhdXRoZW50aWNhdGUgaXRzZWxmIHRvIHRoZQotcGVlciB1c2luZyBDSEFQLgotLlRQCi0uQiByZWZ1c2VcLW1zY2hhcAotV2l0aCB0aGlzIG9wdGlvbiwgcHBwZCB3aWxsIG5vdCBhZ3JlZSB0byBhdXRoZW50aWNhdGUgaXRzZWxmIHRvIHRoZQotcGVlciB1c2luZyBNU1wtQ0hBUC4KLS5UUAotLkIgcmVmdXNlXC1tc2NoYXBcLXYyCi1XaXRoIHRoaXMgb3B0aW9uLCBwcHBkIHdpbGwgbm90IGFncmVlIHRvIGF1dGhlbnRpY2F0ZSBpdHNlbGYgdG8gdGhlCi1wZWVyIHVzaW5nIE1TXC1DSEFQdjIuCi0uVFAKLS5CIHJlZnVzZVwtZWFwCi1XaXRoIHRoaXMgb3B0aW9uLCBwcHBkIHdpbGwgbm90IGFncmVlIHRvIGF1dGhlbnRpY2F0ZSBpdHNlbGYgdG8gdGhlCi1wZWVyIHVzaW5nIEVBUC4KLS5UUAotLkIgcmVmdXNlXC1wYXAKLVdpdGggdGhpcyBvcHRpb24sIHBwcGQgd2lsbCBub3QgYWdyZWUgdG8gYXV0aGVudGljYXRlIGl0c2VsZiB0byB0aGUKLXBlZXIgdXNpbmcgUEFQLgotLlRQCi0uQiByZXF1aXJlXC1jaGFwCi1SZXF1aXJlIHRoZSBwZWVyIHRvIGF1dGhlbnRpY2F0ZSBpdHNlbGYgdXNpbmcgQ0hBUCBbQ2hhbGxlbmdlCi1IYW5kc2hha2UgQXV0aGVudGljYXRpb24gUHJvdG9jb2xdIGF1dGhlbnRpY2F0aW9uLgotLlRQCi0uQiByZXF1aXJlXC1tcHBlCi1SZXF1aXJlIHRoZSB1c2Ugb2YgTVBQRSAoTWljcm9zb2Z0IFBvaW50IHRvIFBvaW50IEVuY3J5cHRpb24pLiAgVGhpcwotb3B0aW9uIGRpc2FibGVzIGFsbCBvdGhlciBjb21wcmVzc2lvbiB0eXBlcy4gIFRoaXMgb3B0aW9uIGVuYWJsZXMKLWJvdGggNDAtYml0IGFuZCAxMjgtYml0IGVuY3J5cHRpb24uICBJbiBvcmRlciBmb3IgTVBQRSB0byBzdWNjZXNzZnVsbHkKLWNvbWUgdXAsIHlvdSBtdXN0IGhhdmUgYXV0aGVudGljYXRlZCB3aXRoIGVpdGhlciBNU1wtQ0hBUCBvciBNU1wtQ0hBUHYyLgotVGhpcyBvcHRpb24gaXMgcHJlc2VudGx5IG9ubHkgc3VwcG9ydGVkIHVuZGVyIExpbnV4LCBhbmQgb25seSBpZiB5b3VyCi1rZXJuZWwgaGFzIGJlZW4gY29uZmlndXJlZCB0byBpbmNsdWRlIE1QUEUgc3VwcG9ydC4KLS5UUAotLkIgcmVxdWlyZVwtbXBwZVwtNDAKLVJlcXVpcmUgdGhlIHVzZSBvZiBNUFBFLCB3aXRoIDQwLWJpdCBlbmNyeXB0aW9uLgotLlRQCi0uQiByZXF1aXJlXC1tcHBlXC0xMjgKLVJlcXVpcmUgdGhlIHVzZSBvZiBNUFBFLCB3aXRoIDEyOC1iaXQgZW5jcnlwdGlvbi4KLS5UUAotLkIgcmVxdWlyZVwtbXNjaGFwCi1SZXF1aXJlIHRoZSBwZWVyIHRvIGF1dGhlbnRpY2F0ZSBpdHNlbGYgdXNpbmcgTVNcLUNIQVAgW01pY3Jvc29mdCBDaGFsbGVuZ2UKLUhhbmRzaGFrZSBBdXRoZW50aWNhdGlvbiBQcm90b2NvbF0gYXV0aGVudGljYXRpb24uCi0uVFAKLS5CIHJlcXVpcmVcLW1zY2hhcFwtdjIKLVJlcXVpcmUgdGhlIHBlZXIgdG8gYXV0aGVudGljYXRlIGl0c2VsZiB1c2luZyBNU1wtQ0hBUHYyIFtNaWNyb3NvZnQgQ2hhbGxlbmdlCi1IYW5kc2hha2UgQXV0aGVudGljYXRpb24gUHJvdG9jb2wsIFZlcnNpb24gMl0gYXV0aGVudGljYXRpb24uCi0uVFAKLS5CIHJlcXVpcmVcLWVhcAotUmVxdWlyZSB0aGUgcGVlciB0byBhdXRoZW50aWNhdGUgaXRzZWxmIHVzaW5nIEVBUCBbRXh0ZW5zaWJsZQotQXV0aGVudGljYXRpb24gUHJvdG9jb2xdIGF1dGhlbnRpY2F0aW9uLgotLlRQCi0uQiByZXF1aXJlXC1wYXAKLVJlcXVpcmUgdGhlIHBlZXIgdG8gYXV0aGVudGljYXRlIGl0c2VsZiB1c2luZyBQQVAgW1Bhc3N3b3JkCi1BdXRoZW50aWNhdGlvbiBQcm90b2NvbF0gYXV0aGVudGljYXRpb24uCi0uVFAKLS5CIHNldCBcZkluYW1lXGZSPVxmSXZhbHVlCi1TZXQgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIHNjcmlwdHMgdGhhdCBhcmUgaW52b2tlZCBieSBwcHBkLgotV2hlbiBzZXQgYnkgYSBwcml2aWxlZ2VkIHNvdXJjZSwgdGhlIHZhcmlhYmxlIHNwZWNpZmllZCBieSBcZkluYW1lXGZSCi1jYW5ub3QgYmUgY2hhbmdlZCBieSBvcHRpb25zIGNvbnRhaW5lZCBpbiBhbiB1bnByaXZpbGVnZWQgc291cmNlLiAgU2VlCi1hbHNvIHRoZSBcZkl1bnNldFxmUiBvcHRpb24gYW5kIHRoZSBlbnZpcm9ubWVudCBkZXNjcmliZWQgaW4KLVxmSVNDUklQVFNcZlIuCi0uVFAKLS5CIHNob3dcLXBhc3N3b3JkCi1XaGVuIGxvZ2dpbmcgdGhlIGNvbnRlbnRzIG9mIFBBUCBwYWNrZXRzLCB0aGlzIG9wdGlvbiBjYXVzZXMgcHBwZCB0bwotc2hvdyB0aGUgcGFzc3dvcmQgc3RyaW5nIGluIHRoZSBsb2cgbWVzc2FnZS4KLS5UUAotLkIgc2lsZW50Ci1XaXRoIHRoaXMgb3B0aW9uLCBwcHBkIHdpbGwgbm90IHRyYW5zbWl0IExDUCBwYWNrZXRzIHRvIGluaXRpYXRlIGEKLWNvbm5lY3Rpb24gdW50aWwgYSB2YWxpZCBMQ1AgcGFja2V0IGlzIHJlY2VpdmVkIGZyb20gdGhlIHBlZXIgKGFzIGZvcgotdGhlIGBwYXNzaXZlJyBvcHRpb24gd2l0aCBhbmNpZW50IHZlcnNpb25zIG9mIHBwcGQpLgotLlRQCi0uQiBzcnBcLWludGVydmFsIFxmSW4KLUlmIHRoaXMgcGFyYW1ldGVyIGlzIGdpdmVuIGFuZCBwcHBkIHVzZXMgRUFQIFNSUFwtU0hBMSB0byBhdXRoZW50aWNhdGUKLXRoZSBwZWVyIChpLmUuLCBpcyB0aGUgc2VydmVyKSwgdGhlbiBwcHBkIHdpbGwgdXNlIHRoZSBvcHRpb25hbAotbGlnaHR3ZWlnaHQgU1JQIHJlY2hhbGxlbmdlIG1lY2hhbmlzbSBhdCBpbnRlcnZhbHMgb2YgXGZJblxmUgotc2Vjb25kcy4gIFRoaXMgb3B0aW9uIGlzIGZhc3RlciB0aGFuIFxmQmVhcFwtaW50ZXJ2YWxcZlIKLXJlYXV0aGVudGljYXRpb24gYmVjYXVzZSBpdCB1c2VzIGEgaGFzaFwtYmFzZWQgbWVjaGFuaXNtIGFuZCBkb2VzIG5vdAotZGVyaXZlIGEgbmV3IHNlc3Npb24ga2V5LgotLlRQCi0uQiBzcnBcLXBuXC1zZWNyZXQgXGZJc3RyaW5nCi1TZXQgdGhlIGxvbmctdGVybSBwc2V1ZG9ueW0tZ2VuZXJhdGluZyBzZWNyZXQgZm9yIHRoZSBzZXJ2ZXIuICBUaGlzCi12YWx1ZSBpcyBvcHRpb25hbCBhbmQgaWYgc2V0LCBuZWVkcyB0byBiZSBrbm93biBhdCB0aGUgc2VydmVyCi0oYXV0aGVudGljYXRvcikgc2lkZSBvbmx5LCBhbmQgc2hvdWxkIGJlIGRpZmZlcmVudCBmb3IgZWFjaCBzZXJ2ZXIgKG9yCi1wb2xsIG9mIGlkZW50aWNhbCBzZXJ2ZXJzKS4gIEl0IGlzIHVzZWQgYWxvbmcgd2l0aCB0aGUgY3VycmVudCBkYXRlIHRvCi1nZW5lcmF0ZSBhIGtleSB0byBlbmNyeXB0IGFuZCBkZWNyeXB0IHRoZSBjbGllbnQncyBpZGVudGl0eSBjb250YWluZWQKLWluIHRoZSBwc2V1ZG9ueW0uCi0uVFAKLS5CIHNycFwtdXNlXC1wc2V1ZG9ueW0KLVdoZW4gb3BlcmF0aW5nIGFzIGFuIEVBUCBTUlBcLVNIQTEgY2xpZW50LCBhdHRlbXB0IHRvIHVzZSB0aGUgcHNldWRvbnltCi1zdG9yZWQgaW4gfi8ucHBwX3BzZXVkb255bSBmaXJzdCBhcyB0aGUgaWRlbnRpdHksIGFuZCBzYXZlIGluIHRoaXMKLWZpbGUgYW55IHBzZXVkb255bSBvZmZlcmVkIGJ5IHRoZSBwZWVyIGR1cmluZyBhdXRoZW50aWNhdGlvbi4KLS5UUAotLkIgc3luYwotVXNlIHN5bmNocm9ub3VzIEhETEMgc2VyaWFsIGVuY29kaW5nIGluc3RlYWQgb2YgYXN5bmNocm9ub3VzLgotVGhlIGRldmljZSB1c2VkIGJ5IHBwcGQgd2l0aCB0aGlzIG9wdGlvbiBtdXN0IGhhdmUgc3luYyBzdXBwb3J0LgotQ3VycmVudGx5IHN1cHBvcnRzIE1pY3JvZ2F0ZSBTeW5jTGluayBhZGFwdGVycwotdW5kZXIgTGludXggYW5kIEZyZWVCU0QgMi4yLjggYW5kIGxhdGVyLgotLlRQCi0uQiB1bml0IFxmSW51bQotU2V0cyB0aGUgcHBwIHVuaXQgbnVtYmVyIChmb3IgYSBwcHAwIG9yIHBwcDEgZXRjIGludGVyZmFjZSBuYW1lKSBmb3Igb3V0Ym91bmQKLWNvbm5lY3Rpb25zLgotLlRQCi0uQiB1bnNldCBcZkluYW1lCi1SZW1vdmUgYSB2YXJpYWJsZSBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3Igc2NyaXB0cyB0aGF0IGFyZQotaW52b2tlZCBieSBwcHBkLiAgV2hlbiBzcGVjaWZpZWQgYnkgYSBwcml2aWxlZ2VkIHNvdXJjZSwgdGhlIHZhcmlhYmxlCi1cZkluYW1lXGZSIGNhbm5vdCBiZSBzZXQgYnkgb3B0aW9ucyBjb250YWluZWQgaW4gYW4gdW5wcml2aWxlZ2VkCi1zb3VyY2UuICBTZWUgYWxzbyB0aGUgXGZJc2V0XGZSIG9wdGlvbiBhbmQgdGhlIGVudmlyb25tZW50IGRlc2NyaWJlZAotaW4gXGZJU0NSSVBUU1xmUi4KLS5UUAotLkIgdXBkZXRhY2gKLVdpdGggdGhpcyBvcHRpb24sIHBwcGQgd2lsbCBkZXRhY2ggZnJvbSBpdHMgY29udHJvbGxpbmcgdGVybWluYWwgb25jZQotaXQgaGFzIHN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZCB0aGUgcHBwIGNvbm5lY3Rpb24gKHRvIHRoZSBwb2ludCB3aGVyZQotdGhlIGZpcnN0IG5ldHdvcmsgY29udHJvbCBwcm90b2NvbCwgdXN1YWxseSB0aGUgSVAgY29udHJvbCBwcm90b2NvbCwKLWhhcyBjb21lIHVwKS4KLS5UUAotLkIgdXNlaG9zdG5hbWUKLUVuZm9yY2UgdGhlIHVzZSBvZiB0aGUgaG9zdG5hbWUgKHdpdGggZG9tYWluIG5hbWUgYXBwZW5kZWQsIGlmIGdpdmVuKQotYXMgdGhlIG5hbWUgb2YgdGhlIGxvY2FsIHN5c3RlbSBmb3IgYXV0aGVudGljYXRpb24gcHVycG9zZXMgKG92ZXJyaWRlcwotdGhlIFxmSW5hbWVcZlIgb3B0aW9uKS4gIFRoaXMgb3B0aW9uIGlzIG5vdCBub3JtYWxseSBuZWVkZWQgc2luY2UgdGhlCi1cZkluYW1lXGZSIG9wdGlvbiBpcyBwcml2aWxlZ2VkLgotLlRQCi0uQiB1c2VwZWVyZG5zCi1Bc2sgdGhlIHBlZXIgZm9yIHVwIHRvIDIgRE5TIHNlcnZlciBhZGRyZXNzZXMuICBUaGUgYWRkcmVzc2VzIHN1cHBsaWVkCi1ieSB0aGUgcGVlciAoaWYgYW55KSBhcmUgcGFzc2VkIHRvIHRoZSAvZXRjL3BwcC9pcFwtdXAgc2NyaXB0IGluIHRoZQotZW52aXJvbm1lbnQgdmFyaWFibGVzIEROUzEgYW5kIEROUzIsIGFuZCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLVVTRVBFRVJETlMgd2lsbCBiZSBzZXQgdG8gMS4gIEluIGFkZGl0aW9uLCBwcHBkIHdpbGwgY3JlYXRlIGFuCi0vZXRjL3BwcC9yZXNvbHYuY29uZiBmaWxlIGNvbnRhaW5pbmcgb25lIG9yIHR3byBuYW1lc2VydmVyIGxpbmVzIHdpdGgKLXRoZSBhZGRyZXNzKGVzKSBzdXBwbGllZCBieSB0aGUgcGVlci4KLS5UUAotLkIgdXNlciBcZkluYW1lCi1TZXRzIHRoZSBuYW1lIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW5nIHRoZSBsb2NhbCBzeXN0ZW0gdG8gdGhlIHBlZXIgdG8KLVxmSW5hbWVcZlIuCi0uVFAKLS5CIHZqXC1tYXhcLXNsb3RzIFxmSW4KLVNldHMgdGhlIG51bWJlciBvZiBjb25uZWN0aW9uIHNsb3RzIHRvIGJlIHVzZWQgYnkgdGhlIFZhbiBKYWNvYnNvbgotVENQL0lQIGhlYWRlciBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBjb2RlIHRvIFxmSW5cZlIsIHdoaWNoCi1tdXN0IGJlIGJldHdlZW4gMiBhbmQgMTYgKGluY2x1c2l2ZSkuCi0uVFAKLS5CIHdlbGNvbWUgXGZJc2NyaXB0Ci1SdW4gdGhlIGV4ZWN1dGFibGUgb3Igc2hlbGwgY29tbWFuZCBzcGVjaWZpZWQgYnkgXGZJc2NyaXB0XGZSIGJlZm9yZQotaW5pdGlhdGluZyBQUFAgbmVnb3RpYXRpb24sIGFmdGVyIHRoZSBjb25uZWN0IHNjcmlwdCAoaWYgYW55KSBoYXMKLWNvbXBsZXRlZC4gIEEgdmFsdWUgZm9yIHRoaXMgb3B0aW9uIGZyb20gYSBwcml2aWxlZ2VkIHNvdXJjZSBjYW5ub3QgYmUKLW92ZXJyaWRkZW4gYnkgYSBub24tcHJpdmlsZWdlZCB1c2VyLgotLlRQCi0uQiB4b254b2ZmCi1Vc2Ugc29mdHdhcmUgZmxvdyBjb250cm9sIChpLmUuIFhPTi9YT0ZGKSB0byBjb250cm9sIHRoZSBmbG93IG9mIGRhdGEgb24KLXRoZSBzZXJpYWwgcG9ydC4KLS5TSCBPUFRJT05TIEZJTEVTCi1PcHRpb25zIGNhbiBiZSB0YWtlbiBmcm9tIGZpbGVzIGFzIHdlbGwgYXMgdGhlIGNvbW1hbmQgbGluZS4gIFBwcGQKLXJlYWRzIG9wdGlvbnMgZnJvbSB0aGUgZmlsZXMgL2V0Yy9wcHAvb3B0aW9ucywgfi8ucHBwcmMgYW5kCi0vZXRjL3BwcC9vcHRpb25zLlxmSXR0eW5hbWVcZlIgKGluIHRoYXQgb3JkZXIpIGJlZm9yZSBwcm9jZXNzaW5nIHRoZQotb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lLiAgKEluIGZhY3QsIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucyBhcmUKLXNjYW5uZWQgdG8gZmluZCB0aGUgdGVybWluYWwgbmFtZSBiZWZvcmUgdGhlIG9wdGlvbnMuXGZJdHR5bmFtZVxmUgotZmlsZSBpcyByZWFkLikgIEluIGZvcm1pbmcgdGhlIG5hbWUgb2YgdGhlIG9wdGlvbnMuXGZJdHR5bmFtZVxmUiBmaWxlLAotdGhlIGluaXRpYWwgL2Rldi8gaXMgcmVtb3ZlZCBmcm9tIHRoZSB0ZXJtaW5hbCBuYW1lLCBhbmQgYW55IHJlbWFpbmluZwotLyBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCB3aXRoIGRvdHMuCi0uUFAKLUFuIG9wdGlvbnMgZmlsZSBpcyBwYXJzZWQgaW50byBhIHNlcmllcyBvZiB3b3JkcywgZGVsaW1pdGVkIGJ5Ci13aGl0ZXNwYWNlLiAgV2hpdGVzcGFjZSBjYW4gYmUgaW5jbHVkZWQgaW4gYSB3b3JkIGJ5IGVuY2xvc2luZyB0aGUKLXdvcmQgaW4gZG91YmxlLXF1b3RlcyAoIikuICBBIGJhY2tzbGFzaCAoXGUpIHF1b3RlcyB0aGUgZm9sbG93aW5nIGNoYXJhY3Rlci4KLUEgaGFzaCAoIykgc3RhcnRzIGEgY29tbWVudCwgd2hpY2ggY29udGludWVzIHVudGlsIHRoZSBlbmQgb2YgdGhlCi1saW5lLiAgVGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24gb24gdXNpbmcgdGhlIFxmSWZpbGVcZlIgb3IgXGZJY2FsbFxmUgotb3B0aW9ucyB3aXRoaW4gYW4gb3B0aW9ucyBmaWxlLgotLlNIIFNFQ1VSSVRZCi0uSSBwcHBkCi1wcm92aWRlcyBzeXN0ZW0gYWRtaW5pc3RyYXRvcnMgd2l0aCBzdWZmaWNpZW50IGFjY2VzcyBjb250cm9sIHRoYXQgUFBQCi1hY2Nlc3MgdG8gYSBzZXJ2ZXIgbWFjaGluZSBjYW4gYmUgcHJvdmlkZWQgdG8gbGVnaXRpbWF0ZSB1c2VycyB3aXRob3V0Ci1mZWFyIG9mIGNvbXByb21pc2luZyB0aGUgc2VjdXJpdHkgb2YgdGhlIHNlcnZlciBvciB0aGUgbmV0d29yayBpdCdzCi1vbi4gIFRoaXMgY29udHJvbCBpcyBwcm92aWRlZCB0aHJvdWdoIHJlc3RyaWN0aW9ucyBvbiB3aGljaCBJUAotYWRkcmVzc2VzIHRoZSBwZWVyIG1heSB1c2UsIGJhc2VkIG9uIGl0cyBhdXRoZW50aWNhdGVkIGlkZW50aXR5IChpZgotYW55KSwgYW5kIHRocm91Z2ggcmVzdHJpY3Rpb25zIG9uIHdoaWNoIG9wdGlvbnMgYSBub24tcHJpdmlsZWdlZCB1c2VyCi1tYXkgdXNlLiAgU2V2ZXJhbCBvZiBwcHBkJ3Mgb3B0aW9ucyBhcmUgcHJpdmlsZWdlZCwgaW4gcGFydGljdWxhcgotdGhvc2Ugd2hpY2ggcGVybWl0IHBvdGVudGlhbGx5IGluc2VjdXJlIGNvbmZpZ3VyYXRpb25zOyB0aGVzZSBvcHRpb25zCi1hcmUgb25seSBhY2NlcHRlZCBpbiBmaWxlcyB3aGljaCBhcmUgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIHN5c3RlbQotYWRtaW5pc3RyYXRvciwgb3IgaWYgcHBwZCBpcyBiZWluZyBydW4gYnkgcm9vdC4KLS5QUAotVGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIHBwcGQgaXMgdG8gYWxsb3cgYW4gdW5hdXRoZW50aWNhdGVkIHBlZXIgdG8KLXVzZSBhIGdpdmVuIElQIGFkZHJlc3Mgb25seSBpZiB0aGUgc3lzdGVtIGRvZXMgbm90IGFscmVhZHkgaGF2ZSBhCi1yb3V0ZSB0byB0aGF0IElQIGFkZHJlc3MuICBGb3IgZXhhbXBsZSwgYSBzeXN0ZW0gd2l0aCBhCi1wZXJtYW5lbnQgY29ubmVjdGlvbiB0byB0aGUgd2lkZXIgaW50ZXJuZXQgd2lsbCBub3JtYWxseSBoYXZlIGEKLWRlZmF1bHQgcm91dGUsIGFuZCB0aHVzIGFsbCBwZWVycyB3aWxsIGhhdmUgdG8gYXV0aGVudGljYXRlIHRoZW1zZWx2ZXMKLWluIG9yZGVyIHRvIHNldCB1cCBhIGNvbm5lY3Rpb24uICBPbiBzdWNoIGEgc3lzdGVtLCB0aGUgXGZJYXV0aFxmUgotb3B0aW9uIGlzIHRoZSBkZWZhdWx0LiAgT24gdGhlIG90aGVyIGhhbmQsIGEgc3lzdGVtIHdoZXJlIHRoZQotUFBQIGxpbmsgaXMgdGhlIG9ubHkgY29ubmVjdGlvbiB0byB0aGUgaW50ZXJuZXQgd2lsbCBub3Qgbm9ybWFsbHkgaGF2ZQotYSBkZWZhdWx0IHJvdXRlLCBzbyB0aGUgcGVlciB3aWxsIGJlIGFibGUgdG8gdXNlIGFsbW9zdCBhbnkgSVAgYWRkcmVzcwotd2l0aG91dCBhdXRoZW50aWNhdGluZyBpdHNlbGYuCi0uUFAKLUFzIGluZGljYXRlZCBhYm92ZSwgc29tZSBzZWN1cml0eS1zZW5zaXRpdmUgb3B0aW9ucyBhcmUgcHJpdmlsZWdlZCwKLXdoaWNoIG1lYW5zIHRoYXQgdGhleSBtYXkgbm90IGJlIHVzZWQgYnkgYW4gb3JkaW5hcnkgbm9uLXByaXZpbGVnZWQKLXVzZXIgcnVubmluZyBhIHNldHVpZC1yb290IHBwcGQsIGVpdGhlciBvbiB0aGUgY29tbWFuZCBsaW5lLCBpbiB0aGUKLXVzZXIncyB+Ly5wcHByYyBmaWxlLCBvciBpbiBhbiBvcHRpb25zIGZpbGUgcmVhZCB1c2luZyB0aGUgXGZJZmlsZVxmUgotb3B0aW9uLiAgUHJpdmlsZWdlZCBvcHRpb25zIG1heSBiZSB1c2VkIGluIC9ldGMvcHBwL29wdGlvbnMgZmlsZSBvciBpbgotYW4gb3B0aW9ucyBmaWxlIHJlYWQgdXNpbmcgdGhlIFxmSWNhbGxcZlIgb3B0aW9uLiAgSWYgcHBwZCBpcyBiZWluZwotcnVuIGJ5IHRoZSByb290IHVzZXIsIHByaXZpbGVnZWQgb3B0aW9ucyBjYW4gYmUgdXNlZCB3aXRob3V0Ci1yZXN0cmljdGlvbi4KLS5QUAotV2hlbiBvcGVuaW5nIHRoZSBkZXZpY2UsIHBwcGQgdXNlcyBlaXRoZXIgdGhlIGludm9raW5nIHVzZXIncyB1c2VyIElECi1vciB0aGUgcm9vdCBVSUQgKHRoYXQgaXMsIDApLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZGV2aWNlIG5hbWUgd2FzCi1zcGVjaWZpZWQgYnkgdGhlIHVzZXIgb3IgdGhlIHN5c3RlbSBhZG1pbmlzdHJhdG9yLiAgSWYgdGhlIGRldmljZSBuYW1lCi1jb21lcyBmcm9tIGEgcHJpdmlsZWdlZCBzb3VyY2UsIHRoYXQgaXMsIC9ldGMvcHBwL29wdGlvbnMgb3IgYW4KLW9wdGlvbnMgZmlsZSByZWFkIHVzaW5nIHRoZSBcZkljYWxsXGZSIG9wdGlvbiwgcHBwZCB1c2VzIGZ1bGwgcm9vdAotcHJpdmlsZWdlcyB3aGVuIG9wZW5pbmcgdGhlIGRldmljZS4gIFRodXMsIGJ5IGNyZWF0aW5nIGFuIGFwcHJvcHJpYXRlCi1maWxlIHVuZGVyIC9ldGMvcHBwL3BlZXJzLCB0aGUgc3lzdGVtIGFkbWluaXN0cmF0b3IgY2FuIGFsbG93IHVzZXJzIHRvCi1lc3RhYmxpc2ggYSBwcHAgY29ubmVjdGlvbiB2aWEgYSBkZXZpY2Ugd2hpY2ggdGhleSB3b3VsZCBub3Qgbm9ybWFsbHkKLWhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MuICBPdGhlcndpc2UgcHBwZCB1c2VzIHRoZSBpbnZva2luZyB1c2VyJ3MKLXJlYWwgVUlEIHdoZW4gb3BlbmluZyB0aGUgZGV2aWNlLgotLlNIIEFVVEhFTlRJQ0FUSU9OCi1BdXRoZW50aWNhdGlvbiBpcyB0aGUgcHJvY2VzcyB3aGVyZWJ5IG9uZSBwZWVyIGNvbnZpbmNlcyB0aGUgb3RoZXIgb2YKLWl0cyBpZGVudGl0eS4gIFRoaXMgaW52b2x2ZXMgdGhlIGZpcnN0IHBlZXIgc2VuZGluZyBpdHMgbmFtZSB0byB0aGUKLW90aGVyLCB0b2dldGhlciB3aXRoIHNvbWUga2luZCBvZiBzZWNyZXQgaW5mb3JtYXRpb24gd2hpY2ggY291bGQgb25seQotY29tZSBmcm9tIHRoZSBnZW51aW5lIGF1dGhvcml6ZWQgdXNlciBvZiB0aGF0IG5hbWUuICBJbiBzdWNoIGFuCi1leGNoYW5nZSwgd2Ugd2lsbCBjYWxsIHRoZSBmaXJzdCBwZWVyIHRoZSAiY2xpZW50IiBhbmQgdGhlIG90aGVyIHRoZQotInNlcnZlciIuICBUaGUgY2xpZW50IGhhcyBhIG5hbWUgYnkgd2hpY2ggaXQgaWRlbnRpZmllcyBpdHNlbGYgdG8gdGhlCi1zZXJ2ZXIsIGFuZCB0aGUgc2VydmVyIGFsc28gaGFzIGEgbmFtZSBieSB3aGljaCBpdCBpZGVudGlmaWVzIGl0c2VsZgotdG8gdGhlIGNsaWVudC4gIEdlbmVyYWxseSB0aGUgZ2VudWluZSBjbGllbnQgc2hhcmVzIHNvbWUgc2VjcmV0IChvcgotcGFzc3dvcmQpIHdpdGggdGhlIHNlcnZlciwgYW5kIGF1dGhlbnRpY2F0ZXMgaXRzZWxmIGJ5IHByb3ZpbmcgdGhhdCBpdAota25vd3MgdGhhdCBzZWNyZXQuICBWZXJ5IG9mdGVuLCB0aGUgbmFtZXMgdXNlZCBmb3IgYXV0aGVudGljYXRpb24KLWNvcnJlc3BvbmQgdG8gdGhlIGludGVybmV0IGhvc3RuYW1lcyBvZiB0aGUgcGVlcnMsIGJ1dCB0aGlzIGlzIG5vdAotZXNzZW50aWFsLgotLkxQCi1BdCBwcmVzZW50LCBwcHBkIHN1cHBvcnRzIHRocmVlIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sczogdGhlIFBhc3N3b3JkCi1BdXRoZW50aWNhdGlvbiBQcm90b2NvbCAoUEFQKSwgQ2hhbGxlbmdlIEhhbmRzaGFrZSBBdXRoZW50aWNhdGlvbgotUHJvdG9jb2wgKENIQVApLCBhbmQgRXh0ZW5zaWJsZSBBdXRoZW50aWNhdGlvbiBQcm90b2NvbCAoRUFQKS4gIFBBUAotaW52b2x2ZXMgdGhlIGNsaWVudCBzZW5kaW5nIGl0cyBuYW1lIGFuZCBhIGNsZWFydGV4dCBwYXNzd29yZCB0byB0aGUKLXNlcnZlciB0byBhdXRoZW50aWNhdGUgaXRzZWxmLiAgSW4gY29udHJhc3QsIHRoZSBzZXJ2ZXIgaW5pdGlhdGVzIHRoZQotQ0hBUCBhdXRoZW50aWNhdGlvbiBleGNoYW5nZSBieSBzZW5kaW5nIGEgY2hhbGxlbmdlIHRvIHRoZSBjbGllbnQgKHRoZQotY2hhbGxlbmdlIHBhY2tldCBpbmNsdWRlcyB0aGUgc2VydmVyJ3MgbmFtZSkuICBUaGUgY2xpZW50IG11c3QgcmVzcG9uZAotd2l0aCBhIHJlc3BvbnNlIHdoaWNoIGluY2x1ZGVzIGl0cyBuYW1lIHBsdXMgYSBoYXNoIHZhbHVlIGRlcml2ZWQgZnJvbQotdGhlIHNoYXJlZCBzZWNyZXQgYW5kIHRoZSBjaGFsbGVuZ2UsIGluIG9yZGVyIHRvIHByb3ZlIHRoYXQgaXQga25vd3MKLXRoZSBzZWNyZXQuICBFQVAgc3VwcG9ydHMgQ0hBUC1zdHlsZSBhdXRoZW50aWNhdGlvbiwgYW5kIGFsc28gaW5jbHVkZXMKLXRoZSBTUlBcLVNIQTEgbWVjaGFuaXNtLCB3aGljaCBpcyByZXNpc3RhbnQgdG8gZGljdGlvbmFyeS1iYXNlZCBhdHRhY2tzCi1hbmQgZG9lcyBub3QgcmVxdWlyZSBhIGNsZWFydGV4dCBwYXNzd29yZCBvbiB0aGUgc2VydmVyIHNpZGUuCi0uTFAKLVRoZSBQUFAgcHJvdG9jb2wsIGJlaW5nIHN5bW1ldHJpY2FsLCBhbGxvd3MgYm90aCBwZWVycyB0byByZXF1aXJlIHRoZQotb3RoZXIgdG8gYXV0aGVudGljYXRlIGl0c2VsZi4gIEluIHRoYXQgY2FzZSwgdHdvIHNlcGFyYXRlIGFuZAotaW5kZXBlbmRlbnQgYXV0aGVudGljYXRpb24gZXhjaGFuZ2VzIHdpbGwgb2NjdXIuICBUaGUgdHdvIGV4Y2hhbmdlcwotY291bGQgdXNlIGRpZmZlcmVudCBhdXRoZW50aWNhdGlvbiBwcm90b2NvbHMsIGFuZCBpbiBwcmluY2lwbGUsCi1kaWZmZXJlbnQgbmFtZXMgY291bGQgYmUgdXNlZCBpbiB0aGUgdHdvIGV4Y2hhbmdlcy4KLS5MUAotVGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIHBwcGQgaXMgdG8gYWdyZWUgdG8gYXV0aGVudGljYXRlIGlmCi1yZXF1ZXN0ZWQsIGFuZCB0byBub3QgcmVxdWlyZSBhdXRoZW50aWNhdGlvbiBmcm9tIHRoZSBwZWVyLiAgSG93ZXZlciwKLXBwcGQgd2lsbCBub3QgYWdyZWUgdG8gYXV0aGVudGljYXRlIGl0c2VsZiB3aXRoIGEgcGFydGljdWxhciBwcm90b2NvbAotaWYgaXQgaGFzIG5vIHNlY3JldHMgd2hpY2ggY291bGQgYmUgdXNlZCB0byBkbyBzby4KLS5MUAotUHBwZCBzdG9yZXMgc2VjcmV0cyBmb3IgdXNlIGluIGF1dGhlbnRpY2F0aW9uIGluIHNlY3JldHMKLWZpbGVzICgvZXRjL3BwcC9wYXBcLXNlY3JldHMgZm9yIFBBUCwgL2V0Yy9wcHAvY2hhcFwtc2VjcmV0cyBmb3IgQ0hBUCwKLU1TXC1DSEFQLCBNU1wtQ0hBUHYyLCBhbmQgRUFQIE1ENS1DaGFsbGVuZ2UsIGFuZCAvZXRjL3BwcC9zcnBcLXNlY3JldHMKLWZvciBFQVAgU1JQXC1TSEExKS4KLUFsbCBzZWNyZXRzIGZpbGVzIGhhdmUgdGhlIHNhbWUgZm9ybWF0LiAgVGhlIHNlY3JldHMgZmlsZXMgY2FuCi1jb250YWluIHNlY3JldHMgZm9yIHBwcGQgdG8gdXNlIGluIGF1dGhlbnRpY2F0aW5nIGl0c2VsZiB0byBvdGhlcgotc3lzdGVtcywgYXMgd2VsbCBhcyBzZWNyZXRzIGZvciBwcHBkIHRvIHVzZSB3aGVuIGF1dGhlbnRpY2F0aW5nIG90aGVyCi1zeXN0ZW1zIHRvIGl0c2VsZi4KLS5MUAotRWFjaCBsaW5lIGluIGEgc2VjcmV0cyBmaWxlIGNvbnRhaW5zIG9uZSBzZWNyZXQuICBBIGdpdmVuIHNlY3JldCBpcwotc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIGNvbWJpbmF0aW9uIG9mIGNsaWVudCBhbmQgc2VydmVyIC0gaXQgY2FuCi1vbmx5IGJlIHVzZWQgYnkgdGhhdCBjbGllbnQgdG8gYXV0aGVudGljYXRlIGl0c2VsZiB0byB0aGF0IHNlcnZlci4KLVRodXMgZWFjaCBsaW5lIGluIGEgc2VjcmV0cyBmaWxlIGhhcyBhdCBsZWFzdCAzIGZpZWxkczogdGhlIG5hbWUgb2YKLXRoZSBjbGllbnQsIHRoZSBuYW1lIG9mIHRoZSBzZXJ2ZXIsIGFuZCB0aGUgc2VjcmV0LiAgVGhlc2UgZmllbGRzIG1heQotYmUgZm9sbG93ZWQgYnkgYSBsaXN0IG9mIHRoZSBJUCBhZGRyZXNzZXMgdGhhdCB0aGUgc3BlY2lmaWVkIGNsaWVudAotbWF5IHVzZSB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIHNwZWNpZmllZCBzZXJ2ZXIuCi0uTFAKLUEgc2VjcmV0cyBmaWxlIGlzIHBhcnNlZCBpbnRvIHdvcmRzIGFzIGZvciBhIG9wdGlvbnMgZmlsZSwgc28gdGhlCi1jbGllbnQgbmFtZSwgc2VydmVyIG5hbWUgYW5kIHNlY3JldHMgZmllbGRzIG11c3QgZWFjaCBiZSBvbmUgd29yZCwKLXdpdGggYW55IGVtYmVkZGVkIHNwYWNlcyBvciBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMgcXVvdGVkIG9yCi1lc2NhcGVkLiAgTm90ZSB0aGF0IGNhc2UgaXMgc2lnbmlmaWNhbnQgaW4gdGhlIGNsaWVudCBhbmQgc2VydmVyIG5hbWVzCi1hbmQgaW4gdGhlIHNlY3JldC4KLS5MUAotSWYgdGhlIHNlY3JldCBzdGFydHMgd2l0aCBhbiBgQCcsIHdoYXQgZm9sbG93cyBpcyBhc3N1bWVkIHRvIGJlIHRoZQotbmFtZSBvZiBhIGZpbGUgZnJvbSB3aGljaCB0byByZWFkIHRoZSBzZWNyZXQuICBBICIqIiBhcyB0aGUgY2xpZW50IG9yCi1zZXJ2ZXIgbmFtZSBtYXRjaGVzIGFueSBuYW1lLiAgV2hlbiBzZWxlY3RpbmcgYSBzZWNyZXQsIHBwcGQgdGFrZXMgdGhlCi1iZXN0IG1hdGNoLCBpLmUuICB0aGUgbWF0Y2ggd2l0aCB0aGUgZmV3ZXN0IHdpbGRjYXJkcy4KLS5MUAotQW55IGZvbGxvd2luZyB3b3JkcyBvbiB0aGUgc2FtZSBsaW5lIGFyZSB0YWtlbiB0byBiZSBhIGxpc3Qgb2YKLWFjY2VwdGFibGUgSVAgYWRkcmVzc2VzIGZvciB0aGF0IGNsaWVudC4gIElmIHRoZXJlIGFyZSBvbmx5IDMgd29yZHMgb24KLXRoZSBsaW5lLCBvciBpZiB0aGUgZmlyc3Qgd29yZCBpcyAiXC0iLCB0aGVuIGFsbCBJUCBhZGRyZXNzZXMgYXJlCi1kaXNhbGxvd2VkLiAgVG8gYWxsb3cgYW55IGFkZHJlc3MsIHVzZSAiKiIuICBBIHdvcmQgc3RhcnRpbmcgd2l0aCAiISIKLWluZGljYXRlcyB0aGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBpcyBcZklub3RcZlIgYWNjZXB0YWJsZS4gIEFuCi1hZGRyZXNzIG1heSBiZSBmb2xsb3dlZCBieSAiLyIgYW5kIGEgbnVtYmVyIFxmSW5cZlIsIHRvIGluZGljYXRlIGEKLXdob2xlIHN1Ym5ldCwgaS5lLiBhbGwgYWRkcmVzc2VzIHdoaWNoIGhhdmUgdGhlIHNhbWUgdmFsdWUgaW4gdGhlIG1vc3QKLXNpZ25pZmljYW50IFxmSW5cZlIgYml0cy4gIEluIHRoaXMgZm9ybSwgdGhlIGFkZHJlc3MgbWF5IGJlIGZvbGxvd2VkCi1ieSBhIHBsdXMgc2lnbiAoIisiKSB0byBpbmRpY2F0ZSB0aGF0IG9uZSBhZGRyZXNzIGZyb20gdGhlIHN1Ym5ldCBpcwotYXV0aG9yaXplZCwgYmFzZWQgb24gdGhlIHBwcCBuZXR3b3JrIGludGVyZmFjZSB1bml0IG51bWJlciBpbiB1c2UuCi1JbiB0aGlzIGNhc2UsIHRoZSBob3N0IHBhcnQgb2YgdGhlIGFkZHJlc3Mgd2lsbCBiZSBzZXQgdG8gdGhlIHVuaXQKLW51bWJlciBwbHVzIG9uZS4KLS5MUAotVGh1cyBhIHNlY3JldHMgZmlsZSBjb250YWlucyBib3RoIHNlY3JldHMgZm9yIHVzZSBpbiBhdXRoZW50aWNhdGluZwotb3RoZXIgaG9zdHMsIHBsdXMgc2VjcmV0cyB3aGljaCB3ZSB1c2UgZm9yIGF1dGhlbnRpY2F0aW5nIG91cnNlbHZlcyB0bwotb3RoZXJzLiAgV2hlbiBwcHBkIGlzIGF1dGhlbnRpY2F0aW5nIHRoZSBwZWVyIChjaGVja2luZyB0aGUgcGVlcidzCi1pZGVudGl0eSksIGl0IGNob29zZXMgYSBzZWNyZXQgd2l0aCB0aGUgcGVlcidzIG5hbWUgaW4gdGhlIGZpcnN0Ci1maWVsZCBhbmQgdGhlIG5hbWUgb2YgdGhlIGxvY2FsIHN5c3RlbSBpbiB0aGUgc2Vjb25kIGZpZWxkLiAgVGhlCi1uYW1lIG9mIHRoZSBsb2NhbCBzeXN0ZW0gZGVmYXVsdHMgdG8gdGhlIGhvc3RuYW1lLCB3aXRoIHRoZSBkb21haW4KLW5hbWUgYXBwZW5kZWQgaWYgdGhlIFxmSWRvbWFpblxmUiBvcHRpb24gaXMgdXNlZC4gIFRoaXMgZGVmYXVsdCBjYW4gYmUKLW92ZXJyaWRkZW4gd2l0aCB0aGUgXGZJbmFtZVxmUiBvcHRpb24sIGV4Y2VwdCB3aGVuIHRoZQotXGZJdXNlaG9zdG5hbWVcZlIgb3B0aW9uIGlzIHVzZWQuICAoRm9yIEVBUCBTUlBcLVNIQTEsIHNlZSB0aGUKLXNycFwtZW50cnkoOCkgdXRpbGl0eSBmb3IgZ2VuZXJhdGluZyBwcm9wZXIgdmFsaWRhdG9yIGVudHJpZXMgdG8gYmUKLXVzZWQgaW4gdGhlICJzZWNyZXQiIGZpZWxkLikKLS5MUAotV2hlbiBwcHBkIGlzIGNob29zaW5nIGEgc2VjcmV0IHRvIHVzZSBpbiBhdXRoZW50aWNhdGluZyBpdHNlbGYgdG8gdGhlCi1wZWVyLCBpdCBmaXJzdCBkZXRlcm1pbmVzIHdoYXQgbmFtZSBpdCBpcyBnb2luZyB0byB1c2UgdG8gaWRlbnRpZnkKLWl0c2VsZiB0byB0aGUgcGVlci4gIFRoaXMgbmFtZSBjYW4gYmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIHdpdGggdGhlCi1cZkl1c2VyXGZSIG9wdGlvbi4gIElmIHRoaXMgb3B0aW9uIGlzIG5vdCB1c2VkLCB0aGUgbmFtZSBkZWZhdWx0cyB0bwotdGhlIG5hbWUgb2YgdGhlIGxvY2FsIHN5c3RlbSwgZGV0ZXJtaW5lZCBhcyBkZXNjcmliZWQgaW4gdGhlIHByZXZpb3VzCi1wYXJhZ3JhcGguICBUaGVuIHBwcGQgbG9va3MgZm9yIGEgc2VjcmV0IHdpdGggdGhpcyBuYW1lIGluIHRoZSBmaXJzdAotZmllbGQgYW5kIHRoZSBwZWVyJ3MgbmFtZSBpbiB0aGUgc2Vjb25kIGZpZWxkLiAgUHBwZCB3aWxsIGtub3cgdGhlCi1uYW1lIG9mIHRoZSBwZWVyIGlmIENIQVAgb3IgRUFQIGF1dGhlbnRpY2F0aW9uIGlzIGJlaW5nIHVzZWQsIGJlY2F1c2UKLXRoZSBwZWVyIHdpbGwgaGF2ZSBzZW50IGl0IGluIHRoZSBjaGFsbGVuZ2UgcGFja2V0LiAgSG93ZXZlciwgaWYgUEFQCi1pcyBiZWluZyB1c2VkLCBwcHBkIHdpbGwgaGF2ZSB0byBkZXRlcm1pbmUgdGhlIHBlZXIncyBuYW1lIGZyb20gdGhlCi1vcHRpb25zIHNwZWNpZmllZCBieSB0aGUgdXNlci4gIFRoZSB1c2VyIGNhbiBzcGVjaWZ5IHRoZSBwZWVyJ3MgbmFtZQotZGlyZWN0bHkgd2l0aCB0aGUgXGZJcmVtb3RlbmFtZVxmUiBvcHRpb24uICBPdGhlcndpc2UsIGlmIHRoZSByZW1vdGUKLUlQIGFkZHJlc3Mgd2FzIHNwZWNpZmllZCBieSBhIG5hbWUgKHJhdGhlciB0aGFuIGluIG51bWVyaWMgZm9ybSksIHRoYXQKLW5hbWUgd2lsbCBiZSB1c2VkIGFzIHRoZSBwZWVyJ3MgbmFtZS4gIEZhaWxpbmcgdGhhdCwgcHBwZCB3aWxsIHVzZSB0aGUKLW51bGwgc3RyaW5nIGFzIHRoZSBwZWVyJ3MgbmFtZS4KLS5MUAotV2hlbiBhdXRoZW50aWNhdGluZyB0aGUgcGVlciB3aXRoIFBBUCwgdGhlIHN1cHBsaWVkIHBhc3N3b3JkIGlzIGZpcnN0Ci1jb21wYXJlZCB3aXRoIHRoZSBzZWNyZXQgZnJvbSB0aGUgc2VjcmV0cyBmaWxlLiAgSWYgdGhlIHBhc3N3b3JkCi1kb2Vzbid0IG1hdGNoIHRoZSBzZWNyZXQsIHRoZSBwYXNzd29yZCBpcyBlbmNyeXB0ZWQgdXNpbmcgY3J5cHQoKSBhbmQKLWNoZWNrZWQgYWdhaW5zdCB0aGUgc2VjcmV0IGFnYWluLiAgVGh1cyBzZWNyZXRzIGZvciBhdXRoZW50aWNhdGluZyB0aGUKLXBlZXIgY2FuIGJlIHN0b3JlZCBpbiBlbmNyeXB0ZWQgZm9ybSBpZiBkZXNpcmVkLiAgSWYgdGhlCi1cZklwYXBjcnlwdFxmUiBvcHRpb24gaXMgZ2l2ZW4sIHRoZSBmaXJzdCAodW5lbmNyeXB0ZWQpIGNvbXBhcmlzb24gaXMKLW9taXR0ZWQsIGZvciBiZXR0ZXIgc2VjdXJpdHkuCi0uTFAKLUZ1cnRoZXJtb3JlLCBpZiB0aGUgXGZJbG9naW5cZlIgb3B0aW9uIHdhcyBzcGVjaWZpZWQsIHRoZSB1c2VybmFtZSBhbmQKLXBhc3N3b3JkIGFyZSBhbHNvIGNoZWNrZWQgYWdhaW5zdCB0aGUgc3lzdGVtIHBhc3N3b3JkIGRhdGFiYXNlLiAgVGh1cywKLXRoZSBzeXN0ZW0gYWRtaW5pc3RyYXRvciBjYW4gc2V0IHVwIHRoZSBwYXBcLXNlY3JldHMgZmlsZSB0byBhbGxvdyBQUFAKLWFjY2VzcyBvbmx5IHRvIGNlcnRhaW4gdXNlcnMsIGFuZCB0byByZXN0cmljdCB0aGUgc2V0IG9mIElQIGFkZHJlc3NlcwotdGhhdCBlYWNoIHVzZXIgY2FuIHVzZS4gIFR5cGljYWxseSwgd2hlbiB1c2luZyB0aGUgXGZJbG9naW5cZlIgb3B0aW9uLAotdGhlIHNlY3JldCBpbiAvZXRjL3BwcC9wYXBcLXNlY3JldHMgd291bGQgYmUgIiIsIHdoaWNoIHdpbGwgbWF0Y2ggYW55Ci1wYXNzd29yZCBzdXBwbGllZCBieSB0aGUgcGVlci4gIFRoaXMgYXZvaWRzIHRoZSBuZWVkIHRvIGhhdmUgdGhlIHNhbWUKLXNlY3JldCBpbiB0d28gcGxhY2VzLgotLkxQCi1BdXRoZW50aWNhdGlvbiBtdXN0IGJlIHNhdGlzZmFjdG9yaWx5IGNvbXBsZXRlZCBiZWZvcmUgSVBDUCAob3IgYW55Ci1vdGhlciBOZXR3b3JrIENvbnRyb2wgUHJvdG9jb2wpIGNhbiBiZSBzdGFydGVkLiAgSWYgdGhlIHBlZXIgaXMKLXJlcXVpcmVkIHRvIGF1dGhlbnRpY2F0ZSBpdHNlbGYsIGFuZCBmYWlscyB0byBkbyBzbywgcHBwZCB3aWxsCi10ZXJtaW5hdGVkIHRoZSBsaW5rIChieSBjbG9zaW5nIExDUCkuICBJZiBJUENQIG5lZ290aWF0ZXMgYW4KLXVuYWNjZXB0YWJsZSBJUCBhZGRyZXNzIGZvciB0aGUgcmVtb3RlIGhvc3QsIElQQ1Agd2lsbCBiZSBjbG9zZWQuICBJUAotcGFja2V0cyBjYW4gb25seSBiZSBzZW50IG9yIHJlY2VpdmVkIHdoZW4gSVBDUCBpcyBvcGVuLgotLkxQCi1JbiBzb21lIGNhc2VzIGl0IGlzIGRlc2lyYWJsZSB0byBhbGxvdyBzb21lIGhvc3RzIHdoaWNoIGNhbid0Ci1hdXRoZW50aWNhdGUgdGhlbXNlbHZlcyB0byBjb25uZWN0IGFuZCB1c2Ugb25lIG9mIGEgcmVzdHJpY3RlZCBzZXQgb2YKLUlQIGFkZHJlc3NlcywgZXZlbiB3aGVuIHRoZSBsb2NhbCBob3N0IGdlbmVyYWxseSByZXF1aXJlcwotYXV0aGVudGljYXRpb24uICBJZiB0aGUgcGVlciByZWZ1c2VzIHRvIGF1dGhlbnRpY2F0ZSBpdHNlbGYgd2hlbgotcmVxdWVzdGVkLCBwcHBkIHRha2VzIHRoYXQgYXMgZXF1aXZhbGVudCB0byBhdXRoZW50aWNhdGluZyB3aXRoIFBBUAotdXNpbmcgdGhlIGVtcHR5IHN0cmluZyBmb3IgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZC4gIFRodXMsIGJ5IGFkZGluZwotYSBsaW5lIHRvIHRoZSBwYXBcLXNlY3JldHMgZmlsZSB3aGljaCBzcGVjaWZpZXMgdGhlIGVtcHR5IHN0cmluZyBmb3IKLXRoZSBjbGllbnQgYW5kIHBhc3N3b3JkLCBpdCBpcyBwb3NzaWJsZSB0byBhbGxvdyByZXN0cmljdGVkIGFjY2VzcyB0bwotaG9zdHMgd2hpY2ggcmVmdXNlIHRvIGF1dGhlbnRpY2F0ZSB0aGVtc2VsdmVzLgotLlNIIFJPVVRJTkcKLS5MUAotV2hlbiBJUENQIG5lZ290aWF0aW9uIGlzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIHBwcGQgd2lsbCBpbmZvcm0gdGhlCi1rZXJuZWwgb2YgdGhlIGxvY2FsIGFuZCByZW1vdGUgSVAgYWRkcmVzc2VzIGZvciB0aGUgcHBwIGludGVyZmFjZS4KLVRoaXMgaXMgc3VmZmljaWVudCB0byBjcmVhdGUgYSBob3N0IHJvdXRlIHRvIHRoZSByZW1vdGUgZW5kIG9mIHRoZQotbGluaywgd2hpY2ggd2lsbCBlbmFibGUgdGhlIHBlZXJzIHRvIGV4Y2hhbmdlIElQIHBhY2tldHMuCi1Db21tdW5pY2F0aW9uIHdpdGggb3RoZXIgbWFjaGluZXMgZ2VuZXJhbGx5IHJlcXVpcmVzIGZ1cnRoZXIKLW1vZGlmaWNhdGlvbiB0byByb3V0aW5nIHRhYmxlcyBhbmQvb3IgQVJQIChBZGRyZXNzIFJlc29sdXRpb24KLVByb3RvY29sKSB0YWJsZXMuICBJbiBtb3N0IGNhc2VzIHRoZSBcZklkZWZhdWx0cm91dGVcZlIgYW5kL29yCi1cZklwcm94eWFycFxmUiBvcHRpb25zIGFyZSBzdWZmaWNpZW50IGZvciB0aGlzLCBidXQgaW4gc29tZSBjYXNlcwotZnVydGhlciBpbnRlcnZlbnRpb24gaXMgcmVxdWlyZWQuICBUaGUgL2V0Yy9wcHAvaXBcLXVwIHNjcmlwdCBjYW4gYmUKLXVzZWQgZm9yIHRoaXMuCi0uTFAKLVNvbWV0aW1lcyBpdCBpcyBkZXNpcmFibGUgdG8gYWRkIGEgZGVmYXVsdCByb3V0ZSB0aHJvdWdoIHRoZSByZW1vdGUKLWhvc3QsIGFzIGluIHRoZSBjYXNlIG9mIGEgbWFjaGluZSB3aG9zZSBvbmx5IGNvbm5lY3Rpb24gdG8gdGhlCi1JbnRlcm5ldCBpcyB0aHJvdWdoIHRoZSBwcHAgaW50ZXJmYWNlLiAgVGhlIFxmSWRlZmF1bHRyb3V0ZVxmUiBvcHRpb24KLWNhdXNlcyBwcHBkIHRvIGNyZWF0ZSBzdWNoIGEgZGVmYXVsdCByb3V0ZSB3aGVuIElQQ1AgY29tZXMgdXAsIGFuZAotZGVsZXRlIGl0IHdoZW4gdGhlIGxpbmsgaXMgdGVybWluYXRlZC4KLS5MUAotSW4gc29tZSBjYXNlcyBpdCBpcyBkZXNpcmFibGUgdG8gdXNlIHByb3h5IEFSUCwgZm9yIGV4YW1wbGUgb24gYQotc2VydmVyIG1hY2hpbmUgY29ubmVjdGVkIHRvIGEgTEFOLCBpbiBvcmRlciB0byBhbGxvdyBvdGhlciBob3N0cyB0bwotY29tbXVuaWNhdGUgd2l0aCB0aGUgcmVtb3RlIGhvc3QuICBUaGUgXGZJcHJveHlhcnBcZlIgb3B0aW9uIGNhdXNlcwotcHBwZCB0byBsb29rIGZvciBhIG5ldHdvcmsgaW50ZXJmYWNlIG9uIHRoZSBzYW1lIHN1Ym5ldCBhcyB0aGUgcmVtb3RlCi1ob3N0IChhbiBpbnRlcmZhY2Ugc3VwcG9ydGluZyBicm9hZGNhc3QgYW5kIEFSUCwgd2hpY2ggaXMgdXAgYW5kIG5vdCBhCi1wb2ludC10by1wb2ludCBvciBsb29wYmFjayBpbnRlcmZhY2UpLiAgSWYgZm91bmQsIHBwcGQgY3JlYXRlcyBhCi1wZXJtYW5lbnQsIHB1Ymxpc2hlZCBBUlAgZW50cnkgd2l0aCB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIGhvc3QKLWFuZCB0aGUgaGFyZHdhcmUgYWRkcmVzcyBvZiB0aGUgbmV0d29yayBpbnRlcmZhY2UgZm91bmQuCi0uTFAKLVdoZW4gdGhlIFxmSWRlbWFuZFxmUiBvcHRpb24gaXMgdXNlZCwgdGhlIGludGVyZmFjZSBJUCBhZGRyZXNzZXMgaGF2ZQotYWxyZWFkeSBiZWVuIHNldCBhdCB0aGUgcG9pbnQgd2hlbiBJUENQIGNvbWVzIHVwLiAgSWYgcHBwZCBoYXMgbm90Ci1iZWVuIGFibGUgdG8gbmVnb3RpYXRlIHRoZSBzYW1lIGFkZHJlc3NlcyB0aGF0IGl0IHVzZWQgdG8gY29uZmlndXJlCi10aGUgaW50ZXJmYWNlIChmb3IgZXhhbXBsZSB3aGVuIHRoZSBwZWVyIGlzIGFuIElTUCB0aGF0IHVzZXMgZHluYW1pYwotSVAgYWRkcmVzcyBhc3NpZ25tZW50KSwgcHBwZCBoYXMgdG8gY2hhbmdlIHRoZSBpbnRlcmZhY2UgSVAgYWRkcmVzc2VzCi10byB0aGUgbmVnb3RpYXRlZCBhZGRyZXNzZXMuICBUaGlzIG1heSBkaXNydXB0IGV4aXN0aW5nIGNvbm5lY3Rpb25zLAotYW5kIHRoZSB1c2Ugb2YgZGVtYW5kIGRpYWxsaW5nIHdpdGggcGVlcnMgdGhhdCBkbyBkeW5hbWljIElQIGFkZHJlc3MKLWFzc2lnbm1lbnQgaXMgbm90IHJlY29tbWVuZGVkLgotLlNIIE1VTFRJTElOSwotTXVsdGlsaW5rIFBQUCBwcm92aWRlcyB0aGUgY2FwYWJpbGl0eSB0byBjb21iaW5lIHR3byBvciBtb3JlIFBQUCBsaW5rcwotYmV0d2VlbiBhIHBhaXIgb2YgbWFjaGluZXMgaW50byBhIHNpbmdsZSBgYnVuZGxlJywgd2hpY2ggYXBwZWFycyBhcyBhCi1zaW5nbGUgdmlydHVhbCBQUFAgbGluayB3aGljaCBoYXMgdGhlIGNvbWJpbmVkIGJhbmR3aWR0aCBvZiB0aGUKLWluZGl2aWR1YWwgbGlua3MuICBDdXJyZW50bHksIG11bHRpbGluayBQUFAgaXMgb25seSBzdXBwb3J0ZWQgdW5kZXIKLUxpbnV4LgotLkxQCi1QcHBkIGRldGVjdHMgdGhhdCB0aGUgbGluayBpdCBpcyBjb250cm9sbGluZyBpcyBjb25uZWN0ZWQgdG8gdGhlIHNhbWUKLXBlZXIgYXMgYW5vdGhlciBsaW5rIHVzaW5nIHRoZSBwZWVyJ3MgZW5kcG9pbnQgZGlzY3JpbWluYXRvciBhbmQgdGhlCi1hdXRoZW50aWNhdGVkIGlkZW50aXR5IG9mIHRoZSBwZWVyIChpZiBpdCBhdXRoZW50aWNhdGVzIGl0c2VsZikuICBUaGUKLWVuZHBvaW50IGRpc2NyaW1pbmF0b3IgaXMgYSBibG9jayBvZiBkYXRhIHdoaWNoIGlzIGhvcGVmdWxseSB1bmlxdWUKLWZvciBlYWNoIHBlZXIuICBTZXZlcmFsIHR5cGVzIG9mIGRhdGEgY2FuIGJlIHVzZWQsIGluY2x1ZGluZwotbG9jYWxseS1hc3NpZ25lZCBzdHJpbmdzIG9mIGJ5dGVzLCBJUCBhZGRyZXNzZXMsIE1BQyBhZGRyZXNzZXMsCi1yYW5kb21seSBzdHJpbmdzIG9mIGJ5dGVzLCBvciBFXC0xNjQgcGhvbmUgbnVtYmVycy4gIFRoZSBlbmRwb2ludAotZGlzY3JpbWluYXRvciBzZW50IHRvIHRoZSBwZWVyIGJ5IHBwcGQgY2FuIGJlIHNldCB1c2luZyB0aGUgZW5kcG9pbnQKLW9wdGlvbi4KLS5MUAotSW4gc29tZSBjaXJjdW1zdGFuY2VzIHRoZSBwZWVyIG1heSBzZW5kIG5vIGVuZHBvaW50IGRpc2NyaW1pbmF0b3Igb3IgYQotbm9uLXVuaXF1ZSB2YWx1ZS4gIFRoZSBidW5kbGUgb3B0aW9uIGFkZHMgYW4gZXh0cmEgc3RyaW5nIHdoaWNoIGlzCi1hZGRlZCB0byB0aGUgcGVlcidzIGVuZHBvaW50IGRpc2NyaW1pbmF0b3IgYW5kIGF1dGhlbnRpY2F0ZWQgaWRlbnRpdHkKLXdoZW4gbWF0Y2hpbmcgdXAgbGlua3MgdG8gYmUgam9pbmVkIHRvZ2V0aGVyIGluIGEgYnVuZGxlLiAgVGhlIGJ1bmRsZQotb3B0aW9uIGNhbiBhbHNvIGJlIHVzZWQgdG8gYWxsb3cgdGhlIGVzdGFibGlzaG1lbnQgb2YgbXVsdGlwbGUgYnVuZGxlcwotYmV0d2VlbiB0aGUgbG9jYWwgc3lzdGVtIGFuZCB0aGUgcGVlci4gIFBwcGQgdXNlcyBhIFREQiBkYXRhYmFzZSBpbgotL3Zhci9ydW4vcHBwZDIudGRiIHRvIG1hdGNoIHVwIGxpbmtzLgotLkxQCi1Bc3N1bWluZyB0aGF0IG11bHRpbGluayBpcyBlbmFibGVkIGFuZCB0aGUgcGVlciBpcyB3aWxsaW5nIHRvCi1uZWdvdGlhdGUgbXVsdGlsaW5rLCB0aGVuIHdoZW4gcHBwZCBpcyBpbnZva2VkIHRvIGJyaW5nIHVwIHRoZSBmaXJzdAotbGluayB0byB0aGUgcGVlciwgaXQgd2lsbCBkZXRlY3QgdGhhdCBubyBvdGhlciBsaW5rIGlzIGNvbm5lY3RlZCB0bwotdGhlIHBlZXIgYW5kIGNyZWF0ZSBhIG5ldyBidW5kbGUsIHRoYXQgaXMsIGFub3RoZXIgcHBwIG5ldHdvcmsKLWludGVyZmFjZSB1bml0LiAgV2hlbiBhbm90aGVyIHBwcGQgaXMgaW52b2tlZCB0byBicmluZyB1cCBhbm90aGVyIGxpbmsKLXRvIHRoZSBwZWVyLCBpdCB3aWxsIGRldGVjdCB0aGUgZXhpc3RpbmcgYnVuZGxlIGFuZCBqb2luIGl0cyBsaW5rIHRvCi1pdC4KLS5MUAotSWYgdGhlIGZpcnN0IGxpbmsgdGVybWluYXRlcyAoZm9yIGV4YW1wbGUsIGJlY2F1c2Ugb2YgYSBoYW5ndXAgb3IgYQotcmVjZWl2ZWQgTENQIHRlcm1pbmF0ZS1yZXF1ZXN0KSB0aGUgYnVuZGxlIGlzIG5vdCBkZXN0cm95ZWQgdW5sZXNzCi10aGVyZSBhcmUgbm8gb3RoZXIgbGlua3MgcmVtYWluaW5nIGluIHRoZSBidW5kbGUuICBSYXRoZXIgdGhhbgotZXhpdGluZywgdGhlIGZpcnN0IHBwcGQga2VlcHMgcnVubmluZyBhZnRlciBpdHMgbGluayB0ZXJtaW5hdGVzLCB1bnRpbAotYWxsIHRoZSBsaW5rcyBpbiB0aGUgYnVuZGxlIGhhdmUgdGVybWluYXRlZC4gIElmIHRoZSBmaXJzdCBwcHBkCi1yZWNlaXZlcyBhIFNJR1RFUk0gb3IgU0lHSU5UIHNpZ25hbCwgaXQgd2lsbCBkZXN0cm95IHRoZSBidW5kbGUgYW5kCi1zZW5kIGEgU0lHSFVQIHRvIHRoZSBwcHBkIHByb2Nlc3NlcyBmb3IgZWFjaCBvZiB0aGUgbGlua3MgaW4gdGhlCi1idW5kbGUuICBJZiB0aGUgZmlyc3QgcHBwZCByZWNlaXZlcyBhIFNJR0hVUCBzaWduYWwsIGl0IHdpbGwgdGVybWluYXRlCi1pdHMgbGluayBidXQgbm90IHRoZSBidW5kbGUuCi0uTFAKLU5vdGU6IGRlbWFuZCBtb2RlIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIHdpdGggbXVsdGlsaW5rLgotLlNIIEVYQU1QTEVTCi0uTFAKLVRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgYXNzdW1lIHRoYXQgdGhlIC9ldGMvcHBwL29wdGlvbnMgZmlsZSBjb250YWlucwotdGhlIFxmSWF1dGhcZlIgb3B0aW9uIChhcyBpbiB0aGUgZGVmYXVsdCAvZXRjL3BwcC9vcHRpb25zIGZpbGUgaW4gdGhlCi1wcHAgZGlzdHJpYnV0aW9uKS4KLS5MUAotUHJvYmFibHkgdGhlIG1vc3QgY29tbW9uIHVzZSBvZiBwcHBkIGlzIHRvIGRpYWwgb3V0IHRvIGFuIElTUC4gIFRoaXMKLWNhbiBiZSBkb25lIHdpdGggYSBjb21tYW5kIHN1Y2ggYXMKLS5JUAotcHBwZCBjYWxsIGlzcAotLkxQCi13aGVyZSB0aGUgL2V0Yy9wcHAvcGVlcnMvaXNwIGZpbGUgaXMgc2V0IHVwIGJ5IHRoZSBzeXN0ZW0KLWFkbWluaXN0cmF0b3IgdG8gY29udGFpbiBzb21ldGhpbmcgbGlrZSB0aGlzOgotLklQCi10dHlTMCAxOTIwMCBjcnRzY3RzCi0uYnIKLWNvbm5lY3QgJy91c3Ivc2Jpbi9jaGF0IFwtdiBcLWYgL2V0Yy9wcHAvY2hhdFwtaXNwJwotLmJyCi1ub2F1dGgKLS5MUAotSW4gdGhpcyBleGFtcGxlLCB3ZSBhcmUgdXNpbmcgY2hhdCB0byBkaWFsIHRoZSBJU1AncyBtb2RlbSBhbmQgZ28KLXRocm91Z2ggYW55IGxvZ29uIHNlcXVlbmNlIHJlcXVpcmVkLiAgVGhlIC9ldGMvcHBwL2NoYXRcLWlzcCBmaWxlCi1jb250YWlucyB0aGUgc2NyaXB0IHVzZWQgYnkgY2hhdDsgaXQgY291bGQgZm9yIGV4YW1wbGUgY29udGFpbgotc29tZXRoaW5nIGxpa2UgdGhpczoKLS5JUAotQUJPUlQgIk5PIENBUlJJRVIiCi0uYnIKLUFCT1JUICJOTyBESUFMVE9ORSIKLS5icgotQUJPUlQgIkVSUk9SIgotLmJyCi1BQk9SVCAiTk8gQU5TV0VSIgotLmJyCi1BQk9SVCAiQlVTWSIKLS5icgotQUJPUlQgIlVzZXJuYW1lL1Bhc3N3b3JkIEluY29ycmVjdCIKLS5icgotIiIgImF0IgotLmJyCi1PSyAiYXQmZDAmYzEiCi0uYnIKLU9LICJhdGR0MjQ2ODEzNSIKLS5icgotIm5hbWU6IiAiXlVteXVzZXJpZCIKLS5icgotIndvcmQ6IiAiXGVxbXlwYXNzd29yZCIKLS5icgotImlzcHRzIiAiXGVxXlVwcHAiCi0uYnIKLSJ+XC1eVXBwcFwtfiIKLS5MUAotU2VlIHRoZSBjaGF0KDgpIG1hbiBwYWdlIGZvciBkZXRhaWxzIG9mIGNoYXQgc2NyaXB0cy4KLS5MUAotUHBwZCBjYW4gYWxzbyBiZSB1c2VkIHRvIHByb3ZpZGUgYSBkaWFsLWluIHBwcCBzZXJ2aWNlIGZvciB1c2Vycy4gIElmCi10aGUgdXNlcnMgYWxyZWFkeSBoYXZlIGxvZ2luIGFjY291bnRzLCB0aGUgc2ltcGxlc3Qgd2F5IHRvIHNldCB1cCB0aGUKLXBwcCBzZXJ2aWNlIGlzIHRvIGxldCB0aGUgdXNlcnMgbG9nIGluIHRvIHRoZWlyIGFjY291bnRzIGFuZCBydW4gcHBwZAotKGluc3RhbGxlZCBzZXR1aWQtcm9vdCkgd2l0aCBhIGNvbW1hbmQgc3VjaCBhcwotLklQCi1wcHBkIHByb3h5YXJwCi0uTFAKLVRvIGFsbG93IGEgdXNlciB0byB1c2UgdGhlIFBQUCBmYWNpbGl0aWVzLCB5b3UgbmVlZCB0byBhbGxvY2F0ZSBhbiBJUAotYWRkcmVzcyBmb3IgdGhhdCB1c2VyJ3MgbWFjaGluZSBhbmQgY3JlYXRlIGFuIGVudHJ5IGluCi0vZXRjL3BwcC9wYXBcLXNlY3JldHMsIC9ldGMvcHBwL2NoYXBcLXNlY3JldHMsIG9yIC9ldGMvcHBwL3NycFwtc2VjcmV0cwotKGRlcGVuZGluZyBvbiB3aGljaCBhdXRoZW50aWNhdGlvbiBtZXRob2QgdGhlIFBQUCBpbXBsZW1lbnRhdGlvbiBvbgotdGhlIHVzZXIncyBtYWNoaW5lIHN1cHBvcnRzKSwgc28gdGhhdCB0aGUgdXNlcidzIG1hY2hpbmUgY2FuCi1hdXRoZW50aWNhdGUgaXRzZWxmLiAgRm9yIGV4YW1wbGUsIGlmIEpvZSBoYXMgYSBtYWNoaW5lIGNhbGxlZAotImpvZXNwYyIgdGhhdCBpcyB0byBiZSBhbGxvd2VkIHRvIGRpYWwgaW4gdG8gdGhlIG1hY2hpbmUgY2FsbGVkCi0ic2VydmVyIiBhbmQgdXNlIHRoZSBJUCBhZGRyZXNzIGpvZXNwYy5teS5uZXQsIHlvdSB3b3VsZCBhZGQgYW4gZW50cnkKLWxpa2UgdGhpcyB0byAvZXRjL3BwcC9wYXBcLXNlY3JldHMgb3IgL2V0Yy9wcHAvY2hhcFwtc2VjcmV0czoKLS5JUAotam9lc3BjCXNlcnZlcgkiam9lJ3Mgc2VjcmV0Iglqb2VzcGMubXkubmV0Ci0uTFAKLShTZWUgc3JwXC1lbnRyeSg4KSBmb3IgYSBtZWFucyB0byBnZW5lcmF0ZSB0aGUgc2VydmVyJ3MgZW50cnkgd2hlbgotU1JQXC1TSEExIGlzIGluIHVzZS4pCi1BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGNyZWF0ZSBhIHVzZXJuYW1lIGNhbGxlZCAoZm9yIGV4YW1wbGUpICJwcHAiLAotd2hvc2UgbG9naW4gc2hlbGwgaXMgcHBwZCBhbmQgd2hvc2UgaG9tZSBkaXJlY3RvcnkgaXMgL2V0Yy9wcHAuCi1PcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBwcHBkIGlzIHJ1biB0aGlzIHdheSBjYW4gYmUgcHV0IGluCi0vZXRjL3BwcC8ucHBwcmMuCi0uTFAKLUlmIHlvdXIgc2VyaWFsIGNvbm5lY3Rpb24gaXMgYW55IG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBhIHBpZWNlIG9mCi13aXJlLCB5b3UgbWF5IG5lZWQgdG8gYXJyYW5nZSBmb3Igc29tZSBjb250cm9sIGNoYXJhY3RlcnMgdG8gYmUKLWVzY2FwZWQuICBJbiBwYXJ0aWN1bGFyLCBpdCBpcyBvZnRlbiB1c2VmdWwgdG8gZXNjYXBlIFhPTiAoXlEpIGFuZAotWE9GRiAoXlMpLCB1c2luZyBcZklhc3luY21hcCBhMDAwMFxmUi4gIElmIHRoZSBwYXRoIGluY2x1ZGVzIGEgdGVsbmV0LAoteW91IHByb2JhYmx5IHNob3VsZCBlc2NhcGUgXl0gYXMgd2VsbCAoXGZJYXN5bmNtYXAgMjAwYTAwMDBcZlIpLiAgSWYKLXRoZSBwYXRoIGluY2x1ZGVzIGFuIHJsb2dpbiwgeW91IHdpbGwgbmVlZCB0byB1c2UgdGhlIFxmSWVzY2FwZSBmZlxmUgotb3B0aW9uIG9uIHRoZSBlbmQgd2hpY2ggaXMgcnVubmluZyB0aGUgcmxvZ2luIGNsaWVudCwgc2luY2UgbWFueQotcmxvZ2luIGltcGxlbWVudGF0aW9ucyBhcmUgbm90IHRyYW5zcGFyZW50OyB0aGV5IHdpbGwgcmVtb3ZlIHRoZQotc2VxdWVuY2UgWzB4ZmYsIDB4ZmYsIDB4NzMsIDB4NzMsIGZvbGxvd2VkIGJ5IGFueSA4IGJ5dGVzXSBmcm9tIHRoZQotc3RyZWFtLgotLlNIIERJQUdOT1NUSUNTCi0uTFAKLU1lc3NhZ2VzIGFyZSBzZW50IHRvIHRoZSBzeXNsb2cgZGFlbW9uIHVzaW5nIGZhY2lsaXR5IExPR19EQUVNT04uCi0oVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSByZWNvbXBpbGluZyBwcHBkIHdpdGggdGhlIG1hY3JvCi1MT0dfUFBQIGRlZmluZWQgYXMgdGhlIGRlc2lyZWQgZmFjaWxpdHkuKSAgU2VlIHRoZSBzeXNsb2coOCkKLWRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb2Ygd2hlcmUgdGhlIHN5c2xvZyBkYWVtb24gd2lsbCB3cml0ZSB0aGUKLW1lc3NhZ2VzLiAgT24gbW9zdCBzeXN0ZW1zLCB0aGUgc3lzbG9nIGRhZW1vbiB1c2VzIHRoZQotL2V0Yy9zeXNsb2cuY29uZiBmaWxlIHRvIHNwZWNpZnkgdGhlIGRlc3RpbmF0aW9uKHMpIGZvciBzeXNsb2cKLW1lc3NhZ2VzLiAgWW91IG1heSBuZWVkIHRvIGVkaXQgdGhhdCBmaWxlIHRvIHN1aXQuCi0uTFAKLVRoZSBcZklkZWJ1Z1xmUiBvcHRpb24gY2F1c2VzIHRoZSBjb250ZW50cyBvZiBhbGwgY29udHJvbCBwYWNrZXRzIHNlbnQKLW9yIHJlY2VpdmVkIHRvIGJlIGxvZ2dlZCwgdGhhdCBpcywgYWxsIExDUCwgUEFQLCBDSEFQLCBFQVAsIG9yIElQQ1AgcGFja2V0cy4KLVRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB0aGUgUFBQIG5lZ290aWF0aW9uIGRvZXMgbm90IHN1Y2NlZWQgb3IgaWYKLWF1dGhlbnRpY2F0aW9uIGZhaWxzLgotSWYgZGVidWdnaW5nIGlzIGVuYWJsZWQgYXQgY29tcGlsZSB0aW1lLCB0aGUgXGZJZGVidWdcZlIgb3B0aW9uIGFsc28KLWNhdXNlcyBvdGhlciBkZWJ1Z2dpbmcgbWVzc2FnZXMgdG8gYmUgbG9nZ2VkLgotLkxQCi1EZWJ1Z2dpbmcgY2FuIGFsc28gYmUgZW5hYmxlZCBvciBkaXNhYmxlZCBieSBzZW5kaW5nIGEgU0lHVVNSMSBzaWduYWwKLXRvIHRoZSBwcHBkIHByb2Nlc3MuICBUaGlzIHNpZ25hbCBhY3RzIGFzIGEgdG9nZ2xlLgotLlNIIEVYSVQgU1RBVFVTCi1UaGUgZXhpdCBzdGF0dXMgb2YgcHBwZCBpcyBzZXQgdG8gaW5kaWNhdGUgd2hldGhlciBhbnkgZXJyb3Igd2FzCi1kZXRlY3RlZCwgb3IgdGhlIHJlYXNvbiBmb3IgdGhlIGxpbmsgYmVpbmcgdGVybWluYXRlZC4gIFRoZSB2YWx1ZXMKLXVzZWQgYXJlOgotLlRQCi0uQiAwCi1QcHBkIGhhcyBkZXRhY2hlZCwgb3Igb3RoZXJ3aXNlIHRoZSBjb25uZWN0aW9uIHdhcyBzdWNjZXNzZnVsbHkKLWVzdGFibGlzaGVkIGFuZCB0ZXJtaW5hdGVkIGF0IHRoZSBwZWVyJ3MgcmVxdWVzdC4KLS5UUAotLkIgMQotQW4gaW1tZWRpYXRlbHkgZmF0YWwgZXJyb3Igb2Ygc29tZSBraW5kIG9jY3VycmVkLCBzdWNoIGFzIGFuIGVzc2VudGlhbAotc3lzdGVtIGNhbGwgZmFpbGluZywgb3IgcnVubmluZyBvdXQgb2YgdmlydHVhbCBtZW1vcnkuCi0uVFAKLS5CIDIKLUFuIGVycm9yIHdhcyBkZXRlY3RlZCBpbiBwcm9jZXNzaW5nIHRoZSBvcHRpb25zIGdpdmVuLCBzdWNoIGFzIHR3bwotbXV0dWFsbHkgZXhjbHVzaXZlIG9wdGlvbnMgYmVpbmcgdXNlZC4KLS5UUAotLkIgMwotUHBwZCBpcyBub3Qgc2V0dWlkLXJvb3QgYW5kIHRoZSBpbnZva2luZyB1c2VyIGlzIG5vdCByb290LgotLlRQCi0uQiA0Ci1UaGUga2VybmVsIGRvZXMgbm90IHN1cHBvcnQgUFBQLCBmb3IgZXhhbXBsZSwgdGhlIFBQUCBrZXJuZWwgZHJpdmVyIGlzCi1ub3QgaW5jbHVkZWQgb3IgY2Fubm90IGJlIGxvYWRlZC4KLS5UUAotLkIgNQotUHBwZCB0ZXJtaW5hdGVkIGJlY2F1c2UgaXQgd2FzIHNlbnQgYSBTSUdJTlQsIFNJR1RFUk0gb3IgU0lHSFVQCi1zaWduYWwuCi0uVFAKLS5CIDYKLVRoZSBzZXJpYWwgcG9ydCBjb3VsZCBub3QgYmUgbG9ja2VkLgotLlRQCi0uQiA3Ci1UaGUgc2VyaWFsIHBvcnQgY291bGQgbm90IGJlIG9wZW5lZC4KLS5UUAotLkIgOAotVGhlIGNvbm5lY3Qgc2NyaXB0IGZhaWxlZCAocmV0dXJuZWQgYSBub24temVybyBleGl0IHN0YXR1cykuCi0uVFAKLS5CIDkKLVRoZSBjb21tYW5kIHNwZWNpZmllZCBhcyB0aGUgYXJndW1lbnQgdG8gdGhlIFxmSXB0eVxmUiBvcHRpb24gY291bGQKLW5vdCBiZSBydW4uCi0uVFAKLS5CIDEwCi1UaGUgUFBQIG5lZ290aWF0aW9uIGZhaWxlZCwgdGhhdCBpcywgaXQgZGlkbid0IHJlYWNoIHRoZSBwb2ludCB3aGVyZQotYXQgbGVhc3Qgb25lIG5ldHdvcmsgcHJvdG9jb2wgKGUuZy4gSVApIHdhcyBydW5uaW5nLgotLlRQCi0uQiAxMQotVGhlIHBlZXIgc3lzdGVtIGZhaWxlZCAob3IgcmVmdXNlZCkgdG8gYXV0aGVudGljYXRlIGl0c2VsZi4KLS5UUAotLkIgMTIKLVRoZSBsaW5rIHdhcyBlc3RhYmxpc2hlZCBzdWNjZXNzZnVsbHkgYW5kIHRlcm1pbmF0ZWQgYmVjYXVzZSBpdCB3YXMKLWlkbGUuCi0uVFAKLS5CIDEzCi1UaGUgbGluayB3YXMgZXN0YWJsaXNoZWQgc3VjY2Vzc2Z1bGx5IGFuZCB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlCi1jb25uZWN0IHRpbWUgbGltaXQgd2FzIHJlYWNoZWQuCi0uVFAKLS5CIDE0Ci1DYWxsYmFjayB3YXMgbmVnb3RpYXRlZCBhbmQgYW4gaW5jb21pbmcgY2FsbCBzaG91bGQgYXJyaXZlIHNob3J0bHkuCi0uVFAKLS5CIDE1Ci1UaGUgbGluayB3YXMgdGVybWluYXRlZCBiZWNhdXNlIHRoZSBwZWVyIGlzIG5vdCByZXNwb25kaW5nIHRvIGVjaG8KLXJlcXVlc3RzLgotLlRQCi0uQiAxNgotVGhlIGxpbmsgd2FzIHRlcm1pbmF0ZWQgYnkgdGhlIG1vZGVtIGhhbmdpbmcgdXAuCi0uVFAKLS5CIDE3Ci1UaGUgUFBQIG5lZ290aWF0aW9uIGZhaWxlZCBiZWNhdXNlIHNlcmlhbCBsb29wYmFjayB3YXMgZGV0ZWN0ZWQuCi0uVFAKLS5CIDE4Ci1UaGUgaW5pdCBzY3JpcHQgZmFpbGVkIChyZXR1cm5lZCBhIG5vbi16ZXJvIGV4aXQgc3RhdHVzKS4KLS5UUAotLkIgMTkKLVdlIGZhaWxlZCB0byBhdXRoZW50aWNhdGUgb3Vyc2VsdmVzIHRvIHRoZSBwZWVyLgotLlNIIFNDUklQVFMKLVBwcGQgaW52b2tlcyBzY3JpcHRzIGF0IHZhcmlvdXMgc3RhZ2VzIGluIGl0cyBwcm9jZXNzaW5nIHdoaWNoIGNhbiBiZQotdXNlZCB0byBwZXJmb3JtIHNpdGUtc3BlY2lmaWMgYW5jaWxsYXJ5IHByb2Nlc3NpbmcuICBUaGVzZSBzY3JpcHRzIGFyZQotdXN1YWxseSBzaGVsbCBzY3JpcHRzLCBidXQgY291bGQgYmUgZXhlY3V0YWJsZSBjb2RlIGZpbGVzIGluc3RlYWQuCi1QcHBkIGRvZXMgbm90IHdhaXQgZm9yIHRoZSBzY3JpcHRzIHRvIGZpbmlzaCAoZXhjZXB0IGZvciB0aGUgaXAtcHJlLXVwCi1zY3JpcHQpLiAgVGhlIHNjcmlwdHMgYXJlCi1leGVjdXRlZCBhcyByb290ICh3aXRoIHRoZSByZWFsIGFuZCBlZmZlY3RpdmUgdXNlci1pZCBzZXQgdG8gMCksIHNvCi10aGF0IHRoZXkgY2FuIGRvIHRoaW5ncyBzdWNoIGFzIHVwZGF0ZSByb3V0aW5nIHRhYmxlcyBvciBydW4KLXByaXZpbGVnZWQgZGFlbW9ucy4gIEJlIGNhcmVmdWwgdGhhdCB0aGUgY29udGVudHMgb2YgdGhlc2Ugc2NyaXB0cyBkbwotbm90IGNvbXByb21pc2UgeW91ciBzeXN0ZW0ncyBzZWN1cml0eS4gIFBwcGQgcnVucyB0aGUgc2NyaXB0cyB3aXRoCi1zdGFuZGFyZCBpbnB1dCwgb3V0cHV0IGFuZCBlcnJvciByZWRpcmVjdGVkIHRvIC9kZXYvbnVsbCwgYW5kIHdpdGggYW4KLWVudmlyb25tZW50IHRoYXQgaXMgZW1wdHkgZXhjZXB0IGZvciBzb21lIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0Ci1naXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsaW5rLiAgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IHBwcGQKLXNldHMgYXJlOgotLlRQCi0uQiBERVZJQ0UKLVRoZSBuYW1lIG9mIHRoZSBzZXJpYWwgdHR5IGRldmljZSBiZWluZyB1c2VkLgotLlRQCi0uQiBJRk5BTUUKLVRoZSBuYW1lIG9mIHRoZSBuZXR3b3JrIGludGVyZmFjZSBiZWluZyB1c2VkLgotLlRQCi0uQiBJUExPQ0FMCi1UaGUgSVAgYWRkcmVzcyBmb3IgdGhlIGxvY2FsIGVuZCBvZiB0aGUgbGluay4gIFRoaXMgaXMgb25seSBzZXQgd2hlbgotSVBDUCBoYXMgY29tZSB1cC4KLS5UUAotLkIgSVBSRU1PVEUKLVRoZSBJUCBhZGRyZXNzIGZvciB0aGUgcmVtb3RlIGVuZCBvZiB0aGUgbGluay4gIFRoaXMgaXMgb25seSBzZXQgd2hlbgotSVBDUCBoYXMgY29tZSB1cC4KLS5UUAotLkIgUEVFUk5BTUUKLVRoZSBhdXRoZW50aWNhdGVkIG5hbWUgb2YgdGhlIHBlZXIuICBUaGlzIGlzIG9ubHkgc2V0IGlmIHRoZSBwZWVyCi1hdXRoZW50aWNhdGVzIGl0c2VsZi4KLS5UUAotLkIgU1BFRUQKLVRoZSBiYXVkIHJhdGUgb2YgdGhlIHR0eSBkZXZpY2UuCi0uVFAKLS5CIE9SSUdfVUlECi1UaGUgcmVhbCB1c2VyLWlkIG9mIHRoZSB1c2VyIHdobyBpbnZva2VkIHBwcGQuCi0uVFAKLS5CIFBQUExPR05BTUUKLVRoZSB1c2VybmFtZSBvZiB0aGUgcmVhbCB1c2VyLWlkIHRoYXQgaW52b2tlZCBwcHBkLiBUaGlzIGlzIGFsd2F5cyBzZXQuCi0uUAotRm9yIHRoZSBpcC1kb3duIGFuZCBhdXRoLWRvd24gc2NyaXB0cywgcHBwZCBhbHNvIHNldHMgdGhlIGZvbGxvd2luZwotdmFyaWFibGVzIGdpdmluZyBzdGF0aXN0aWNzIGZvciB0aGUgY29ubmVjdGlvbjoKLS5UUAotLkIgQ09OTkVDVF9USU1FCi1UaGUgbnVtYmVyIG9mIHNlY29uZHMgZnJvbSB3aGVuIHRoZSBQUFAgbmVnb3RpYXRpb24gc3RhcnRlZCB1bnRpbCB0aGUKLWNvbm5lY3Rpb24gd2FzIHRlcm1pbmF0ZWQuCi0uVFAKLS5CIEJZVEVTX1NFTlQKLVRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudCAoYXQgdGhlIGxldmVsIG9mIHRoZSBzZXJpYWwgcG9ydCkgZHVyaW5nIHRoZQotY29ubmVjdGlvbi4KLS5UUAotLkIgQllURVNfUkNWRAotVGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCAoYXQgdGhlIGxldmVsIG9mIHRoZSBzZXJpYWwgcG9ydCkgZHVyaW5nCi10aGUgY29ubmVjdGlvbi4KLS5UUAotLkIgTElOS05BTUUKLVRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGxpbmssIHNldCB3aXRoIHRoZSBcZklsaW5rbmFtZVxmUiBvcHRpb24uCi0uVFAKLS5CIEROUzEKLUlmIHRoZSBwZWVyIHN1cHBsaWVzIEROUyBzZXJ2ZXIgYWRkcmVzc2VzLCB0aGlzIHZhcmlhYmxlIGlzIHNldCB0byB0aGUKLWZpcnN0IEROUyBzZXJ2ZXIgYWRkcmVzcyBzdXBwbGllZCAod2hldGhlciBvciBub3QgdGhlIHVzZXBlZXJkbnMKLW9wdGlvbiB3YXMgZ2l2ZW4pLgotLlRQCi0uQiBETlMyCi1JZiB0aGUgcGVlciBzdXBwbGllcyBETlMgc2VydmVyIGFkZHJlc3NlcywgdGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gdGhlCi1zZWNvbmQgRE5TIHNlcnZlciBhZGRyZXNzIHN1cHBsaWVkICh3aGV0aGVyIG9yIG5vdCB0aGUgdXNlcGVlcmRucwotb3B0aW9uIHdhcyBnaXZlbikuCi0uUAotUHBwZCBpbnZva2VzIHRoZSBmb2xsb3dpbmcgc2NyaXB0cywgaWYgdGhleSBleGlzdC4gIEl0IGlzIG5vdCBhbiBlcnJvcgotaWYgdGhleSBkb24ndCBleGlzdC4KLS5UUAotLkIgL2V0Yy9wcHAvYXV0aFwtdXAKLUEgcHJvZ3JhbSBvciBzY3JpcHQgd2hpY2ggaXMgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHJlbW90ZSBzeXN0ZW0KLXN1Y2Nlc3NmdWxseSBhdXRoZW50aWNhdGVzIGl0c2VsZi4gIEl0IGlzIGV4ZWN1dGVkIHdpdGggdGhlIHBhcmFtZXRlcnMKLS5JUAotXGZJaW50ZXJmYWNlXC1uYW1lIHBlZXJcLW5hbWUgdXNlclwtbmFtZSB0dHlcLWRldmljZSBzcGVlZFxmUgotLklQCi1Ob3RlIHRoYXQgdGhpcyBzY3JpcHQgaXMgbm90IGV4ZWN1dGVkIGlmIHRoZSBwZWVyIGRvZXNuJ3QgYXV0aGVudGljYXRlCi1pdHNlbGYsIGZvciBleGFtcGxlIHdoZW4gdGhlIFxmSW5vYXV0aFxmUiBvcHRpb24gaXMgdXNlZC4KLS5UUAotLkIgL2V0Yy9wcHAvYXV0aFwtZG93bgotQSBwcm9ncmFtIG9yIHNjcmlwdCB3aGljaCBpcyBleGVjdXRlZCB3aGVuIHRoZSBsaW5rIGdvZXMgZG93biwgaWYKLS9ldGMvcHBwL2F1dGhcLXVwIHdhcyBwcmV2aW91c2x5IGV4ZWN1dGVkLiAgSXQgaXMgZXhlY3V0ZWQgaW4gdGhlIHNhbWUKLW1hbm5lciB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgL2V0Yy9wcHAvYXV0aFwtdXAuCi0uVFAKLS5CIC9ldGMvcHBwL2lwXC1wcmVcLXVwCi1BIHByb2dyYW0gb3Igc2NyaXB0IHdoaWNoIGlzIGV4ZWN1dGVkIGp1c3QgYmVmb3JlIHRoZSBwcHAgbmV0d29yawotaW50ZXJmYWNlIGlzIGJyb3VnaHQgdXAuICBJdCBpcyBleGVjdXRlZCB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMKLXRoZSBpcFwtdXAgc2NyaXB0IChiZWxvdykuICBBdCB0aGlzIHBvaW50IHRoZSBpbnRlcmZhY2UgZXhpc3RzIGFuZCBoYXMKLUlQIGFkZHJlc3NlcyBhc3NpZ25lZCBidXQgaXMgc3RpbGwgZG93bi4gIFRoaXMgY2FuIGJlIHVzZWQgdG8KLWFkZCBmaXJld2FsbCBydWxlcyBiZWZvcmUgYW55IElQIHRyYWZmaWMgY2FuIHBhc3MgdGhyb3VnaCB0aGUKLWludGVyZmFjZS4gIFBwcGQgd2lsbCB3YWl0IGZvciB0aGlzIHNjcmlwdCB0byBmaW5pc2ggYmVmb3JlIGJyaW5naW5nCi10aGUgaW50ZXJmYWNlIHVwLCBzbyB0aGlzIHNjcmlwdCBzaG91bGQgcnVuIHF1aWNrbHkuCi0uVFAKLS5CIC9ldGMvcHBwL2lwXC11cAotQSBwcm9ncmFtIG9yIHNjcmlwdCB3aGljaCBpcyBleGVjdXRlZCB3aGVuIHRoZSBsaW5rIGlzIGF2YWlsYWJsZSBmb3IKLXNlbmRpbmcgYW5kIHJlY2VpdmluZyBJUCBwYWNrZXRzICh0aGF0IGlzLCBJUENQIGhhcyBjb21lIHVwKS4gIEl0IGlzCi1leGVjdXRlZCB3aXRoIHRoZSBwYXJhbWV0ZXJzCi0uSVAKLVxmSWludGVyZmFjZVwtbmFtZSB0dHlcLWRldmljZSBzcGVlZCBsb2NhbFwtSVBcLWFkZHJlc3MKLXJlbW90ZVwtSVBcLWFkZHJlc3MgaXBwYXJhbVxmUgotLlRQCi0uQiAvZXRjL3BwcC9pcFwtZG93bgotQSBwcm9ncmFtIG9yIHNjcmlwdCB3aGljaCBpcyBleGVjdXRlZCB3aGVuIHRoZSBsaW5rIGlzIG5vIGxvbmdlcgotYXZhaWxhYmxlIGZvciBzZW5kaW5nIGFuZCByZWNlaXZpbmcgSVAgcGFja2V0cy4gIFRoaXMgc2NyaXB0IGNhbiBiZQotdXNlZCBmb3IgdW5kb2luZyB0aGUgZWZmZWN0cyBvZiB0aGUgL2V0Yy9wcHAvaXBcLXVwIGFuZAotL2V0Yy9wcHAvaXBcLXByZVwtdXAgc2NyaXB0cy4gIEl0IGlzCi1pbnZva2VkIGluIHRoZSBzYW1lIG1hbm5lciBhbmQgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIHRoZSBpcFwtdXAKLXNjcmlwdC4KLS5UUAotLkIgL2V0Yy9wcHAvaXB2NlwtdXAKLUxpa2UgL2V0Yy9wcHAvaXBcLXVwLCBleGNlcHQgdGhhdCBpdCBpcyBleGVjdXRlZCB3aGVuIHRoZSBsaW5rIGlzIGF2YWlsYWJsZSAKLWZvciBzZW5kaW5nIGFuZCByZWNlaXZpbmcgSVB2NiBwYWNrZXRzLiBJdCBpcyBleGVjdXRlZCB3aXRoIHRoZSBwYXJhbWV0ZXJzCi0uSVAKLVxmSWludGVyZmFjZVwtbmFtZSB0dHlcLWRldmljZSBzcGVlZCBsb2NhbFwtbGlua1wtbG9jYWxcLWFkZHJlc3MKLXJlbW90ZVwtbGlua1wtbG9jYWxcLWFkZHJlc3MgaXBwYXJhbVxmUgotLlRQCi0uQiAvZXRjL3BwcC9pcHY2XC1kb3duCi1TaW1pbGFyIHRvIC9ldGMvcHBwL2lwXC1kb3duLCBidXQgaXQgaXMgZXhlY3V0ZWQgd2hlbiBJUHY2IHBhY2tldHMgY2FuIG5vCi1sb25nZXIgYmUgdHJhbnNtaXR0ZWQgb24gdGhlIGxpbmsuIEl0IGlzIGV4ZWN1dGVkIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycyAKLWFzIHRoZSBpcHY2XC11cCBzY3JpcHQuCi0uVFAKLS5CIC9ldGMvcHBwL2lweFwtdXAKLUEgcHJvZ3JhbSBvciBzY3JpcHQgd2hpY2ggaXMgZXhlY3V0ZWQgd2hlbiB0aGUgbGluayBpcyBhdmFpbGFibGUgZm9yCi1zZW5kaW5nIGFuZCByZWNlaXZpbmcgSVBYIHBhY2tldHMgKHRoYXQgaXMsIElQWENQIGhhcyBjb21lIHVwKS4gIEl0IGlzCi1leGVjdXRlZCB3aXRoIHRoZSBwYXJhbWV0ZXJzCi0uSVAKLVxmSWludGVyZmFjZVwtbmFtZSB0dHlcLWRldmljZSBzcGVlZCBuZXR3b3JrXC1udW1iZXIgbG9jYWxcLUlQWFwtbm9kZVwtYWRkcmVzcwotcmVtb3RlXC1JUFhcLW5vZGVcLWFkZHJlc3MgbG9jYWxcLUlQWFwtcm91dGluZ1wtcHJvdG9jb2wgcmVtb3RlXC1JUFhcLXJvdXRpbmdcLXByb3RvY29sCi1sb2NhbFwtSVBYXC1yb3V0ZXJcLW5hbWUgcmVtb3RlXC1JUFhcLXJvdXRlclwtbmFtZSBpcHBhcmFtIHBwcGRcLXBpZFxmUiAKLS5JUAotVGhlIGxvY2FsXC1JUFhcLXJvdXRpbmdcLXByb3RvY29sIGFuZCByZW1vdGVcLUlQWFwtcm91dGluZ1wtcHJvdG9jb2wgZmllbGQKLW1heSBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLS5JUAotTk9ORSAgICAgIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgaXMgbm8gcm91dGluZyBwcm90b2NvbAotLmJyCi1SSVAgICAgICAgdG8gaW5kaWNhdGUgdGhhdCBSSVAvU0FQIHNob3VsZCBiZSB1c2VkCi0uYnIKLU5MU1AgICAgICB0byBpbmRpY2F0ZSB0aGF0IE5vdmVsbCBOTFNQIHNob3VsZCBiZSB1c2VkCi0uYnIKLVJJUCBOTFNQICB0byBpbmRpY2F0ZSB0aGF0IGJvdGggUklQL1NBUCBhbmQgTkxTUCBzaG91bGQgYmUgdXNlZAotLlRQCi0uQiAvZXRjL3BwcC9pcHhcLWRvd24KLUEgcHJvZ3JhbSBvciBzY3JpcHQgd2hpY2ggaXMgZXhlY3V0ZWQgd2hlbiB0aGUgbGluayBpcyBubyBsb25nZXIKLWF2YWlsYWJsZSBmb3Igc2VuZGluZyBhbmQgcmVjZWl2aW5nIElQWCBwYWNrZXRzLiAgVGhpcyBzY3JpcHQgY2FuIGJlCi11c2VkIGZvciB1bmRvaW5nIHRoZSBlZmZlY3RzIG9mIHRoZSAvZXRjL3BwcC9pcHhcLXVwIHNjcmlwdC4gIEl0IGlzCi1pbnZva2VkIGluIHRoZSBzYW1lIG1hbm5lciBhbmQgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIHRoZSBpcHhcLXVwCi1zY3JpcHQuCi0uU0ggRklMRVMKLS5UUAotLkIgL3Zhci9ydW4vcHBwXGZJblxmQi5waWQgXGZSKEJTRCBvciBMaW51eCksIFxmQi9ldGMvcHBwL3BwcFxmSW5cZkIucGlkIFxmUihvdGhlcnMpCi1Qcm9jZXNzLUlEIGZvciBwcHBkIHByb2Nlc3Mgb24gcHBwIGludGVyZmFjZSB1bml0IFxmSW5cZlIuCi0uVFAKLS5CIC92YXIvcnVuL3BwcFwtXGZJbmFtZVxmQi5waWQgXGZSKEJTRCBvciBMaW51eCksCi1cZkIvZXRjL3BwcC9wcHBcLVxmSW5hbWVcZkIucGlkIFxmUihvdGhlcnMpCi1Qcm9jZXNzLUlEIGZvciBwcHBkIHByb2Nlc3MgZm9yIGxvZ2ljYWwgbGluayBcZkluYW1lXGZSIChzZWUgdGhlCi1cZklsaW5rbmFtZVxmUiBvcHRpb24pLgotLlRQCi0uQiAvdmFyL3J1bi9wcHBkMi50ZGIKLURhdGFiYXNlIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgcHBwZCBwcm9jZXNzZXMsIGludGVyZmFjZXMgYW5kCi1saW5rcywgdXNlZCBmb3IgbWF0Y2hpbmcgbGlua3MgdG8gYnVuZGxlcyBpbiBtdWx0aWxpbmsgb3BlcmF0aW9uLiAgTWF5Ci1iZSBleGFtaW5lZCBieSBleHRlcm5hbCBwcm9ncmFtcyB0byBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgcnVubmluZwotcHBwZCBpbnN0YW5jZXMsIHRoZSBpbnRlcmZhY2VzIGFuZCBkZXZpY2VzIHRoZXkgYXJlIHVzaW5nLCBJUCBhZGRyZXNzCi1hc3NpZ25tZW50cywgZXRjLgotLkIgL2V0Yy9wcHAvcGFwXC1zZWNyZXRzCi1Vc2VybmFtZXMsIHBhc3N3b3JkcyBhbmQgSVAgYWRkcmVzc2VzIGZvciBQQVAgYXV0aGVudGljYXRpb24uICBUaGlzCi1maWxlIHNob3VsZCBiZSBvd25lZCBieSByb290IGFuZCBub3QgcmVhZGFibGUgb3Igd3JpdGFibGUgYnkgYW55IG90aGVyCi11c2VyLiAgUHBwZCB3aWxsIGxvZyBhIHdhcm5pbmcgaWYgdGhpcyBpcyBub3QgdGhlIGNhc2UuCi0uVFAKLS5CIC9ldGMvcHBwL2NoYXBcLXNlY3JldHMKLU5hbWVzLCBzZWNyZXRzIGFuZCBJUCBhZGRyZXNzZXMgZm9yIENIQVAvTVNcLUNIQVAvTVNcLUNIQVB2MiBhdXRoZW50aWNhdGlvbi4KLUFzIGZvciAvZXRjL3BwcC9wYXBcLXNlY3JldHMsIHRoaXMgZmlsZSBzaG91bGQgYmUgb3duZWQgYnkgcm9vdCBhbmQgbm90Ci1yZWFkYWJsZSBvciB3cml0YWJsZSBieSBhbnkgb3RoZXIgdXNlci4gIFBwcGQgd2lsbCBsb2cgYSB3YXJuaW5nIGlmCi10aGlzIGlzIG5vdCB0aGUgY2FzZS4KLS5UUAotLkIgL2V0Yy9wcHAvc3JwXC1zZWNyZXRzCi1OYW1lcywgc2VjcmV0cywgYW5kIElQIGFkZHJlc3NlcyBmb3IgRUFQIGF1dGhlbnRpY2F0aW9uLiAgQXMgZm9yCi0vZXRjL3BwcC9wYXBcLXNlY3JldHMsIHRoaXMgZmlsZSBzaG91bGQgYmUgb3duZWQgYnkgcm9vdCBhbmQgbm90Ci1yZWFkYWJsZSBvciB3cml0YWJsZSBieSBhbnkgb3RoZXIgdXNlci4gIFBwcGQgd2lsbCBsb2cgYSB3YXJuaW5nIGlmCi10aGlzIGlzIG5vdCB0aGUgY2FzZS4KLS5UUAotLkIgfi8ucHBwX3BzZXVkb255bQotU2F2ZWQgY2xpZW50LXNpZGUgU1JQXC1TSEExIHBzZXVkb255bS4gIFNlZSB0aGUgXGZJc3JwXC11c2VcLXBzZXVkb255bVxmUgotb3B0aW9uIGZvciBkZXRhaWxzLgotLlRQCi0uQiAvZXRjL3BwcC9vcHRpb25zCi1TeXN0ZW0gZGVmYXVsdCBvcHRpb25zIGZvciBwcHBkLCByZWFkIGJlZm9yZSB1c2VyIGRlZmF1bHQgb3B0aW9ucyBvcgotY29tbWFuZC1saW5lIG9wdGlvbnMuCi0uVFAKLS5CIH4vLnBwcHJjCi1Vc2VyIGRlZmF1bHQgb3B0aW9ucywgcmVhZCBiZWZvcmUgL2V0Yy9wcHAvb3B0aW9ucy5cZkl0dHluYW1lXGZSLgotLlRQCi0uQiAvZXRjL3BwcC9vcHRpb25zLlxmSXR0eW5hbWUKLVN5c3RlbSBkZWZhdWx0IG9wdGlvbnMgZm9yIHRoZSBzZXJpYWwgcG9ydCBiZWluZyB1c2VkLCByZWFkIGFmdGVyCi1+Ly5wcHByYy4gIEluIGZvcm1pbmcgdGhlIFxmSXR0eW5hbWVcZlIgcGFydCBvZiB0aGlzCi1maWxlbmFtZSwgYW4gaW5pdGlhbCAvZGV2LyBpcyBzdHJpcHBlZCBmcm9tIHRoZSBwb3J0IG5hbWUgKGlmCi1wcmVzZW50KSwgYW5kIGFueSBzbGFzaGVzIGluIHRoZSByZW1haW5pbmcgcGFydCBhcmUgY29udmVydGVkIHRvCi1kb3RzLgotLlRQCi0uQiAvZXRjL3BwcC9wZWVycwotQSBkaXJlY3RvcnkgY29udGFpbmluZyBvcHRpb25zIGZpbGVzIHdoaWNoIG1heSBjb250YWluIHByaXZpbGVnZWQKLW9wdGlvbnMsIGV2ZW4gaWYgcHBwZCB3YXMgaW52b2tlZCBieSBhIHVzZXIgb3RoZXIgdGhhbiByb290LiAgVGhlCi1zeXN0ZW0gYWRtaW5pc3RyYXRvciBjYW4gY3JlYXRlIG9wdGlvbnMgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgdG8KLXBlcm1pdCBub24tcHJpdmlsZWdlZCB1c2VycyB0byBkaWFsIG91dCB3aXRob3V0IHJlcXVpcmluZyB0aGUgcGVlciB0bwotYXV0aGVudGljYXRlLCBidXQgb25seSB0byBjZXJ0YWluIHRydXN0ZWQgcGVlcnMuCi0uU0ggU0VFIEFMU08KLS5CUiBjaGF0ICg4KSwKLS5CUiBwcHBzdGF0cyAoOCkKLS5UUAotLkIgUkZDMTE0NAotSmFjb2Jzb24sIFYuCi1cZklDb21wcmVzc2luZyBUQ1AvSVAgaGVhZGVycyBmb3IgbG93LXNwZWVkIHNlcmlhbCBsaW5rcy5cZlIKLUZlYnJ1YXJ5IDE5OTAuCi0uVFAKLS5CIFJGQzEzMjEKLVJpdmVzdCwgUi4KLS5JIFRoZSBNRDUgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtLgotQXByaWwgMTk5Mi4KLS5UUAotLkIgUkZDMTMzMgotTWNHcmVnb3IsIEcuCi0uSSBQUFAgSW50ZXJuZXQgUHJvdG9jb2wgQ29udHJvbCBQcm90b2NvbCAoSVBDUCkuCi1NYXkgMTk5Mi4KLS5UUAotLkIgUkZDMTMzNAotTGxveWQsIEIuOyBTaW1wc29uLCBXLkEuCi0uSSBQUFAgYXV0aGVudGljYXRpb24gcHJvdG9jb2xzLgotT2N0b2JlciAxOTkyLgotLlRQCi0uQiBSRkMxNjYxCi1TaW1wc29uLCBXLkEuCi0uSSBUaGUgUG9pbnQtdG8tUG9pbnQgUHJvdG9jb2wgKFBQUCkuCi1KdWx5IDE5OTQuCi0uVFAKLS5CIFJGQzE2NjIKLVNpbXBzb24sIFcuQS4KLS5JIFBQUCBpbiBIRExDLWxpa2UgRnJhbWluZy4KLUp1bHkgMTk5NC4KLS5UUAotLkIgUkZDMjI4NAotQmx1bmssIEwuOyBWb2xsYnJlY2h0LCBKLiwKLS5JIFBQUCBFeHRlbnNpYmxlIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sIChFQVApLgotTWFyY2ggMTk5OC4KLS5UUAotLkIgUkZDMjQ3MgotSGFza2luLCBELgotLkkgSVAgVmVyc2lvbiA2IG92ZXIgUFBQCi1EZWNlbWJlciAxOTk4LgotLlRQCi0uQiBSRkMyOTQ1Ci1XdSwgVC4sCi0uSSBUaGUgU1JQIEF1dGhlbnRpY2F0aW9uIGFuZCBLZXkgRXhjaGFuZ2UgU3lzdGVtCi1TZXB0ZW1iZXIgMjAwMC4KLS5UUAotLkIgZHJhZnRcLWlldGZcLXBwcGV4dFwtZWFwXC1zcnBcLTAzLnR4dAotQ2FybHNvbiwgSi47IGV0IGFsLiwKLS5JIEVBUCBTUlBcLVNIQTEgQXV0aGVudGljYXRpb24gUHJvdG9jb2wuCi1KdWx5IDIwMDEuCi0uU0ggTk9URVMKLVNvbWUgbGltaXRlZCBkZWdyZWUgb2YgY29udHJvbCBjYW4gYmUgZXhlcmNpc2VkIG92ZXIgYSBydW5uaW5nIHBwcGQKLXByb2Nlc3MgYnkgc2VuZGluZyBpdCBhIHNpZ25hbCBmcm9tIHRoZSBsaXN0IGJlbG93LgotLlRQCi0uQiBTSUdJTlQsIFNJR1RFUk0KLVRoZXNlIHNpZ25hbHMgY2F1c2UgcHBwZCB0byB0ZXJtaW5hdGUgdGhlIGxpbmsgKGJ5IGNsb3NpbmcgTENQKSwKLXJlc3RvcmUgdGhlIHNlcmlhbCBkZXZpY2Ugc2V0dGluZ3MsIGFuZCBleGl0LiAgSWYgYSBjb25uZWN0b3Igb3IKLWRpc2Nvbm5lY3RvciBwcm9jZXNzIGlzIGN1cnJlbnRseSBydW5uaW5nLCBwcHBkIHdpbGwgc2VuZCB0aGUgc2FtZQotc2lnbmFsIHRvIGl0cyBwcm9jZXNzIGdyb3VwLCBzbyBhcyB0byB0ZXJtaW5hdGUgdGhlIGNvbm5lY3RvciBvcgotZGlzY29ubmVjdG9yIHByb2Nlc3MuCi0uVFAKLS5CIFNJR0hVUAotVGhpcyBzaWduYWwgY2F1c2VzIHBwcGQgdG8gdGVybWluYXRlIHRoZSBsaW5rLCByZXN0b3JlIHRoZSBzZXJpYWwKLWRldmljZSBzZXR0aW5ncywgYW5kIGNsb3NlIHRoZSBzZXJpYWwgZGV2aWNlLiAgSWYgdGhlIFxmSXBlcnNpc3RcZlIgb3IKLVxmSWRlbWFuZFxmUiBvcHRpb24gaGFzIGJlZW4gc3BlY2lmaWVkLCBwcHBkIHdpbGwgdHJ5IHRvIHJlb3BlbiB0aGUKLXNlcmlhbCBkZXZpY2UgYW5kIHN0YXJ0IGFub3RoZXIgY29ubmVjdGlvbiAoYWZ0ZXIgdGhlIGhvbGRvZmYgcGVyaW9kKS4KLU90aGVyd2lzZSBwcHBkIHdpbGwgZXhpdC4gIElmIHRoaXMgc2lnbmFsIGlzIHJlY2VpdmVkIGR1cmluZyB0aGUKLWhvbGRvZmYgcGVyaW9kLCBpdCBjYXVzZXMgcHBwZCB0byBlbmQgdGhlIGhvbGRvZmYgcGVyaW9kIGltbWVkaWF0ZWx5LgotSWYgYSBjb25uZWN0b3Igb3IgZGlzY29ubmVjdG9yIHByb2Nlc3MgaXMgcnVubmluZywgcHBwZCB3aWxsIHNlbmQgdGhlCi1zYW1lIHNpZ25hbCB0byBpdHMgcHJvY2VzcyBncm91cC4KLS5UUAotLkIgU0lHVVNSMQotVGhpcyBzaWduYWwgdG9nZ2xlcyB0aGUgc3RhdGUgb2YgdGhlIFxmSWRlYnVnXGZSIG9wdGlvbi4KLS5UUAotLkIgU0lHVVNSMgotVGhpcyBzaWduYWwgY2F1c2VzIHBwcGQgdG8gcmVuZWdvdGlhdGUgY29tcHJlc3Npb24uICBUaGlzIGNhbiBiZQotdXNlZnVsIHRvIHJlLWVuYWJsZSBjb21wcmVzc2lvbiBhZnRlciBpdCBoYXMgYmVlbiBkaXNhYmxlZCBhcyBhIHJlc3VsdAotb2YgYSBmYXRhbCBkZWNvbXByZXNzaW9uIGVycm9yLiAgKEZhdGFsIGRlY29tcHJlc3Npb24gZXJyb3JzIGdlbmVyYWxseQotaW5kaWNhdGUgYSBidWcgaW4gb25lIG9yIG90aGVyIGltcGxlbWVudGF0aW9uLikKLQotLlNIIEFVVEhPUlMKLVBhdWwgTWFja2VycmFzIChwYXVsdXNAc2FtYmEub3JnKSwgYmFzZWQgb24gZWFybGllciB3b3JrIGJ5Ci1EcmV3IFBlcmtpbnMsCi1CcmFkIENsZW1lbnRzLAotS2FybCBGb3gsCi1HcmVnIENocmlzdHksCi1hbmQKLUJyYWQgUGFya2VyLgotCi0uU0ggQ09QWVJJR0hUCi1QcHBkIGlzIGNvcHlyaWdodGVkIGFuZCBtYWRlIGF2YWlsYWJsZSB1bmRlciBjb25kaXRpb25zIHdoaWNoIHByb3ZpZGUKLXRoYXQgaXQgbWF5IGJlIGNvcGllZCBhbmQgdXNlZCBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zIHByb3ZpZGVkIHRoYXQKLXRoZSBjb25kaXRpb25zIGxpc3RlZCBiZWxvdyBhcmUgbWV0LiAgUG9ydGlvbnMgb2YgcHBwZCBhcmUgY292ZXJlZCBieQotdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQgbm90aWNlczoKLS5MUAotQ29weXJpZ2h0IChjKSAxOTg0LTIwMDAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuIEFsbCByaWdodHMKLXJlc2VydmVkLgotLmJyCi1Db3B5cmlnaHQgKGMpIDE5OTMtMjAwNCBQYXVsIE1hY2tlcnJhcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5icgotQ29weXJpZ2h0IChjKSAxOTk1IFBlZHJvIFJvcXVlIE1hcnF1ZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLmJyCi1Db3B5cmlnaHQgKGMpIDE5OTUgRXJpYyBSb3NlbnF1aXN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5icgotQ29weXJpZ2h0IChjKSAxOTk5IFRvbW1pIEtvbXVsYWluZW4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLmJyCi1Db3B5cmlnaHQgKEMpIEFuZHJldyBUcmlkZ2VsbCAxOTk5Ci0uYnIKLUNvcHlyaWdodCAoYykgMjAwMCBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLmJyCi1Db3B5cmlnaHQgKGMpIDIwMDEgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5icgotQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS5MUAotVGhlIGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnRzLgotLkxQCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLS5MUAotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS5MUAotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICAgZGlzdHJpYnV0aW9uLgotLkxQCi0zLiBUaGUgbmFtZSAiQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciBwZXJtaXNzaW9uIG9yIGFueSBsZWdhbAotICAgZGV0YWlscywgcGxlYXNlIGNvbnRhY3QKLS5icgotICAgICBPZmZpY2Ugb2YgVGVjaG5vbG9neSBUcmFuc2ZlcgotLmJyCi0gICAgIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5Ci0uYnIKLSAgICAgNTAwMCBGb3JiZXMgQXZlbnVlCi0uYnIKLSAgICAgUGl0dHNidXJnaCwgUEEgIDE1MjEzLTM4OTAKLS5icgotICAgICAoNDEyKSAyNjgtNDM4NywgZmF4OiAoNDEyKSAyNjgtNzM5NQotLmJyCi0gICAgIHRlY2gtdHJhbnNmZXJAYW5kcmV3LmNtdS5lZHUKLS5MUAotM2IuIFRoZSBuYW1lKHMpIG9mIHRoZSBhdXRob3JzIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgdXNlZCB0bwotICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS5MUAotNC4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICAgYWNrbm93bGVkZ2VtZW50czoKLS5icgotICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQ29tcHV0aW5nIFNlcnZpY2VzCi0gICAgYXQgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkgKGh0dHA6Ly93d3cuY211LmVkdS9jb21wdXRpbmcvKS4iCi0uYnIKLSAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFBhdWwgTWFja2VycmFzCi0gICAgPHBhdWx1c0BzYW1iYS5vcmc+Ii4KLS5icgotICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgUGVkcm8gUm9xdWUgTWFycXVlcwotICAgIDxwZWRyb19tQHlhaG9vLmNvbT4iLgotLmJyCi0gICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBUb21taSBLb211bGFpbmVuCi0gICAgPFRvbW1pLktvbXVsYWluZW5AaWtpLmZpPiIuCi0uTFAKLUNBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi1BTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgQkUgTElBQkxFCi1GT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLS5MUAotVEhFIEFVVEhPUlMgT0YgVEhJUyBTT0ZUV0FSRSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi1BTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKLVNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi1BTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KZGlmZiAtLWdpdCBhL3BwcGQvcHBwZC5oIGIvcHBwZC9wcHBkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxOGNkMzAuLjAwMDAwMDAKLS0tIGEvcHBwZC9wcHBkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MzUgKzAsMCBAQAotLyoKLSAqIHBwcGQuaCAtIFBQUCBkYWVtb24gZ2xvYmFsIGRlY2xhcmF0aW9ucy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODQtMjAwMCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgbmFtZSAiQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciBwZXJtaXNzaW9uIG9yIGFueSBsZWdhbAotICogICAgZGV0YWlscywgcGxlYXNlIGNvbnRhY3QKLSAqICAgICAgT2ZmaWNlIG9mIFRlY2hub2xvZ3kgVHJhbnNmZXIKLSAqICAgICAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAqICAgICAgNTAwMCBGb3JiZXMgQXZlbnVlCi0gKiAgICAgIFBpdHRzYnVyZ2gsIFBBICAxNTIxMy0zODkwCi0gKiAgICAgICg0MTIpIDI2OC00Mzg3LCBmYXg6ICg0MTIpIDI2OC03Mzk1Ci0gKiAgICAgIHRlY2gtdHJhbnNmZXJAYW5kcmV3LmNtdS5lZHUKLSAqCi0gKiA0LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IENvbXB1dGluZyBTZXJ2aWNlcwotICogICAgIGF0IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IChodHRwOi8vd3d3LmNtdS5lZHUvY29tcHV0aW5nLykuIgotICoKLSAqIENBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotICogVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi0gKiBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi0gKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi0gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqCi0gKiAkSWQ6IHBwcGQuaCx2IDEuOTYgMjAwOC8wNi8yMyAxMTo0NzoxOCBwYXVsdXMgRXhwICQKLSAqLwotCi0vKgotICogVE9ETzoKLSAqLwotCi0jaWZuZGVmIF9fUFBQRF9IX18KLSNkZWZpbmUgX19QUFBEX0hfXwotCi0jaW5jbHVkZSA8c3RkaW8uaD4JCS8qIGZvciBGSUxFICovCi0jaW5jbHVkZSA8bGltaXRzLmg+CQkvKiBmb3IgTkdST1VQU19NQVggKi8KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4JCS8qIGZvciBNQVhQQVRITEVOIGFuZCBCU0Q0XzQsIGlmIGRlZmluZWQgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4JCS8qIGZvciB1X2ludDMyX3QsIGlmIGRlZmluZWQgKi8KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgkJLyogZm9yIHN0cnVjdCB0aW1ldmFsICovCi0jaW5jbHVkZSA8bmV0L3BwcF9kZWZzLmg+Ci0jaW5jbHVkZSAicGF0Y2hsZXZlbC5oIgotCi0jaWYgZGVmaW5lZChfX1NURENfXykKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNkZWZpbmUgX19WKHgpCXgKLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2RlZmluZSBfX1YoeCkJKHZhX2FsaXN0KSB2YV9kY2wKLSNkZWZpbmUgY29uc3QKLSNkZWZpbmUgdm9sYXRpbGUKLSNlbmRpZgotCi0jaWZkZWYgSU5FVDYKLSNpbmNsdWRlICJldWk2NC5oIgotI2VuZGlmCi0KLS8qCi0gKiBMaW1pdHMuCi0gKi8KLQotI2RlZmluZSBOVU1fUFBQCQkxCS8qIE9uZSBQUFAgaW50ZXJmYWNlIHN1cHBvcnRlZCAocGVyIHByb2Nlc3MpICovCi0jZGVmaW5lIE1BWFdPUkRMRU4JMTAyNAkvKiBtYXggbGVuZ3RoIG9mIHdvcmQgaW4gZmlsZSAoaW5jbCBudWxsKSAqLwotI2RlZmluZSBNQVhBUkdTCQkxCS8qIG1heCAjIGFyZ3MgdG8gYSBjb21tYW5kICovCi0jZGVmaW5lIE1BWE5BTUVMRU4JMjU2CS8qIG1heCBsZW5ndGggb2YgaG9zdG5hbWUgb3IgbmFtZSBmb3IgYXV0aCAqLwotI2RlZmluZSBNQVhTRUNSRVRMRU4JMjU2CS8qIG1heCBsZW5ndGggb2YgcGFzc3dvcmQgb3Igc2VjcmV0ICovCi0KLS8qCi0gKiBPcHRpb24gZGVzY3JpcHRvciBzdHJ1Y3R1cmUuCi0gKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyCWJvb2w7Ci0KLWVudW0gb3B0X3R5cGUgewotCW9fc3BlY2lhbF9ub2FyZyA9IDAsCi0Jb19zcGVjaWFsID0gMSwKLQlvX2Jvb2wsCi0Jb19pbnQsCi0Jb191aW50MzIsCi0Jb19zdHJpbmcsCi0Jb193aWxkCi19OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JY2hhcgkqbmFtZTsJCS8qIG5hbWUgb2YgdGhlIG9wdGlvbiAqLwotCWVudW0gb3B0X3R5cGUgdHlwZTsKLQl2b2lkCSphZGRyOwotCWNoYXIJKmRlc2NyaXB0aW9uOwotCXVuc2lnbmVkIGludCBmbGFnczsKLQl2b2lkCSphZGRyMjsKLQlpbnQJdXBwZXJfbGltaXQ7Ci0JaW50CWxvd2VyX2xpbWl0OwotCWNvbnN0IGNoYXIgKnNvdXJjZTsKLQlzaG9ydCBpbnQgcHJpb3JpdHk7Ci0Jc2hvcnQgaW50IHdpbm5lcjsKLX0gb3B0aW9uX3Q7Ci0KLS8qIFZhbHVlcyBmb3IgZmxhZ3MgKi8KLSNkZWZpbmUgT1BUX1ZBTFVFCTB4ZmYJLyogbWFzayBmb3IgcHJlc3VwcGxpZWQgdmFsdWUgKi8KLSNkZWZpbmUgT1BUX0hFWAkJMHgxMDAJLyogaW50IG9wdGlvbiBpcyBpbiBoZXggKi8KLSNkZWZpbmUgT1BUX05PQVJHCTB4MjAwCS8qIG9wdGlvbiBkb2Vzbid0IHRha2UgYXJndW1lbnQgKi8KLSNkZWZpbmUgT1BUX09SCQkweDQwMAkvKiBmb3IgdTMyLCBPUiBpbiBhcmd1bWVudCB0byB2YWx1ZSAqLwotI2RlZmluZSBPUFRfSU5DCQkweDQwMAkvKiBmb3Igb19pbnQsIGluY3JlbWVudCB2YWx1ZSAqLwotI2RlZmluZSBPUFRfQTJPUgkweDgwMAkvKiBmb3Igb19ib29sLCBPUiBhcmcgdG8gKih1X2NoYXIgKilhZGRyMiAqLwotI2RlZmluZSBPUFRfUFJJVgkweDEwMDAJLyogcHJpdmlsZWdlZCBvcHRpb24gKi8KLSNkZWZpbmUgT1BUX1NUQVRJQwkweDIwMDAJLyogc3RyaW5nIG9wdGlvbiBnb2VzIGludG8gc3RhdGljIGFycmF5ICovCi0jZGVmaW5lIE9QVF9OT0lOQ1IJMHgyMDAwCS8qIGZvciBvX2ludCwgdmFsdWUgbXVzdG4ndCBiZSBpbmNyZWFzZWQgKi8KLSNkZWZpbmUgT1BUX0xMSU1JVAkweDQwMDAJLyogY2hlY2sgdmFsdWUgYWdhaW5zdCBsb3dlciBsaW1pdCAqLwotI2RlZmluZSBPUFRfVUxJTUlUCTB4ODAwMAkvKiBjaGVjayB2YWx1ZSBhZ2FpbnN0IHVwcGVyIGxpbWl0ICovCi0jZGVmaW5lIE9QVF9MSU1JVFMJKE9QVF9MTElNSVR8T1BUX1VMSU1JVCkKLSNkZWZpbmUgT1BUX1pFUk9PSwkweDEwMDAwCS8qIDAgdmFsdWUgaXMgT0sgZXZlbiBpZiBub3Qgd2l0aGluIGxpbWl0cyAqLwotI2RlZmluZSBPUFRfSElERQkweDEwMDAwCS8qIGZvciBvX3N0cmluZywgcHJpbnQgdmFsdWUgYXMgPz8/Pz8/ICovCi0jZGVmaW5lIE9QVF9BMkxJU1QJMHgyMDAwMCAvKiBmb3Igb19zcGVjaWFsLCBrZWVwIGxpc3Qgb2YgdmFsdWVzICovCi0jZGVmaW5lIE9QVF9BMkNMUkIJMHgyMDAwMCAvKiBvX2Jvb2wsIGNsciB2YWwgYml0cyBpbiAqKHVfY2hhciAqKWFkZHIyICovCi0jZGVmaW5lIE9QVF9aRVJPSU5GCTB4NDAwMDAJLyogd2l0aCBPUFRfTk9JTkNSLCAwID09IGluZmluaXR5ICovCi0jZGVmaW5lIE9QVF9QUklPCTB4ODAwMDAJLyogcHJvY2VzcyBvcHRpb24gcHJpb3JpdGllcyBmb3IgdGhpcyBvcHRpb24gKi8KLSNkZWZpbmUgT1BUX1BSSU9TVUIJMHgxMDAwMDAgLyogc3Vic2lkaWFyeSBtZW1iZXIgb2YgcHJpb3JpdHkgZ3JvdXAgKi8KLSNkZWZpbmUgT1BUX0FMSUFTCTB4MjAwMDAwIC8qIG9wdGlvbiBpcyBhbGlhcyBmb3IgcHJldmlvdXMgb3B0aW9uICovCi0jZGVmaW5lIE9QVF9BMkNPUFkJMHg0MDAwMDAgLyogYWRkcjIgLT4gc2Vjb25kIGxvY2F0aW9uIHRvIHJjdiB2YWx1ZSAqLwotI2RlZmluZSBPUFRfRU5BQkxFCTB4ODAwMDAwIC8qIHVzZSAqYWRkcjIgYXMgZW5hYmxlIGZvciBvcHRpb24gKi8KLSNkZWZpbmUgT1BUX0EyQ0xSCTB4MTAwMDAwMCAvKiBjbGVhciAqKGJvb2wgKilhZGRyMiAqLwotI2RlZmluZSBPUFRfUFJJVkZJWAkweDIwMDAwMDAgLyogdXNlciBjYW4ndCBvdmVycmlkZSBpZiBzZXQgYnkgcm9vdCAqLwotI2RlZmluZSBPUFRfSU5JVE9OTFkJMHg0MDAwMDAwIC8qIG9wdGlvbiBjYW4gb25seSBiZSBzZXQgaW4gaW5pdCBwaGFzZSAqLwotI2RlZmluZSBPUFRfREVWRVFVSVYJMHg4MDAwMDAwIC8qIGVxdWl2IHRvIGRldmljZSBuYW1lICovCi0jZGVmaW5lIE9QVF9ERVZOQU0JKE9QVF9JTklUT05MWSB8IE9QVF9ERVZFUVVJVikKLSNkZWZpbmUgT1BUX0EyUFJJTlRFUgkweDEwMDAwMDAwIC8qICphZGRyMiBwcmludGVyX2Z1bmMgdG8gcHJpbnQgb3B0aW9uICovCi0jZGVmaW5lIE9QVF9BMlNUUlZBTAkweDIwMDAwMDAwIC8qICphZGRyMiBwb2ludHMgdG8gY3VycmVudCBzdHJpbmcgdmFsdWUgKi8KLSNkZWZpbmUgT1BUX05PUFJJTlQJMHg0MDAwMDAwMCAvKiBkb24ndCBwcmludCB0aGlzIG9wdGlvbiBhdCBhbGwgKi8KLQotI2RlZmluZSBPUFRfVkFMKHgpCSgoeCkgJiBPUFRfVkFMVUUpCi0KLS8qIFZhbHVlcyBmb3IgcHJpb3JpdHkgKi8KLSNkZWZpbmUgT1BSSU9fREVGQVVMVAkwCS8qIGEgZGVmYXVsdCB2YWx1ZSAqLwotI2RlZmluZSBPUFJJT19DRkdGSUxFCTEJLyogdmFsdWUgZnJvbSBhIGNvbmZpZ3VyYXRpb24gZmlsZSAqLwotI2RlZmluZSBPUFJJT19DTURMSU5FCTIJLyogdmFsdWUgZnJvbSB0aGUgY29tbWFuZCBsaW5lICovCi0jZGVmaW5lIE9QUklPX1NFQ0ZJTEUJMwkvKiB2YWx1ZSBmcm9tIG9wdGlvbnMgaW4gYSBzZWNyZXRzIGZpbGUgKi8KLSNkZWZpbmUgT1BSSU9fUk9PVAkxMDAJLyogYWRkZWQgdG8gcHJpb3JpdHkgaWYgT1BUX1BSSVZGSVggJiYgcm9vdCAqLwotCi0jaWZuZGVmIEdJRFNFVF9UWVBFCi0jZGVmaW5lIEdJRFNFVF9UWVBFCWdpZF90Ci0jZW5kaWYKLQotLyogU3RydWN0dXJlIHJlcHJlc2VudGluZyBhIGxpc3Qgb2YgcGVybWl0dGVkIElQIGFkZHJlc3Nlcy4gKi8KLXN0cnVjdCBwZXJtaXR0ZWRfaXAgewotICAgIGludAkJcGVybWl0OwkJLyogMSA9IHBlcm1pdCwgMCA9IGZvcmJpZCAqLwotICAgIHVfaW50MzJfdAliYXNlOwkJLyogbWF0Y2ggaWYgKGFkZHIgJiBtYXNrKSA9PSBiYXNlICovCi0gICAgdV9pbnQzMl90CW1hc2s7CQkvKiBiYXNlIGFuZCBtYXNrIGFyZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KLX07Ci0KLS8qCi0gKiBVbmZvcnR1bmF0ZWx5LCB0aGUgbGludXgga2VybmVsIGRyaXZlciB1c2VzIGEgZGlmZmVyZW50IHN0cnVjdHVyZQotICogZm9yIHN0YXRpc3RpY3MgZnJvbSB0aGUgcmVzdCBvZiB0aGUgcG9ydHMuCi0gKiBUaGlzIHN0cnVjdHVyZSBzZXJ2ZXMgYXMgYSBjb21tb24gcmVwcmVzZW50YXRpb24gZm9yIHRoZSBiaXRzCi0gKiBwcHBkIG5lZWRzLgotICovCi1zdHJ1Y3QgcHBwZF9zdGF0cyB7Ci0gICAgdW5zaWduZWQgaW50CWJ5dGVzX2luOwotICAgIHVuc2lnbmVkIGludAlieXRlc19vdXQ7Ci0gICAgdW5zaWduZWQgaW50CXBrdHNfaW47Ci0gICAgdW5zaWduZWQgaW50CXBrdHNfb3V0OwotfTsKLQotLyogVXNlZCBmb3Igc3RvcmluZyBhIHNlcXVlbmNlIG9mIHdvcmRzLiAgVXN1YWxseSBtYWxsb2NlZC4gKi8KLXN0cnVjdCB3b3JkbGlzdCB7Ci0gICAgc3RydWN0IHdvcmRsaXN0CSpuZXh0OwotICAgIGNoYXIJCSp3b3JkOwotfTsKLQotLyogQW4gZW5kcG9pbnQgZGlzY3JpbWluYXRvciwgdXNlZCB3aXRoIG11bHRpbGluay4gKi8KLSNkZWZpbmUgTUFYX0VORFBfTEVOCTIwCS8qIG1heGltdW0gbGVuZ3RoIG9mIGRpc2NyaW1pbmF0b3IgdmFsdWUgKi8KLXN0cnVjdCBlcGRpc2MgewotICAgIHVuc2lnbmVkIGNoYXIJY2xhc3M7Ci0gICAgdW5zaWduZWQgY2hhcglsZW5ndGg7Ci0gICAgdW5zaWduZWQgY2hhcgl2YWx1ZVtNQVhfRU5EUF9MRU5dOwotfTsKLQotLyogdmFsdWVzIGZvciBlcGRpc2MuY2xhc3MgKi8KLSNkZWZpbmUgRVBEX05VTEwJMAkvKiBudWxsIGRpc2NyaW1pbmF0b3IsIG5vIGRhdGEgKi8KLSNkZWZpbmUgRVBEX0xPQ0FMCTEKLSNkZWZpbmUgRVBEX0lQCQkyCi0jZGVmaW5lIEVQRF9NQUMJCTMKLSNkZWZpbmUgRVBEX01BR0lDCTQKLSNkZWZpbmUgRVBEX1BIT05FTlVNCTUKLQotdHlwZWRlZiB2b2lkICgqbm90aWZ5X2Z1bmMpIF9fUCgodm9pZCAqLCBpbnQpKTsKLXR5cGVkZWYgdm9pZCAoKnByaW50ZXJfZnVuYykgX19QKCh2b2lkICosIGNoYXIgKiwgLi4uKSk7Ci0KLXN0cnVjdCBub3RpZmllciB7Ci0gICAgc3RydWN0IG5vdGlmaWVyICpuZXh0OwotICAgIG5vdGlmeV9mdW5jCSAgICBmdW5jOwotICAgIHZvaWQJICAgICphcmc7Ci19OwotCi0vKgotICogR2xvYmFsIHZhcmlhYmxlcy4KLSAqLwotCi1leHRlcm4gaW50CWh1bmd1cDsJCS8qIFBoeXNpY2FsIGxheWVyIGhhcyBkaXNjb25uZWN0ZWQgKi8KLWV4dGVybiBpbnQJaWZ1bml0OwkJLyogSW50ZXJmYWNlIHVuaXQgbnVtYmVyICovCi1leHRlcm4gY2hhcglpZm5hbWVbXTsJLyogSW50ZXJmYWNlIG5hbWUgKi8KLWV4dGVybiBjaGFyCWhvc3RuYW1lW107CS8qIE91ciBob3N0bmFtZSAqLwotZXh0ZXJuIHVfY2hhcglvdXRwYWNrZXRfYnVmW107IC8qIEJ1ZmZlciBmb3Igb3V0Z29pbmcgcGFja2V0cyAqLwotZXh0ZXJuIGludAlkZXZmZDsJCS8qIGZkIG9mIHVuZGVybHlpbmcgZGV2aWNlICovCi1leHRlcm4gaW50CWZkX3BwcDsJCS8qIGZkIGZvciB0YWxraW5nIFBQUCAqLwotZXh0ZXJuIGludAlwaGFzZTsJCS8qIEN1cnJlbnQgc3RhdGUgb2YgbGluayAtIHNlZSB2YWx1ZXMgYmVsb3cgKi8KLWV4dGVybiBpbnQJYmF1ZF9yYXRlOwkvKiBDdXJyZW50IGxpbmsgc3BlZWQgaW4gYml0cy9zZWMgKi8KLWV4dGVybiBjaGFyCSpwcm9nbmFtZTsJLyogTmFtZSBvZiB0aGlzIHByb2dyYW0gKi8KLWV4dGVybiBpbnQJcmVkaXJlY3Rfc3RkZXJyOy8qIENvbm5lY3RvcidzIHN0ZGVyciBzaG91bGQgZ28gdG8gZmlsZSAqLwotZXh0ZXJuIGNoYXIJcGVlcl9hdXRobmFtZVtdOy8qIEF1dGhlbnRpY2F0ZWQgbmFtZSBvZiBwZWVyICovCi1leHRlcm4gaW50CWF1dGhfZG9uZVtOVU1fUFBQXTsgLyogTWV0aG9kcyBhY3R1YWxseSB1c2VkIGZvciBhdXRoICovCi1leHRlcm4gaW50CXByaXZpbGVnZWQ7CS8qIFdlIHdlcmUgcnVuIGJ5IHJlYWwtdWlkIHJvb3QgKi8KLWV4dGVybiBpbnQJbmVlZF9ob2xkb2ZmOwkvKiBOZWVkIGhvbGRvZmYgcGVyaW9kIGFmdGVyIGxpbmsgdGVybWluYXRlcyAqLwotZXh0ZXJuIGNoYXIJKipzY3JpcHRfZW52OwkvKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHNjcmlwdHMgKi8KLWV4dGVybiBpbnQJZGV0YWNoZWQ7CS8qIEhhdmUgZGV0YWNoZWQgZnJvbSBjb250cm9sbGluZyB0dHkgKi8KLWV4dGVybiBHSURTRVRfVFlQRSBncm91cHNbTkdST1VQU19NQVhdOwkvKiBncm91cHMgdGhlIHVzZXIgaXMgaW4gKi8KLWV4dGVybiBpbnQJbmdyb3VwczsJLyogSG93IG1hbnkgZ3JvdXBzIHZhbGlkIGluIGdyb3VwcyAqLwotZXh0ZXJuIHN0cnVjdCBwcHBkX3N0YXRzIGxpbmtfc3RhdHM7IC8qIGJ5dGUvcGFja2V0IGNvdW50cyBldGMuIGZvciBsaW5rICovCi1leHRlcm4gaW50CWxpbmtfc3RhdHNfdmFsaWQ7IC8qIHNldCBpZiBsaW5rX3N0YXRzIGlzIHZhbGlkICovCi1leHRlcm4gdW5zaWduZWQJbGlua19jb25uZWN0X3RpbWU7IC8qIHRpbWUgdGhlIGxpbmsgd2FzIHVwIGZvciAqLwotZXh0ZXJuIGludAl1c2luZ19wdHk7CS8qIHVzaW5nIHB0eSBhcyBkZXZpY2UgKG5vdHR5IG9yIHB0eSBvcHQuKSAqLwotZXh0ZXJuIGludAlsb2dfdG9fZmQ7CS8qIGxvZ2dpbmcgdG8gdGhpcyBmZCBhcyB3ZWxsIGFzIHN5c2xvZyAqLwotZXh0ZXJuIGJvb2wJbG9nX2RlZmF1bHQ7CS8qIGxvZ190b19mZCBpcyBkZWZhdWx0IChzdGRvdXQpICovCi1leHRlcm4gY2hhcgkqbm9fcHBwX21zZzsJLyogbWVzc2FnZSB0byBwcmludCBpZiBwcHAgbm90IGluIGtlcm5lbCAqLwotZXh0ZXJuIHZvbGF0aWxlIGludCBzdGF0dXM7CS8qIGV4aXQgc3RhdHVzIGZvciBwcHBkICovCi1leHRlcm4gYm9vbAlkZXZuYW1fZml4ZWQ7CS8qIGNhbiBubyBsb25nZXIgY2hhbmdlIGRldm5hbSAqLwotZXh0ZXJuIGludAl1bnN1Y2Nlc3M7CS8qICMgdW5zdWNjZXNzZnVsIGNvbm5lY3Rpb24gYXR0ZW1wdHMgKi8KLWV4dGVybiBpbnQJZG9fY2FsbGJhY2s7CS8qIHNldCBpZiB3ZSB3YW50IHRvIGRvIGNhbGxiYWNrIG5leHQgKi8KLWV4dGVybiBpbnQJZG9pbmdfY2FsbGJhY2s7CS8qIHNldCBpZiB0aGlzIGlzIGEgY2FsbGJhY2sgKi8KLWV4dGVybiBpbnQJZXJyb3JfY291bnQ7CS8qICMgb2YgdGltZXMgZXJyb3IoKSBoYXMgYmVlbiBjYWxsZWQgKi8KLWV4dGVybiBjaGFyCXBwcF9kZXZuYW1bTUFYUEFUSExFTl07Ci1leHRlcm4gY2hhciAgICAgcmVtb3RlX251bWJlcltNQVhOQU1FTEVOXTsgLyogUmVtb3RlIHRlbGVwaG9uZSBudW1iZXIsIGlmIGF2YWlsLiAqLwotZXh0ZXJuIGludCAgICAgIHBwcF9zZXNzaW9uX251bWJlcjsgLyogU2Vzc2lvbiBudW1iZXIgKGVnIFBQUG9FIHNlc3Npb24pICovCi1leHRlcm4gaW50CWZkX2Rldm51bGw7CS8qIGZkIG9wZW4gdG8gL2Rldi9udWxsICovCi0KLWV4dGVybiBpbnQJbGlzdGVuX3RpbWU7CS8qIHRpbWUgdG8gbGlzdGVuIGZpcnN0IChtcykgKi8KLWV4dGVybiBib29sCWRvaW5nX211bHRpbGluazsKLWV4dGVybiBib29sCW11bHRpbGlua19tYXN0ZXI7Ci1leHRlcm4gYm9vbAlidW5kbGVfZW9mOwotZXh0ZXJuIGJvb2wJYnVuZGxlX3Rlcm1pbmF0aW5nOwotCi1leHRlcm4gc3RydWN0IG5vdGlmaWVyICpwaWRjaGFuZ2U7ICAgLyogZm9yIG5vdGlmaWNhdGlvbnMgb2YgcGlkIGNoYW5naW5nICovCi1leHRlcm4gc3RydWN0IG5vdGlmaWVyICpwaGFzZWNoYW5nZTsgLyogZm9yIG5vdGlmaWNhdGlvbnMgb2YgcGhhc2UgY2hhbmdlcyAqLwotZXh0ZXJuIHN0cnVjdCBub3RpZmllciAqZXhpdG5vdGlmeTsgIC8qIGZvciBub3RpZmljYXRpb24gdGhhdCB3ZSdyZSBleGl0aW5nICovCi1leHRlcm4gc3RydWN0IG5vdGlmaWVyICpzaWdyZWNlaXZlZDsgLyogbm90aWZpY2F0aW9uIG9mIHJlY2VpdmVkIHNpZ25hbCAqLwotZXh0ZXJuIHN0cnVjdCBub3RpZmllciAqaXBfdXBfbm90aWZpZXI7ICAgICAvKiBJUENQIGhhcyBjb21lIHVwICovCi1leHRlcm4gc3RydWN0IG5vdGlmaWVyICppcF9kb3duX25vdGlmaWVyOyAgIC8qIElQQ1AgaGFzIGdvbmUgZG93biAqLwotZXh0ZXJuIHN0cnVjdCBub3RpZmllciAqaXB2Nl91cF9ub3RpZmllcjsgICAvKiBJUFY2Q1AgaGFzIGNvbWUgdXAgKi8KLWV4dGVybiBzdHJ1Y3Qgbm90aWZpZXIgKmlwdjZfZG93bl9ub3RpZmllcjsgLyogSVBWNkNQIGhhcyBnb25lIGRvd24gKi8KLWV4dGVybiBzdHJ1Y3Qgbm90aWZpZXIgKmF1dGhfdXBfbm90aWZpZXI7IC8qIHBlZXIgaGFzIGF1dGhlbnRpY2F0ZWQgKi8KLWV4dGVybiBzdHJ1Y3Qgbm90aWZpZXIgKmxpbmtfZG93bl9ub3RpZmllcjsgLyogbGluayBoYXMgZ29uZSBkb3duICovCi1leHRlcm4gc3RydWN0IG5vdGlmaWVyICpmb3JrX25vdGlmaWVyOwkvKiB3ZSBhcmUgYSBuZXcgY2hpbGQgcHJvY2VzcyAqLwotCi0vKiBWYWx1ZXMgZm9yIGRvX2NhbGxiYWNrIGFuZCBkb2luZ19jYWxsYmFjayAqLwotI2RlZmluZSBDQUxMQkFDS19ESUFMSU4JCTEJLyogd2UgYXJlIGV4cGVjdGluZyB0aGUgY2FsbCBiYWNrICovCi0jZGVmaW5lIENBTExCQUNLX0RJQUxPVVQJMgkvKiB3ZSBhcmUgZGlhbGxpbmcgb3V0IHRvIGNhbGwgYmFjayAqLwotCi0vKgotICogVmFyaWFibGVzIHNldCBieSBjb21tYW5kLWxpbmUgb3B0aW9ucy4KLSAqLwotCi1leHRlcm4gaW50CWRlYnVnOwkJLyogRGVidWcgZmxhZyAqLwotZXh0ZXJuIGludAlrZGVidWdmbGFnOwkvKiBUZWxsIGtlcm5lbCB0byBwcmludCBkZWJ1ZyBtZXNzYWdlcyAqLwotZXh0ZXJuIGludAlkZWZhdWx0X2RldmljZTsJLyogVXNpbmcgL2Rldi90dHkgb3IgZXF1aXZhbGVudCAqLwotZXh0ZXJuIGNoYXIJZGV2bmFtW01BWFBBVEhMRU5dOwkvKiBEZXZpY2UgbmFtZSAqLwotZXh0ZXJuIGludAljcnRzY3RzOwkvKiBVc2UgaGFyZHdhcmUgZmxvdyBjb250cm9sICovCi1leHRlcm4gaW50CXN0b3BfYml0czsJLyogTnVtYmVyIG9mIHNlcmlhbCBwb3J0IHN0b3AgYml0cyAqLwotZXh0ZXJuIGJvb2wJbW9kZW07CQkvKiBVc2UgbW9kZW0gY29udHJvbCBsaW5lcyAqLwotZXh0ZXJuIGludAlpbnNwZWVkOwkvKiBJbnB1dC9PdXRwdXQgc3BlZWQgcmVxdWVzdGVkICovCi1leHRlcm4gdV9pbnQzMl90IG5ldG1hc2s7CS8qIElQIG5ldG1hc2sgdG8gc2V0IG9uIGludGVyZmFjZSAqLwotZXh0ZXJuIGJvb2wJbG9ja2ZsYWc7CS8qIENyZWF0ZSBsb2NrIGZpbGUgdG8gbG9jayB0aGUgc2VyaWFsIGRldiAqLwotZXh0ZXJuIGJvb2wJbm9kZXRhY2g7CS8qIERvbid0IGRldGFjaCBmcm9tIGNvbnRyb2xsaW5nIHR0eSAqLwotZXh0ZXJuIGJvb2wJdXBkZXRhY2g7CS8qIERldGFjaCBmcm9tIGNvbnRyb2xsaW5nIHR0eSB3aGVuIGxpbmsgdXAgKi8KLWV4dGVybiBib29sCW1hc3Rlcl9kZXRhY2g7CS8qIERldGFjaCB3aGVuIG11bHRpbGluayBtYXN0ZXIgd2l0aG91dCBsaW5rICovCi1leHRlcm4gY2hhcgkqaW5pdGlhbGl6ZXI7CS8qIFNjcmlwdCB0byBpbml0aWFsaXplIHBoeXNpY2FsIGxpbmsgKi8KLWV4dGVybiBjaGFyCSpjb25uZWN0X3NjcmlwdDsgLyogU2NyaXB0IHRvIGVzdGFibGlzaCBwaHlzaWNhbCBsaW5rICovCi1leHRlcm4gY2hhcgkqZGlzY29ubmVjdF9zY3JpcHQ7IC8qIFNjcmlwdCB0byBkaXNlc3RhYmxpc2ggcGh5c2ljYWwgbGluayAqLwotZXh0ZXJuIGNoYXIJKndlbGNvbWVyOwkvKiBTY3JpcHQgdG8gd2VsY29tZSBjbGllbnQgYWZ0ZXIgY29ubmVjdGlvbiAqLwotZXh0ZXJuIGNoYXIJKnB0eWNvbW1hbmQ7CS8qIENvbW1hbmQgdG8gcnVuIG9uIG90aGVyIHNpZGUgb2YgcHR5ICovCi1leHRlcm4gaW50CW1heGNvbm5lY3Q7CS8qIE1heGltdW0gY29ubmVjdCB0aW1lIChzZWNvbmRzKSAqLwotZXh0ZXJuIGNoYXIJdXNlcltNQVhOQU1FTEVOXTsvKiBPdXIgbmFtZSBmb3IgYXV0aGVudGljYXRpbmcgb3Vyc2VsdmVzICovCi1leHRlcm4gY2hhcglwYXNzd2RbTUFYU0VDUkVUTEVOXTsJLyogUGFzc3dvcmQgZm9yIFBBUCBvciBDSEFQICovCi1leHRlcm4gYm9vbAlhdXRoX3JlcXVpcmVkOwkvKiBQZWVyIGlzIHJlcXVpcmVkIHRvIGF1dGhlbnRpY2F0ZSAqLwotZXh0ZXJuIGJvb2wJcGVyc2lzdDsJLyogUmVvcGVuIGxpbmsgYWZ0ZXIgaXQgZ29lcyBkb3duICovCi1leHRlcm4gYm9vbAl1c2Vsb2dpbjsJLyogVXNlIC9ldGMvcGFzc3dkIGZvciBjaGVja2luZyBQQVAgKi8KLWV4dGVybiBib29sCXNlc3Npb25fbWdtdDsJLyogRG8gc2Vzc2lvbiBtYW5hZ2VtZW50IChsb2dpbiByZWNvcmRzKSAqLwotZXh0ZXJuIGNoYXIJb3VyX25hbWVbTUFYTkFNRUxFTl07LyogT3VyIG5hbWUgZm9yIGF1dGhlbnRpY2F0aW9uIHB1cnBvc2VzICovCi1leHRlcm4gY2hhcglyZW1vdGVfbmFtZVtNQVhOQU1FTEVOXTsgLyogUGVlcidzIG5hbWUgZm9yIGF1dGhlbnRpY2F0aW9uICovCi1leHRlcm4gYm9vbAlleHBsaWNpdF9yZW1vdGU7LyogcmVtb3RlX25hbWUgc3BlY2lmaWVkIHdpdGggcmVtb3RlbmFtZSBvcHQgKi8KLWV4dGVybiBib29sCWRlbWFuZDsJCS8qIERvIGRpYWwtb24tZGVtYW5kICovCi1leHRlcm4gY2hhcgkqaXBwYXJhbTsJLyogRXh0cmEgcGFyYW1ldGVyIGZvciBpcCB1cC9kb3duIHNjcmlwdHMgKi8KLWV4dGVybiBib29sCWNyeXB0cGFwOwkvKiBPdGhlcnMnIFBBUCBwYXNzd29yZHMgYXJlIGVuY3J5cHRlZCAqLwotZXh0ZXJuIGludAlpZGxlX3RpbWVfbGltaXQ7LyogU2h1dCBkb3duIGxpbmsgaWYgaWRsZSBmb3IgdGhpcyBsb25nICovCi1leHRlcm4gaW50CWhvbGRvZmY7CS8qIERlYWQgdGltZSBiZWZvcmUgcmVzdGFydGluZyAqLwotZXh0ZXJuIGJvb2wJaG9sZG9mZl9zcGVjaWZpZWQ7IC8qIHRydWUgaWYgdXNlciBnYXZlIGEgaG9sZG9mZiB2YWx1ZSAqLwotZXh0ZXJuIGJvb2wJbm90dHk7CQkvKiBTdGRpbi9vdXQgaXMgbm90IGEgdHR5ICovCi1leHRlcm4gY2hhcgkqcHR5X3NvY2tldDsJLyogU29ja2V0IHRvIGNvbm5lY3QgdG8gcHR5ICovCi1leHRlcm4gY2hhcgkqcmVjb3JkX2ZpbGU7CS8qIEZpbGUgdG8gcmVjb3JkIGNoYXJzIHNlbnQvcmVjZWl2ZWQgKi8KLWV4dGVybiBib29sCXN5bmNfc2VyaWFsOwkvKiBEZXZpY2UgaXMgc3luY2hyb25vdXMgc2VyaWFsIGRldmljZSAqLwotZXh0ZXJuIGludAltYXhmYWlsOwkvKiBNYXggIyBvZiB1bnN1Y2Nlc3NmdWwgY29ubmVjdGlvbiBhdHRlbXB0cyAqLwotZXh0ZXJuIGNoYXIJbGlua25hbWVbTUFYUEFUSExFTl07IC8qIGxvZ2ljYWwgbmFtZSBmb3IgbGluayAqLwotZXh0ZXJuIGJvb2wJdHVuZV9rZXJuZWw7CS8qIE1heSBhbHRlciBrZXJuZWwgc2V0dGluZ3MgYXMgbmVjZXNzYXJ5ICovCi1leHRlcm4gaW50CWNvbm5lY3RfZGVsYXk7CS8qIFRpbWUgdG8gZGVsYXkgYWZ0ZXIgY29ubmVjdCBzY3JpcHQgKi8KLWV4dGVybiBpbnQJbWF4X2RhdGFfcmF0ZTsJLyogbWF4IGJ5dGVzL3NlYyB0aHJvdWdoIGNoYXJzaHVudCAqLwotZXh0ZXJuIGludAlyZXFfdW5pdDsJLyogaW50ZXJmYWNlIHVuaXQgbnVtYmVyIHRvIHVzZSAqLwotZXh0ZXJuIGJvb2wJbXVsdGlsaW5rOwkvKiBlbmFibGUgbXVsdGlsaW5rIG9wZXJhdGlvbiAqLwotZXh0ZXJuIGJvb2wJbm9lbmRwb2ludDsJLyogZG9uJ3Qgc2VuZCBvciBhY2NlcHQgZW5kcHQuIGRpc2NyaW0uICovCi1leHRlcm4gY2hhcgkqYnVuZGxlX25hbWU7CS8qIGJ1bmRsZSBuYW1lIGZvciBtdWx0aWxpbmsgKi8KLWV4dGVybiBib29sCWR1bXBfb3B0aW9uczsJLyogcHJpbnQgb3V0IG9wdGlvbiB2YWx1ZXMgKi8KLWV4dGVybiBib29sCWRyeXJ1bjsJCS8qIGNoZWNrIGV2ZXJ5dGhpbmcsIHByaW50IG9wdGlvbnMsIGV4aXQgKi8KLWV4dGVybiBpbnQJY2hpbGRfd2FpdDsJLyogIyBzZWNvbmRzIHRvIHdhaXQgZm9yIGNoaWxkcmVuIGF0IGVuZCAqLwotCi0jaWZkZWYgTUFYT0NURVRTCi1leHRlcm4gdW5zaWduZWQgaW50IG1heG9jdGV0czsJICAgICAvKiBNYXhpbXVtIG9jdGV0ZXMgcGVyIHNlc3Npb24gKGluIGJ5dGVzKSAqLwotZXh0ZXJuIGludCAgICAgICBtYXhvY3RldHNfZGlyOyAgICAgIC8qIERpcmVjdGlvbiA6Ci0JCQkJICAgICAgMCAtIGluK291dCAoZGVmYXVsdCkKLQkJCQkgICAgICAxIC0gaW4gCi0JCQkJICAgICAgMiAtIG91dAotCQkJCSAgICAgIDMgLSBtYXgoaW4sb3V0KSAqLwotZXh0ZXJuIGludCAgICAgICBtYXhvY3RldHNfdGltZW91dDsgIC8qIFRpbWVvdXQgZm9yIGNoZWNrIG9mIG9jdGV0cyBsaW1pdCAqLwotI2RlZmluZSBQUFBfT0NURVRTX0RJUkVDVElPTl9TVU0gICAgICAgIDAKLSNkZWZpbmUgUFBQX09DVEVUU19ESVJFQ1RJT05fSU4gICAgICAgICAxCi0jZGVmaW5lIFBQUF9PQ1RFVFNfRElSRUNUSU9OX09VVCAgICAgICAgMgotI2RlZmluZSBQUFBfT0NURVRTX0RJUkVDVElPTl9NQVhPVkVSQUwgIDMKLS8qIHNhbWUgYXMgcHJldmlvcywgYnV0IGxpdHRsZSBkaWZmZXJlbnQgb24gUkFESVVTIHNpZGUgKi8KLSNkZWZpbmUgUFBQX09DVEVUU19ESVJFQ1RJT05fTUFYU0VTU0lPTiA0CQotI2VuZGlmCi0KLSNpZmRlZiBQUFBfRklMVEVSCi1leHRlcm4gc3RydWN0CWJwZl9wcm9ncmFtIHBhc3NfZmlsdGVyOyAgIC8qIEZpbHRlciBmb3IgcGt0cyB0byBwYXNzICovCi1leHRlcm4gc3RydWN0CWJwZl9wcm9ncmFtIGFjdGl2ZV9maWx0ZXI7IC8qIEZpbHRlciBmb3IgbGluay1hY3RpdmUgcGt0cyAqLwotI2VuZGlmCi0KLSNpZmRlZiBNU0xBTk1BTgotZXh0ZXJuIGJvb2wJbXNfbGFubWFuOwkvKiBVc2UgTGFuTWFuIHBhc3N3b3JkIGluc3RlYWQgb2YgTlQgKi8KLQkJCQkvKiBIYXMgbWVhbmluZyBvbmx5IHdpdGggTVMtQ0hBUCBjaGFsbGVuZ2VzICovCi0jZW5kaWYKLQotLyogVmFsdWVzIGZvciBhdXRoX3BlbmRpbmcsIGF1dGhfZG9uZSAqLwotI2RlZmluZSBQQVBfV0lUSFBFRVIJMHgxCi0jZGVmaW5lIFBBUF9QRUVSCTB4MgotI2RlZmluZSBDSEFQX1dJVEhQRUVSCTB4NAotI2RlZmluZSBDSEFQX1BFRVIJMHg4Ci0jZGVmaW5lIEVBUF9XSVRIUEVFUgkweDEwCi0jZGVmaW5lIEVBUF9QRUVSCTB4MjAKLQotLyogVmFsdWVzIGZvciBhdXRoX2RvbmUgb25seSAqLwotI2RlZmluZSBDSEFQX01ENV9XSVRIUEVFUgkweDQwCi0jZGVmaW5lIENIQVBfTUQ1X1BFRVIJCTB4ODAKLSNkZWZpbmUgQ0hBUF9NU19TSElGVAkJOAkvKiBMU0IgcG9zaXRpb24gZm9yIE1TIGF1dGhzICovCi0jZGVmaW5lIENIQVBfTVNfV0lUSFBFRVIJMHgxMDAKLSNkZWZpbmUgQ0hBUF9NU19QRUVSCQkweDIwMAotI2RlZmluZSBDSEFQX01TMl9XSVRIUEVFUgkweDQwMAotI2RlZmluZSBDSEFQX01TMl9QRUVSCQkweDgwMAotCi1leHRlcm4gY2hhciAqY3VycmVudF9vcHRpb247CS8qIHRoZSBuYW1lIG9mIHRoZSBvcHRpb24gYmVpbmcgcGFyc2VkICovCi1leHRlcm4gaW50ICBwcml2aWxlZ2VkX29wdGlvbjsJLyogc2V0IGlmZiB0aGUgY3VycmVudCBvcHRpb24gY2FtZSBmcm9tIHJvb3QgKi8KLWV4dGVybiBjaGFyICpvcHRpb25fc291cmNlOwkvKiBzdHJpbmcgc2F5aW5nIHdoZXJlIHRoZSBvcHRpb24gY2FtZSBmcm9tICovCi1leHRlcm4gaW50ICBvcHRpb25fcHJpb3JpdHk7CS8qIHByaW9yaXR5IG9mIGN1cnJlbnQgb3B0aW9ucyAqLwotCi0vKgotICogVmFsdWVzIGZvciBwaGFzZS4KLSAqLwotI2RlZmluZSBQSEFTRV9ERUFECQkwCi0jZGVmaW5lIFBIQVNFX0lOSVRJQUxJWkUJMQotI2RlZmluZSBQSEFTRV9TRVJJQUxDT05OCTIKLSNkZWZpbmUgUEhBU0VfRE9STUFOVAkJMwotI2RlZmluZSBQSEFTRV9FU1RBQkxJU0gJCTQKLSNkZWZpbmUgUEhBU0VfQVVUSEVOVElDQVRFCTUKLSNkZWZpbmUgUEhBU0VfQ0FMTEJBQ0sJCTYKLSNkZWZpbmUgUEhBU0VfTkVUV09SSwkJNwotI2RlZmluZSBQSEFTRV9SVU5OSU5HCQk4Ci0jZGVmaW5lIFBIQVNFX1RFUk1JTkFURQkJOQotI2RlZmluZSBQSEFTRV9ESVNDT05ORUNUCTEwCi0jZGVmaW5lIFBIQVNFX0hPTERPRkYJCTExCi0jZGVmaW5lIFBIQVNFX01BU1RFUgkJMTIKLQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgc3RydWN0IGdpdmVzIHRoZSBhZGRyZXNzZXMgb2YgcHJvY2VkdXJlcyB0byBjYWxsCi0gKiBmb3IgYSBwYXJ0aWN1bGFyIHByb3RvY29sLgotICovCi1zdHJ1Y3QgcHJvdGVudCB7Ci0gICAgdV9zaG9ydCBwcm90b2NvbDsJCS8qIFBQUCBwcm90b2NvbCBudW1iZXIgKi8KLSAgICAvKiBJbml0aWFsaXphdGlvbiBwcm9jZWR1cmUgKi8KLSAgICB2b2lkICgqaW5pdCkgX19QKChpbnQgdW5pdCkpOwotICAgIC8qIFByb2Nlc3MgYSByZWNlaXZlZCBwYWNrZXQgKi8KLSAgICB2b2lkICgqaW5wdXQpIF9fUCgoaW50IHVuaXQsIHVfY2hhciAqcGt0LCBpbnQgbGVuKSk7Ci0gICAgLyogUHJvY2VzcyBhIHJlY2VpdmVkIHByb3RvY29sLXJlamVjdCAqLwotICAgIHZvaWQgKCpwcm90cmVqKSBfX1AoKGludCB1bml0KSk7Ci0gICAgLyogTG93ZXIgbGF5ZXIgaGFzIGNvbWUgdXAgKi8KLSAgICB2b2lkICgqbG93ZXJ1cCkgX19QKChpbnQgdW5pdCkpOwotICAgIC8qIExvd2VyIGxheWVyIGhhcyBnb25lIGRvd24gKi8KLSAgICB2b2lkICgqbG93ZXJkb3duKSBfX1AoKGludCB1bml0KSk7Ci0gICAgLyogT3BlbiB0aGUgcHJvdG9jb2wgKi8KLSAgICB2b2lkICgqb3BlbikgX19QKChpbnQgdW5pdCkpOwotICAgIC8qIENsb3NlIHRoZSBwcm90b2NvbCAqLwotICAgIHZvaWQgKCpjbG9zZSkgX19QKChpbnQgdW5pdCwgY2hhciAqcmVhc29uKSk7Ci0gICAgLyogUHJpbnQgYSBwYWNrZXQgaW4gcmVhZGFibGUgZm9ybSAqLwotICAgIGludCAgKCpwcmludHBrdCkgX19QKCh1X2NoYXIgKnBrdCwgaW50IGxlbiwgcHJpbnRlcl9mdW5jIHByaW50ZXIsCi0JCQkgIHZvaWQgKmFyZykpOwotICAgIC8qIFByb2Nlc3MgYSByZWNlaXZlZCBkYXRhIHBhY2tldCAqLwotICAgIHZvaWQgKCpkYXRhaW5wdXQpIF9fUCgoaW50IHVuaXQsIHVfY2hhciAqcGt0LCBpbnQgbGVuKSk7Ci0gICAgYm9vbCBlbmFibGVkX2ZsYWc7CQkvKiAwIGlmZiBwcm90b2NvbCBpcyBkaXNhYmxlZCAqLwotICAgIGNoYXIgKm5hbWU7CQkJLyogVGV4dCBuYW1lIG9mIHByb3RvY29sICovCi0gICAgY2hhciAqZGF0YV9uYW1lOwkJLyogVGV4dCBuYW1lIG9mIGNvcnJlc3BvbmRpbmcgZGF0YSBwcm90b2NvbCAqLwotICAgIG9wdGlvbl90ICpvcHRpb25zOwkJLyogTGlzdCBvZiBjb21tYW5kLWxpbmUgb3B0aW9ucyAqLwotICAgIC8qIENoZWNrIHJlcXVlc3RlZCBvcHRpb25zLCBhc3NpZ24gZGVmYXVsdHMgKi8KLSAgICB2b2lkICgqY2hlY2tfb3B0aW9ucykgX19QKCh2b2lkKSk7Ci0gICAgLyogQ29uZmlndXJlIGludGVyZmFjZSBmb3IgZGVtYW5kLWRpYWwgKi8KLSAgICBpbnQgICgqZGVtYW5kX2NvbmYpIF9fUCgoaW50IHVuaXQpKTsKLSAgICAvKiBTYXkgd2hldGhlciB0byBicmluZyB1cCBsaW5rIGZvciB0aGlzIHBrdCAqLwotICAgIGludCAgKCphY3RpdmVfcGt0KSBfX1AoKHVfY2hhciAqcGt0LCBpbnQgbGVuKSk7Ci19OwotCi0vKiBUYWJsZSBvZiBwb2ludGVycyB0byBzdXBwb3J0ZWQgcHJvdG9jb2xzICovCi1leHRlcm4gc3RydWN0IHByb3RlbnQgKnByb3RvY29sc1tdOwotCi0vKgotICogVGhpcyBzdHJ1Y3QgY29udGFpbnMgcG9pbnRlcnMgdG8gYSBzZXQgb2YgcHJvY2VkdXJlcyBmb3IKLSAqIGRvaW5nIG9wZXJhdGlvbnMgb24gYSAiY2hhbm5lbCIuICBBIGNoYW5uZWwgcHJvdmlkZXMgYSB3YXkKLSAqIHRvIHNlbmQgYW5kIHJlY2VpdmUgUFBQIHBhY2tldHMgLSB0aGUgY2Fub25pY2FsIGV4YW1wbGUgaXMKLSAqIGEgc2VyaWFsIHBvcnQgZGV2aWNlIGluIFBQUCBsaW5lIGRpc2NpcGxpbmUgKG9yIGVxdWl2YWxlbnRseQotICogd2l0aCBQUFAgU1RSRUFNUyBtb2R1bGVzIHB1c2hlZCBvbnRvIGl0KS4KLSAqLwotc3RydWN0IGNoYW5uZWwgewotCS8qIHNldCBvZiBvcHRpb25zIGZvciB0aGlzIGNoYW5uZWwgKi8KLQlvcHRpb25fdCAqb3B0aW9uczsKLQkvKiBmaW5kIGFuZCBwcm9jZXNzIGEgcGVyLWNoYW5uZWwgb3B0aW9ucyBmaWxlICovCi0Jdm9pZCAoKnByb2Nlc3NfZXh0cmFfb3B0aW9ucykgX19QKCh2b2lkKSk7Ci0JLyogY2hlY2sgYWxsIHRoZSBvcHRpb25zIHRoYXQgaGF2ZSBiZWVuIGdpdmVuICovCi0Jdm9pZCAoKmNoZWNrX29wdGlvbnMpIF9fUCgodm9pZCkpOwotCS8qIGdldCB0aGUgY2hhbm5lbCByZWFkeSB0byBkbyBQUFAsIHJldHVybiBhIGZpbGUgZGVzY3JpcHRvciAqLwotCWludCAgKCpjb25uZWN0KSBfX1AoKHZvaWQpKTsKLQkvKiB3ZSdyZSBmaW5pc2hlZCB3aXRoIHRoZSBjaGFubmVsICovCi0Jdm9pZCAoKmRpc2Nvbm5lY3QpIF9fUCgodm9pZCkpOwotCS8qIHB1dCB0aGUgY2hhbm5lbCBpbnRvIFBQUCBgbW9kZScgKi8KLQlpbnQgICgqZXN0YWJsaXNoX3BwcCkgX19QKChpbnQpKTsKLQkvKiB0YWtlIHRoZSBjaGFubmVsIG91dCBvZiBQUFAgYG1vZGUnLCByZXN0b3JlIGxvb3BiYWNrIGlmIGRlbWFuZCAqLwotCXZvaWQgKCpkaXNlc3RhYmxpc2hfcHBwKSBfX1AoKGludCkpOwotCS8qIHNldCB0aGUgdHJhbnNtaXQtc2lkZSBQUFAgcGFyYW1ldGVycyBvZiB0aGUgY2hhbm5lbCAqLwotCXZvaWQgKCpzZW5kX2NvbmZpZykgX19QKChpbnQsIHVfaW50MzJfdCwgaW50LCBpbnQpKTsKLQkvKiBzZXQgdGhlIHJlY2VpdmUtc2lkZSBQUFAgcGFyYW1ldGVycyBvZiB0aGUgY2hhbm5lbCAqLwotCXZvaWQgKCpyZWN2X2NvbmZpZykgX19QKChpbnQsIHVfaW50MzJfdCwgaW50LCBpbnQpKTsKLQkvKiBjbGVhbnVwIG9uIGVycm9yIG9yIG5vcm1hbCBleGl0ICovCi0Jdm9pZCAoKmNsZWFudXApIF9fUCgodm9pZCkpOwotCS8qIGNsb3NlIHRoZSBkZXZpY2UsIGNhbGxlZCBpbiBjaGlsZHJlbiBhZnRlciBmb3JrICovCi0Jdm9pZCAoKmNsb3NlKSBfX1AoKHZvaWQpKTsKLX07Ci0KLWV4dGVybiBzdHJ1Y3QgY2hhbm5lbCAqdGhlX2NoYW5uZWw7Ci0KLS8qCi0gKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCBhcmUgc2V0IG9yIHVuc2V0Ci0gKiBieSB0aGUgdXNlci4KLSAqLwotc3RydWN0IHVzZXJlbnYgewotCXN0cnVjdCB1c2VyZW52ICp1ZV9uZXh0OwotCWNoYXIgKnVlX3ZhbHVlOwkJLyogdmFsdWUgKHNldCBvbmx5KSAqLwotCWJvb2wgdWVfaXNzZXQ7CQkvKiAxIGZvciBzZXQsIDAgZm9yIHVuc2V0ICovCi0JYm9vbCB1ZV9wcml2OwkJLyogZnJvbSBwcml2aWxlZ2VkIHNvdXJjZSAqLwotCWNvbnN0IGNoYXIgKnVlX3NvdXJjZTsJLyogc291cmNlIG5hbWUgKi8KLQljaGFyIHVlX25hbWVbMV07CS8qIHZhcmlhYmxlIG5hbWUgKi8KLX07Ci0KLWV4dGVybiBzdHJ1Y3QgdXNlcmVudiAqdXNlcmVudl9saXN0OwotCi0vKgotICogUHJvdG90eXBlcy4KLSAqLwotCi0vKiBQcm9jZWR1cmVzIGV4cG9ydGVkIGZyb20gbWFpbi5jLiAqLwotdm9pZCBzZXRfaWZ1bml0IF9fUCgoaW50KSk7CS8qIHNldCBzdHVmZiB0aGF0IGRlcGVuZHMgb24gaWZ1bml0ICovCi12b2lkIGRldGFjaCBfX1AoKHZvaWQpKTsJLyogRGV0YWNoIGZyb20gY29udHJvbGxpbmcgdHR5ICovCi12b2lkIGRpZSBfX1AoKGludCkpOwkJLyogQ2xlYW51cCBhbmQgZXhpdCAqLwotdm9pZCBxdWl0IF9fUCgodm9pZCkpOwkJLyogbGlrZSBkaWUoMSkgKi8KLXZvaWQgbm92bSBfX1AoKGNoYXIgKikpOwkvKiBTYXkgd2UgcmFuIG91dCBvZiBtZW1vcnksIGFuZCBkaWUgKi8KLXZvaWQgdGltZW91dCBfX1AoKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcsIGludCBzLCBpbnQgdXMpKTsKLQkJCQkvKiBDYWxsIGZ1bmMoYXJnKSBhZnRlciBzLnVzIHNlY29uZHMgKi8KLXZvaWQgdW50aW1lb3V0IF9fUCgodm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmFyZykpOwotCQkJCS8qIENhbmNlbCBjYWxsIHRvIGZ1bmMoYXJnKSAqLwotdm9pZCByZWNvcmRfY2hpbGQgX19QKChpbnQsIGNoYXIgKiwgdm9pZCAoKikgKHZvaWQgKiksIHZvaWQgKiwgaW50KSk7Ci1waWRfdCBzYWZlX2ZvcmsgX19QKChpbnQsIGludCwgaW50KSk7CS8qIEZvcmsgJiBjbG9zZSBzdHVmZiBpbiBjaGlsZCAqLwotaW50ICBkZXZpY2Vfc2NyaXB0IF9fUCgoY2hhciAqY21kLCBpbnQgaW4sIGludCBvdXQsIGludCBkb250X3dhaXQpKTsKLQkJCQkvKiBSdW4gYGNtZCcgd2l0aCBnaXZlbiBzdGRpbiBhbmQgc3Rkb3V0ICovCi1waWRfdCBydW5fcHJvZ3JhbSBfX1AoKGNoYXIgKnByb2csIGNoYXIgKiphcmdzLCBpbnQgbXVzdF9leGlzdCwKLQkJICAgICAgIHZvaWQgKCpkb25lKSh2b2lkICopLCB2b2lkICphcmcsIGludCB3YWl0KSk7Ci0JCQkJLyogUnVuIHByb2dyYW0gcHJvZyB3aXRoIGFyZ3MgaW4gY2hpbGQgKi8KLXZvaWQgcmVvcGVuX2xvZyBfX1AoKHZvaWQpKTsJLyogKHJlKW9wZW4gdGhlIGNvbm5lY3Rpb24gdG8gc3lzbG9nICovCi12b2lkIHByaW50X2xpbmtfc3RhdHMgX19QKCh2b2lkKSk7IC8qIFByaW50IHN0YXRzLCBpZiBhdmFpbGFibGUgKi8KLXZvaWQgcmVzZXRfbGlua19zdGF0cyBfX1AoKGludCkpOyAvKiBSZXNldCAoaW5pdCkgc3RhdHMgd2hlbiBsaW5rIGdvZXMgdXAgKi8KLXZvaWQgdXBkYXRlX2xpbmtfc3RhdHMgX19QKChpbnQpKTsgLyogR2V0IHN0YXRzIGF0IGxpbmsgdGVybWluYXRpb24gKi8KLXZvaWQgc2NyaXB0X3NldGVudiBfX1AoKGNoYXIgKiwgY2hhciAqLCBpbnQpKTsJLyogc2V0IHNjcmlwdCBlbnYgdmFyICovCi12b2lkIHNjcmlwdF91bnNldGVudiBfX1AoKGNoYXIgKikpOwkJLyogdW5zZXQgc2NyaXB0IGVudiB2YXIgKi8KLXZvaWQgbmV3X3BoYXNlIF9fUCgoaW50KSk7CS8qIHNpZ25hbCBzdGFydCBvZiBuZXcgcGhhc2UgKi8KLXZvaWQgYWRkX25vdGlmaWVyIF9fUCgoc3RydWN0IG5vdGlmaWVyICoqLCBub3RpZnlfZnVuYywgdm9pZCAqKSk7Ci12b2lkIHJlbW92ZV9ub3RpZmllciBfX1AoKHN0cnVjdCBub3RpZmllciAqKiwgbm90aWZ5X2Z1bmMsIHZvaWQgKikpOwotdm9pZCBub3RpZnkgX19QKChzdHJ1Y3Qgbm90aWZpZXIgKiwgaW50KSk7Ci1pbnQgIHBwcF9zZW5kX2NvbmZpZyBfX1AoKGludCwgaW50LCB1X2ludDMyX3QsIGludCwgaW50KSk7Ci1pbnQgIHBwcF9yZWN2X2NvbmZpZyBfX1AoKGludCwgaW50LCB1X2ludDMyX3QsIGludCwgaW50KSk7Ci1jb25zdCBjaGFyICpwcm90b2NvbF9uYW1lIF9fUCgoaW50KSk7Ci12b2lkIHJlbW92ZV9waWRmaWxlcyBfX1AoKHZvaWQpKTsKLXZvaWQgbG9ja19kYiBfX1AoKHZvaWQpKTsKLXZvaWQgdW5sb2NrX2RiIF9fUCgodm9pZCkpOwotCi0vKiBQcm9jZWR1cmVzIGV4cG9ydGVkIGZyb20gdHR5LmMuICovCi12b2lkIHR0eV9pbml0IF9fUCgodm9pZCkpOwotCi0vKiBQcm9jZWR1cmVzIGV4cG9ydGVkIGZyb20gdXRpbHMuYy4gKi8KLXZvaWQgbG9nX3BhY2tldCBfX1AoKHVfY2hhciAqLCBpbnQsIGNoYXIgKiwgaW50KSk7Ci0JCQkJLyogRm9ybWF0IGEgcGFja2V0IGFuZCBsb2cgaXQgd2l0aCBzeXNsb2cgKi8KLXZvaWQgcHJpbnRfc3RyaW5nIF9fUCgoY2hhciAqLCBpbnQsICBwcmludGVyX2Z1bmMsIHZvaWQgKikpOwotCQkJCS8qIEZvcm1hdCBhIHN0cmluZyBmb3Igb3V0cHV0ICovCi1pbnQgc2xwcmludGYgX19QKChjaGFyICosIGludCwgY2hhciAqLCAuLi4pKTsJCS8qIHNwcmludGYrKyAqLwotaW50IHZzbHByaW50ZiBfX1AoKGNoYXIgKiwgaW50LCBjaGFyICosIHZhX2xpc3QpKTsJLyogdnNwcmludGYrKyAqLwotI2lmICFkZWZpbmVkKF9fQU5EUk9JRF9fKQotc2l6ZV90IHN0cmxjcHkgX19QKChjaGFyICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KSk7CS8qIHNhZmUgc3RyY3B5ICovCi1zaXplX3Qgc3RybGNhdCBfX1AoKGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpKTsJLyogc2FmZSBzdHJuY3B5ICovCi0jZW5kaWYKLXZvaWQgZGJnbG9nIF9fUCgoY2hhciAqLCAuLi4pKTsJLyogbG9nIGEgZGVidWcgbWVzc2FnZSAqLwotdm9pZCBpbmZvIF9fUCgoY2hhciAqLCAuLi4pKTsJLyogbG9nIGFuIGluZm9ybWF0aW9uYWwgbWVzc2FnZSAqLwotdm9pZCBub3RpY2UgX19QKChjaGFyICosIC4uLikpOwkvKiBsb2cgYSBub3RpY2UtbGV2ZWwgbWVzc2FnZSAqLwotdm9pZCB3YXJuIF9fUCgoY2hhciAqLCAuLi4pKTsJLyogbG9nIGEgd2FybmluZyBtZXNzYWdlICovCi12b2lkIGVycm9yIF9fUCgoY2hhciAqLCAuLi4pKTsJLyogbG9nIGFuIGVycm9yIG1lc3NhZ2UgKi8KLXZvaWQgZmF0YWwgX19QKChjaGFyICosIC4uLikpOwkvKiBsb2cgYW4gZXJyb3IgbWVzc2FnZSBhbmQgZGllKDEpICovCi12b2lkIGluaXRfcHJfbG9nIF9fUCgoY29uc3QgY2hhciAqLCBpbnQpKTsgLyogaW5pdGlhbGl6ZSBmb3IgdXNpbmcgcHJfbG9nICovCi12b2lkIHByX2xvZyBfX1AoKHZvaWQgKiwgY2hhciAqLCAuLi4pKTsJLyogcHJpbnRlciBmbiwgb3V0cHV0IHRvIHN5c2xvZyAqLwotdm9pZCBlbmRfcHJfbG9nIF9fUCgodm9pZCkpOwkvKiBmaW5pc2ggdXAgYWZ0ZXIgdXNpbmcgcHJfbG9nICovCi12b2lkIGR1bXBfcGFja2V0IF9fUCgoY29uc3QgY2hhciAqLCB1X2NoYXIgKiwgaW50KSk7Ci0JCQkJLyogZHVtcCBwYWNrZXQgdG8gZGVidWcgbG9nIGlmIGludGVyZXN0aW5nICovCi1zc2l6ZV90IGNvbXBsZXRlX3JlYWQgX19QKChpbnQsIHZvaWQgKiwgc2l6ZV90KSk7Ci0JCQkJLyogcmVhZCBhIGNvbXBsZXRlIGJ1ZmZlciAqLwotCi0vKiBQcm9jZWR1cmVzIGV4cG9ydGVkIGZyb20gYXV0aC5jICovCi12b2lkIGxpbmtfcmVxdWlyZWQgX19QKChpbnQpKTsJICAvKiB3ZSBhcmUgc3RhcnRpbmcgdG8gdXNlIHRoZSBsaW5rICovCi12b2lkIHN0YXJ0X2xpbmsgX19QKChpbnQpKTsJICAvKiBicmluZyB0aGUgbGluayB1cCBub3cgKi8KLXZvaWQgbGlua190ZXJtaW5hdGVkIF9fUCgoaW50KSk7ICAvKiB3ZSBhcmUgZmluaXNoZWQgd2l0aCB0aGUgbGluayAqLwotdm9pZCBsaW5rX2Rvd24gX19QKChpbnQpKTsJICAvKiB0aGUgTENQIGxheWVyIGhhcyBsZWZ0IHRoZSBPcGVuZWQgc3RhdGUgKi8KLXZvaWQgdXBwZXJfbGF5ZXJzX2Rvd24gX19QKChpbnQpKTsvKiB0YWtlIGFsbCBOQ1BzIGRvd24gKi8KLXZvaWQgbGlua19lc3RhYmxpc2hlZCBfX1AoKGludCkpOyAvKiB0aGUgbGluayBpcyB1cDsgYXV0aGVudGljYXRlIG5vdyAqLwotdm9pZCBzdGFydF9uZXR3b3JrcyBfX1AoKGludCkpOyAgIC8qIHN0YXJ0IGFsbCB0aGUgbmV0d29yayBjb250cm9sIHByb3RvcyAqLwotdm9pZCBjb250aW51ZV9uZXR3b3JrcyBfX1AoKGludCkpOyAvKiBzdGFydCBuZXR3b3JrIFtpcCwgZXRjXSBjb250cm9sIHByb3RvcyAqLwotdm9pZCBucF91cCBfX1AoKGludCwgaW50KSk7CSAgLyogYSBuZXR3b3JrIHByb3RvY29sIGhhcyBjb21lIHVwICovCi12b2lkIG5wX2Rvd24gX19QKChpbnQsIGludCkpOwkgIC8qIGEgbmV0d29yayBwcm90b2NvbCBoYXMgZ29uZSBkb3duICovCi12b2lkIG5wX2ZpbmlzaGVkIF9fUCgoaW50LCBpbnQpKTsgLyogYSBuZXR3b3JrIHByb3RvY29sIG5vIGxvbmdlciBuZWVkcyBsaW5rICovCi12b2lkIGF1dGhfcGVlcl9mYWlsIF9fUCgoaW50LCBpbnQpKTsKLQkJCQkvKiBwZWVyIGZhaWxlZCB0byBhdXRoZW50aWNhdGUgaXRzZWxmICovCi12b2lkIGF1dGhfcGVlcl9zdWNjZXNzIF9fUCgoaW50LCBpbnQsIGludCwgY2hhciAqLCBpbnQpKTsKLQkJCQkvKiBwZWVyIHN1Y2Nlc3NmdWxseSBhdXRoZW50aWNhdGVkIGl0c2VsZiAqLwotdm9pZCBhdXRoX3dpdGhwZWVyX2ZhaWwgX19QKChpbnQsIGludCkpOwotCQkJCS8qIHdlIGZhaWxlZCB0byBhdXRoZW50aWNhdGUgb3Vyc2VsdmVzICovCi12b2lkIGF1dGhfd2l0aHBlZXJfc3VjY2VzcyBfX1AoKGludCwgaW50LCBpbnQpKTsKLQkJCQkvKiB3ZSBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlZCBvdXJzZWx2ZXMgKi8KLXZvaWQgYXV0aF9jaGVja19vcHRpb25zIF9fUCgodm9pZCkpOwotCQkJCS8qIGNoZWNrIGF1dGhlbnRpY2F0aW9uIG9wdGlvbnMgc3VwcGxpZWQgKi8KLXZvaWQgYXV0aF9yZXNldCBfX1AoKGludCkpOwkvKiBjaGVjayB3aGF0IHNlY3JldHMgd2UgaGF2ZSAqLwotaW50ICBjaGVja19wYXNzd2QgX19QKChpbnQsIGNoYXIgKiwgaW50LCBjaGFyICosIGludCwgY2hhciAqKikpOwotCQkJCS8qIENoZWNrIHBlZXItc3VwcGxpZWQgdXNlcm5hbWUvcGFzc3dvcmQgKi8KLWludCAgZ2V0X3NlY3JldCBfX1AoKGludCwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCkpOwotCQkJCS8qIGdldCAic2VjcmV0IiBmb3IgY2hhcCAqLwotaW50ICBnZXRfc3JwX3NlY3JldCBfX1AoKGludCB1bml0LCBjaGFyICpjbGllbnQsIGNoYXIgKnNlcnZlciwgY2hhciAqc2VjcmV0LAotICAgIGludCBhbV9zZXJ2ZXIpKTsKLWludCAgYXV0aF9pcF9hZGRyIF9fUCgoaW50LCB1X2ludDMyX3QpKTsKLQkJCQkvKiBjaGVjayBpZiBJUCBhZGRyZXNzIGlzIGF1dGhvcml6ZWQgKi8KLWludCAgYXV0aF9udW1iZXIgX19QKCh2b2lkKSk7CS8qIGNoZWNrIGlmIHJlbW90ZSBudW1iZXIgaXMgYXV0aG9yaXplZCAqLwotaW50ICBiYWRfaXBfYWRycyBfX1AoKHVfaW50MzJfdCkpOwotCQkJCS8qIGNoZWNrIGlmIElQIGFkZHJlc3MgaXMgdW5yZWFzb25hYmxlICovCi0KLS8qIFByb2NlZHVyZXMgZXhwb3J0ZWQgZnJvbSBkZW1hbmQuYyAqLwotdm9pZCBkZW1hbmRfY29uZiBfX1AoKHZvaWQpKTsJLyogY29uZmlnIGludGVyZmFjZShzKSBmb3IgZGVtYW5kLWRpYWwgKi8KLXZvaWQgZGVtYW5kX2Jsb2NrIF9fUCgodm9pZCkpOwkvKiBzZXQgYWxsIE5QcyB0byBxdWV1ZSB1cCBwYWNrZXRzICovCi12b2lkIGRlbWFuZF91bmJsb2NrIF9fUCgodm9pZCkpOyAvKiBzZXQgYWxsIE5QcyB0byBwYXNzIHBhY2tldHMgKi8KLXZvaWQgZGVtYW5kX2Rpc2NhcmQgX19QKCh2b2lkKSk7IC8qIHNldCBhbGwgTlBzIHRvIGRpc2NhcmQgcGFja2V0cyAqLwotdm9pZCBkZW1hbmRfcmV4bWl0IF9fUCgoaW50KSk7CS8qIHJldHJhbnNtaXQgc2F2ZWQgZnJhbWVzIGZvciBhbiBOUCAqLwotaW50ICBsb29wX2NoYXJzIF9fUCgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsgLyogcHJvY2VzcyBjaGFycyBmcm9tIGxvb3BiYWNrICovCi1pbnQgIGxvb3BfZnJhbWUgX19QKCh1bnNpZ25lZCBjaGFyICosIGludCkpOyAvKiBzaG91bGQgd2UgYnJpbmcgbGluayB1cD8gKi8KLQotLyogUHJvY2VkdXJlcyBleHBvcnRlZCBmcm9tIG11bHRpbGluay5jICovCi0jaWZkZWYgSEFWRV9NVUxUSUxJTksKLXZvaWQgbXBfY2hlY2tfb3B0aW9ucyBfX1AoKHZvaWQpKTsgLyogQ2hlY2sgbXVsdGlsaW5rLXJlbGF0ZWQgb3B0aW9ucyAqLwotaW50ICBtcF9qb2luX2J1bmRsZSBfX1AoKHZvaWQpKTsgIC8qIGpvaW4gb3VyIGxpbmsgdG8gYW4gYXBwcm9wcmlhdGUgYnVuZGxlICovCi12b2lkIG1wX2V4aXRfYnVuZGxlIF9fUCgodm9pZCkpOyAgLyogaGF2ZSBkaXNjb25uZWN0ZWQgb3VyIGxpbmsgZnJvbSBidW5kbGUgKi8KLXZvaWQgbXBfYnVuZGxlX3Rlcm1pbmF0ZWQgX19QKCh2b2lkKSk7Ci1jaGFyICplcGRpc2NfdG9fc3RyIF9fUCgoc3RydWN0IGVwZGlzYyAqKSk7IC8qIHN0cmluZyBmcm9tIGVuZHBvaW50IGRpc2NyaW0uICovCi1pbnQgIHN0cl90b19lcGRpc2MgX19QKChzdHJ1Y3QgZXBkaXNjICosIGNoYXIgKikpOyAvKiBlbmRwdCBkaXNjLiBmcm9tIHN0ciAqLwotI2Vsc2UKLSNkZWZpbmUgbXBfYnVuZGxlX3Rlcm1pbmF0ZWQoKQkvKiBub3RoaW5nICovCi0jZGVmaW5lIG1wX2V4aXRfYnVuZGxlKCkJLyogbm90aGluZyAqLwotI2RlZmluZSBkb2luZ19tdWx0aWxpbmsJCTAKLSNkZWZpbmUgbXVsdGlsaW5rX21hc3RlcgkwCi0jZW5kaWYKLQotLyogUHJvY2VkdXJlcyBleHBvcnRlZCBmcm9tIHN5cy0qLmMgKi8KLXZvaWQgc3lzX2luaXQgX19QKCh2b2lkKSk7CS8qIERvIHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gKi8KLXZvaWQgc3lzX2NsZWFudXAgX19QKCh2b2lkKSk7CS8qIFJlc3RvcmUgc3lzdGVtIHN0YXRlIGJlZm9yZSBleGl0aW5nICovCi1pbnQgIHN5c19jaGVja19vcHRpb25zIF9fUCgodm9pZCkpOyAvKiBDaGVjayBvcHRpb25zIHNwZWNpZmllZCAqLwotdm9pZCBzeXNfY2xvc2UgX19QKCh2b2lkKSk7CS8qIENsZWFuIHVwIGluIGEgY2hpbGQgYmVmb3JlIGV4ZWNpbmcgKi8KLWludCAgcHBwX2F2YWlsYWJsZSBfX1AoKHZvaWQpKTsJLyogVGVzdCB3aGV0aGVyIHBwcCBrZXJuZWwgc3VwcG9ydCBleGlzdHMgKi8KLWludCAgZ2V0X3B0eSBfX1AoKGludCAqLCBpbnQgKiwgY2hhciAqLCBpbnQpKTsJLyogR2V0IHB0eSBtYXN0ZXIvc2xhdmUgKi8KLWludCAgb3Blbl9wcHBfbG9vcGJhY2sgX19QKCh2b2lkKSk7IC8qIE9wZW4gbG9vcGJhY2sgZm9yIGRlbWFuZC1kaWFsbGluZyAqLwotaW50ICB0dHlfZXN0YWJsaXNoX3BwcCBfX1AoKGludCkpOyAgLyogVHVybiBzZXJpYWwgcG9ydCBpbnRvIGEgcHBwIGludGVyZmFjZSAqLwotdm9pZCB0dHlfZGlzZXN0YWJsaXNoX3BwcCBfX1AoKGludCkpOyAvKiBSZXN0b3JlIHBvcnQgdG8gbm9ybWFsIG9wZXJhdGlvbiAqLwotdm9pZCBnZW5lcmljX2Rpc2VzdGFibGlzaF9wcHAgX19QKChpbnQgZGV2X2ZkKSk7IC8qIFJlc3RvcmUgZGV2aWNlIHNldHRpbmcgKi8KLWludCAgZ2VuZXJpY19lc3RhYmxpc2hfcHBwIF9fUCgoaW50IGRldl9mZCkpOyAvKiBNYWtlIGEgcHBwIGludGVyZmFjZSAqLwotdm9pZCBtYWtlX25ld19idW5kbGUgX19QKChpbnQsIGludCwgaW50LCBpbnQpKTsgLyogQ3JlYXRlIG5ldyBidW5kbGUgKi8KLWludCAgYnVuZGxlX2F0dGFjaCBfX1AoKGludCkpOwkvKiBBdHRhY2ggbGluayB0byBleGlzdGluZyBidW5kbGUgKi8KLXZvaWQgY2ZnX2J1bmRsZSBfX1AoKGludCwgaW50LCBpbnQsIGludCkpOyAvKiBDb25maWd1cmUgZXhpc3RpbmcgYnVuZGxlICovCi12b2lkIGRlc3Ryb3lfYnVuZGxlIF9fUCgodm9pZCkpOyAvKiBUZWxsIGRyaXZlciB0byBkZXN0cm95IGJ1bmRsZSAqLwotdm9pZCBjbGVhbl9jaGVjayBfX1AoKHZvaWQpKTsJLyogQ2hlY2sgaWYgbGluZSB3YXMgOC1iaXQgY2xlYW4gKi8KLXZvaWQgc2V0X3VwX3R0eSBfX1AoKGludCwgaW50KSk7IC8qIFNldCB1cCBwb3J0J3Mgc3BlZWQsIHBhcmFtZXRlcnMsIGV0Yy4gKi8KLXZvaWQgcmVzdG9yZV90dHkgX19QKChpbnQpKTsJLyogUmVzdG9yZSBwb3J0J3Mgb3JpZ2luYWwgcGFyYW1ldGVycyAqLwotdm9pZCBzZXRkdHIgX19QKChpbnQsIGludCkpOwkvKiBSYWlzZSBvciBsb3dlciBwb3J0J3MgRFRSIGxpbmUgKi8KLXZvaWQgb3V0cHV0IF9fUCgoaW50LCB1X2NoYXIgKiwgaW50KSk7IC8qIE91dHB1dCBhIFBQUCBwYWNrZXQgKi8KLXZvaWQgd2FpdF9pbnB1dCBfX1AoKHN0cnVjdCB0aW1ldmFsICopKTsKLQkJCQkvKiBXYWl0IGZvciBpbnB1dCwgd2l0aCB0aW1lb3V0ICovCi12b2lkIGFkZF9mZCBfX1AoKGludCkpOwkJLyogQWRkIGZkIHRvIHNldCB0byB3YWl0IGZvciAqLwotdm9pZCByZW1vdmVfZmQgX19QKChpbnQpKTsJLyogUmVtb3ZlIGZkIGZyb20gc2V0IHRvIHdhaXQgZm9yICovCi1pbnQgIHJlYWRfcGFja2V0IF9fUCgodV9jaGFyICopKTsgLyogUmVhZCBQUFAgcGFja2V0ICovCi1pbnQgIGdldF9sb29wX291dHB1dCBfX1AoKHZvaWQpKTsgLyogUmVhZCBwa3RzIGZyb20gbG9vcGJhY2sgKi8KLXZvaWQgdHR5X3NlbmRfY29uZmlnIF9fUCgoaW50LCB1X2ludDMyX3QsIGludCwgaW50KSk7Ci0JCQkJLyogQ29uZmlndXJlIGkvZiB0cmFuc21pdCBwYXJhbWV0ZXJzICovCi12b2lkIHR0eV9zZXRfeGFjY20gX19QKChleHRfYWNjbSkpOwotCQkJCS8qIFNldCBleHRlbmRlZCB0cmFuc21pdCBBQ0NNICovCi12b2lkIHR0eV9yZWN2X2NvbmZpZyBfX1AoKGludCwgdV9pbnQzMl90LCBpbnQsIGludCkpOwotCQkJCS8qIENvbmZpZ3VyZSBpL2YgcmVjZWl2ZSBwYXJhbWV0ZXJzICovCi1pbnQgIGNjcF90ZXN0IF9fUCgoaW50LCB1X2NoYXIgKiwgaW50LCBpbnQpKTsKLQkJCQkvKiBUZXN0IHN1cHBvcnQgZm9yIGNvbXByZXNzaW9uIHNjaGVtZSAqLwotdm9pZCBjY3BfZmxhZ3Nfc2V0IF9fUCgoaW50LCBpbnQsIGludCkpOwotCQkJCS8qIFNldCBrZXJuZWwgQ0NQIHN0YXRlICovCi1pbnQgIGNjcF9mYXRhbF9lcnJvciBfX1AoKGludCkpOyAvKiBUZXN0IGZvciBmYXRhbCBkZWNvbXAgZXJyb3IgaW4ga2VybmVsICovCi1pbnQgIGdldF9pZGxlX3RpbWUgX19QKChpbnQsIHN0cnVjdCBwcHBfaWRsZSAqKSk7Ci0JCQkJLyogRmluZCBvdXQgaG93IGxvbmcgbGluayBoYXMgYmVlbiBpZGxlICovCi1pbnQgIGdldF9wcHBfc3RhdHMgX19QKChpbnQsIHN0cnVjdCBwcHBkX3N0YXRzICopKTsKLQkJCQkvKiBSZXR1cm4gbGluayBzdGF0aXN0aWNzICovCi12b2lkIG5ldGlmX3NldF9tdHUgX19QKChpbnQsIGludCkpOyAvKiBTZXQgUFBQIGludGVyZmFjZSBNVFUgKi8KLWludCAgbmV0aWZfZ2V0X210dSBfX1AoKGludCkpOyAgICAgIC8qIEdldCBQUFAgaW50ZXJmYWNlIE1UVSAqLwotaW50ICBzaWZ2amNvbXAgX19QKChpbnQsIGludCwgaW50LCBpbnQpKTsKLQkJCQkvKiBDb25maWd1cmUgVkogVENQIGhlYWRlciBjb21wcmVzc2lvbiAqLwotaW50ICBzaWZ1cCBfX1AoKGludCkpOwkJLyogQ29uZmlndXJlIGkvZiB1cCBmb3Igb25lIHByb3RvY29sICovCi1pbnQgIHNpZm5wbW9kZSBfX1AoKGludCB1LCBpbnQgcHJvdG8sIGVudW0gTlBtb2RlIG1vZGUpKTsKLQkJCQkvKiBTZXQgbW9kZSBmb3IgaGFuZGxpbmcgcGFja2V0cyBmb3IgcHJvdG8gKi8KLWludCAgc2lmZG93biBfX1AoKGludCkpOwkvKiBDb25maWd1cmUgaS9mIGRvd24gZm9yIG9uZSBwcm90b2NvbCAqLwotaW50ICBzaWZhZGRyIF9fUCgoaW50LCB1X2ludDMyX3QsIHVfaW50MzJfdCwgdV9pbnQzMl90KSk7Ci0JCQkJLyogQ29uZmlndXJlIElQdjQgYWRkcmVzc2VzIGZvciBpL2YgKi8KLWludCAgY2lmYWRkciBfX1AoKGludCwgdV9pbnQzMl90LCB1X2ludDMyX3QpKTsKLQkJCQkvKiBSZXNldCBpL2YgSVAgYWRkcmVzc2VzICovCi0jaWZkZWYgSU5FVDYKLWludCAgZXRoZXJfdG9fZXVpNjQoZXVpNjRfdCAqcF9ldWk2NCk7CS8qIGNvbnZlcnQgZXRoMCBodyBhZGRyZXNzIHRvIEVVSTY0ICovCi1pbnQgIHNpZjZ1cCBfX1AoKGludCkpOwkJLyogQ29uZmlndXJlIGkvZiB1cCBmb3IgSVB2NiAqLwotaW50ICBzaWY2ZG93biBfX1AoKGludCkpOwkvKiBDb25maWd1cmUgaS9mIGRvd24gZm9yIElQdjYgKi8KLWludCAgc2lmNmFkZHIgX19QKChpbnQsIGV1aTY0X3QsIGV1aTY0X3QpKTsKLQkJCQkvKiBDb25maWd1cmUgSVB2NiBhZGRyZXNzZXMgZm9yIGkvZiAqLwotaW50ICBjaWY2YWRkciBfX1AoKGludCwgZXVpNjRfdCwgZXVpNjRfdCkpOwotCQkJCS8qIFJlbW92ZSBhbiBJUHY2IGFkZHJlc3MgZnJvbSBpL2YgKi8KLSNlbmRpZgotaW50ICBzaWZkZWZhdWx0cm91dGUgX19QKChpbnQsIHVfaW50MzJfdCwgdV9pbnQzMl90KSk7Ci0JCQkJLyogQ3JlYXRlIGRlZmF1bHQgcm91dGUgdGhyb3VnaCBpL2YgKi8KLWludCAgY2lmZGVmYXVsdHJvdXRlIF9fUCgoaW50LCB1X2ludDMyX3QsIHVfaW50MzJfdCkpOwotCQkJCS8qIERlbGV0ZSBkZWZhdWx0IHJvdXRlIHRocm91Z2ggaS9mICovCi1pbnQgIHNpZnByb3h5YXJwIF9fUCgoaW50LCB1X2ludDMyX3QpKTsKLQkJCQkvKiBBZGQgcHJveHkgQVJQIGVudHJ5IGZvciBwZWVyICovCi1pbnQgIGNpZnByb3h5YXJwIF9fUCgoaW50LCB1X2ludDMyX3QpKTsKLQkJCQkvKiBEZWxldGUgcHJveHkgQVJQIGVudHJ5IGZvciBwZWVyICovCi11X2ludDMyX3QgR2V0TWFzayBfX1AoKHVfaW50MzJfdCkpOyAvKiBHZXQgYXBwcm9wcmlhdGUgbmV0bWFzayBmb3IgYWRkcmVzcyAqLwotaW50ICBsb2NrIF9fUCgoY2hhciAqKSk7CS8qIENyZWF0ZSBsb2NrIGZpbGUgZm9yIGRldmljZSAqLwotaW50ICByZWxvY2sgX19QKChpbnQpKTsJCS8qIFJld3JpdGUgbG9jayBmaWxlIHdpdGggbmV3IHBpZCAqLwotdm9pZCB1bmxvY2sgX19QKCh2b2lkKSk7CS8qIERlbGV0ZSBwcmV2aW91c2x5LWNyZWF0ZWQgbG9jayBmaWxlICovCi12b2lkIGxvZ3d0bXAgX19QKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci0JCQkJLyogV3JpdGUgZW50cnkgdG8gd3RtcCBmaWxlICovCi1pbnQgIGdldF9ob3N0X3NlZWQgX19QKCh2b2lkKSk7CS8qIEdldCBob3N0LWRlcGVuZGVudCByYW5kb20gbnVtYmVyIHNlZWQgKi8KLWludCAgaGF2ZV9yb3V0ZV90byBfX1AoKHVfaW50MzJfdCkpOyAvKiBDaGVjayBpZiByb3V0ZSB0byBhZGRyIGV4aXN0cyAqLwotI2lmZGVmIFBQUF9GSUxURVIKLWludCAgc2V0X2ZpbHRlcnMgX19QKChzdHJ1Y3QgYnBmX3Byb2dyYW0gKnBhc3MsIHN0cnVjdCBicGZfcHJvZ3JhbSAqYWN0aXZlKSk7Ci0JCQkJLyogU2V0IGZpbHRlciBwcm9ncmFtcyBpbiBrZXJuZWwgKi8KLSNlbmRpZgotI2lmZGVmIElQWF9DSEFOR0UKLWludCAgc2lweGZhZGRyIF9fUCgoaW50LCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBjaGFyICopKTsKLWludCAgY2lweGZhZGRyIF9fUCgoaW50KSk7Ci0jZW5kaWYKLWludCAgZ2V0X2lmX2h3YWRkciBfX1AoKHVfY2hhciAqYWRkciwgY2hhciAqbmFtZSkpOwotY2hhciAqZ2V0X2ZpcnN0X2V0aGVybmV0IF9fUCgodm9pZCkpOwotCi0vKiBQcm9jZWR1cmVzIGV4cG9ydGVkIGZyb20gb3B0aW9ucy5jICovCi1pbnQgc2V0aXBhZGRyIF9fUCgoY2hhciAqLCBjaGFyICoqLCBpbnQpKTsgLyogU2V0IGxvY2FsL3JlbW90ZSBpcCBhZGRyZXNzZXMgKi8KLWludCAgcGFyc2VfYXJncyBfX1AoKGludCBhcmdjLCBjaGFyICoqYXJndikpOwotCQkJCS8qIFBhcnNlIG9wdGlvbnMgZnJvbSBhcmd1bWVudHMgZ2l2ZW4gKi8KLWludCAgb3B0aW9uc19mcm9tX2ZpbGUgX19QKChjaGFyICpmaWxlbmFtZSwgaW50IG11c3RfZXhpc3QsIGludCBjaGVja19wcm90LAotCQkJICAgIGludCBwcml2aWxlZ2VkKSk7Ci0JCQkJLyogUGFyc2Ugb3B0aW9ucyBmcm9tIGFuIG9wdGlvbnMgZmlsZSAqLwotaW50ICBvcHRpb25zX2Zyb21fdXNlciBfX1AoKHZvaWQpKTsgLyogUGFyc2Ugb3B0aW9ucyBmcm9tIHVzZXIncyAucHBwcmMgKi8KLWludCAgb3B0aW9uc19mb3JfdHR5IF9fUCgodm9pZCkpOyAvKiBQYXJzZSBvcHRpb25zIGZyb20gL2V0Yy9wcHAvb3B0aW9ucy50dHkgKi8KLWludCAgb3B0aW9uc19mcm9tX2xpc3QgX19QKChzdHJ1Y3Qgd29yZGxpc3QgKiwgaW50IHByaXZpbGVnZWQpKTsKLQkJCQkvKiBQYXJzZSBvcHRpb25zIGZyb20gYSB3b3JkbGlzdCAqLwotaW50ICBnZXR3b3JkIF9fUCgoRklMRSAqZiwgY2hhciAqd29yZCwgaW50ICpuZXdsaW5lcCwgY2hhciAqZmlsZW5hbWUpKTsKLQkJCQkvKiBSZWFkIGEgd29yZCBmcm9tIGEgZmlsZSAqLwotdm9pZCBvcHRpb25fZXJyb3IgX19QKChjaGFyICpmbXQsIC4uLikpOwotCQkJCS8qIFByaW50IGFuIGVycm9yIG1lc3NhZ2UgYWJvdXQgYW4gb3B0aW9uICovCi1pbnQgaW50X29wdGlvbiBfX1AoKGNoYXIgKiwgaW50ICopKTsKLQkJCQkvKiBTaW1wbGlmaWVkIG51bWJlcl9vcHRpb24gZm9yIGRlY2ltYWwgaW50cyAqLwotdm9pZCBhZGRfb3B0aW9ucyBfX1AoKG9wdGlvbl90ICopKTsgLyogQWRkIGV4dHJhIG9wdGlvbnMgKi8KLXZvaWQgY2hlY2tfb3B0aW9ucyBfX1AoKHZvaWQpKTsJLyogY2hlY2sgdmFsdWVzIGFmdGVyIGFsbCBvcHRpb25zIHBhcnNlZCAqLwotaW50ICBvdmVycmlkZV92YWx1ZSBfX1AoKGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICopKTsKLQkJCQkvKiBvdmVycmlkZSB2YWx1ZSBpZiBwZXJtaXR0ZWQgYnkgcHJpb3JpdHkgKi8KLXZvaWQgcHJpbnRfb3B0aW9ucyBfX1AoKHByaW50ZXJfZnVuYywgdm9pZCAqKSk7Ci0JCQkJLyogcHJpbnQgb3V0IHZhbHVlcyBvZiBhbGwgb3B0aW9ucyAqLwotCi1pbnQgcGFyc2VfZG90dGVkX2lwIF9fUCgoY2hhciAqLCB1X2ludDMyX3QgKikpOwotCi0vKgotICogSG9va3MgdG8gZW5hYmxlIHBsdWdpbnMgdG8gY2hhbmdlIHZhcmlvdXMgdGhpbmdzLgotICovCi1leHRlcm4gaW50ICgqbmV3X3BoYXNlX2hvb2spIF9fUCgoaW50KSk7Ci1leHRlcm4gaW50ICgqaWRsZV90aW1lX2hvb2spIF9fUCgoc3RydWN0IHBwcF9pZGxlICopKTsKLWV4dGVybiBpbnQgKCpob2xkb2ZmX2hvb2spIF9fUCgodm9pZCkpOwotZXh0ZXJuIGludCAoKnBhcF9jaGVja19ob29rKSBfX1AoKHZvaWQpKTsKLWV4dGVybiBpbnQgKCpwYXBfYXV0aF9ob29rKSBfX1AoKGNoYXIgKnVzZXIsIGNoYXIgKnBhc3N3ZCwgY2hhciAqKm1zZ3AsCi0JCQkJIHN0cnVjdCB3b3JkbGlzdCAqKnBhZGRycywKLQkJCQkgc3RydWN0IHdvcmRsaXN0ICoqcG9wdHMpKTsKLWV4dGVybiB2b2lkICgqcGFwX2xvZ291dF9ob29rKSBfX1AoKHZvaWQpKTsKLWV4dGVybiBpbnQgKCpwYXBfcGFzc3dkX2hvb2spIF9fUCgoY2hhciAqdXNlciwgY2hhciAqcGFzc3dkKSk7Ci1leHRlcm4gaW50ICgqYWxsb3dlZF9hZGRyZXNzX2hvb2spIF9fUCgodV9pbnQzMl90IGFkZHIpKTsKLWV4dGVybiB2b2lkICgqaXBfdXBfaG9vaykgX19QKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCAoKmlwX2Rvd25faG9vaykgX19QKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCAoKmlwX2Nob29zZV9ob29rKSBfX1AoKHVfaW50MzJfdCAqKSk7Ci1leHRlcm4gdm9pZCAoKmlwdjZfdXBfaG9vaykgX19QKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCAoKmlwdjZfZG93bl9ob29rKSBfX1AoKHZvaWQpKTsKLQotZXh0ZXJuIGludCAoKmNoYXBfY2hlY2tfaG9vaykgX19QKCh2b2lkKSk7Ci1leHRlcm4gaW50ICgqY2hhcF9wYXNzd2RfaG9vaykgX19QKChjaGFyICp1c2VyLCBjaGFyICpwYXNzd2QpKTsKLWV4dGVybiB2b2lkICgqbXVsdGlsaW5rX2pvaW5faG9vaykgX19QKCh2b2lkKSk7Ci0KLS8qIExldCBhIHBsdWdpbiBzbm9vcCBzZW50IGFuZCByZWNlaXZlZCBwYWNrZXRzLiAgVXNlZnVsIGZvciBMMlRQICovCi1leHRlcm4gdm9pZCAoKnNub29wX3JlY3ZfaG9vaykgX19QKCh1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGVuKSk7Ci1leHRlcm4gdm9pZCAoKnNub29wX3NlbmRfaG9vaykgX19QKCh1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGVuKSk7Ci0KLS8qCi0gKiBJbmxpbmUgdmVyc2lvbnMgb2YgZ2V0L3B1dCBjaGFyL3Nob3J0L2xvbmcuCi0gKiBQb2ludGVyIGlzIGFkdmFuY2VkOyB3ZSBhc3N1bWUgdGhhdCBib3RoIGFyZ3VtZW50cwotICogYXJlIGx2YWx1ZXMgYW5kIHdpbGwgYWxyZWFkeSBiZSBpbiByZWdpc3RlcnMuCi0gKiBjcCBNVVNUIGJlIHVfY2hhciAqLgotICovCi0jZGVmaW5lIEdFVENIQVIoYywgY3ApIHsgXAotCShjKSA9ICooY3ApKys7IFwKLX0KLSNkZWZpbmUgUFVUQ0hBUihjLCBjcCkgeyBcCi0JKihjcCkrKyA9ICh1X2NoYXIpIChjKTsgXAotfQotCi0KLSNkZWZpbmUgR0VUU0hPUlQocywgY3ApIHsgXAotCShzKSA9ICooY3ApKysgPDwgODsgXAotCShzKSB8PSAqKGNwKSsrOyBcCi19Ci0jZGVmaW5lIFBVVFNIT1JUKHMsIGNwKSB7IFwKLQkqKGNwKSsrID0gKHVfY2hhcikgKChzKSA+PiA4KTsgXAotCSooY3ApKysgPSAodV9jaGFyKSAocyk7IFwKLX0KLQotI2RlZmluZSBHRVRMT05HKGwsIGNwKSB7IFwKLQkobCkgPSAqKGNwKSsrIDw8IDg7IFwKLQkobCkgfD0gKihjcCkrKzsgKGwpIDw8PSA4OyBcCi0JKGwpIHw9ICooY3ApKys7IChsKSA8PD0gODsgXAotCShsKSB8PSAqKGNwKSsrOyBcCi19Ci0jZGVmaW5lIFBVVExPTkcobCwgY3ApIHsgXAotCSooY3ApKysgPSAodV9jaGFyKSAoKGwpID4+IDI0KTsgXAotCSooY3ApKysgPSAodV9jaGFyKSAoKGwpID4+IDE2KTsgXAotCSooY3ApKysgPSAodV9jaGFyKSAoKGwpID4+IDgpOyBcCi0JKihjcCkrKyA9ICh1X2NoYXIpIChsKTsgXAotfQotCi0jZGVmaW5lIElOQ1BUUihuLCBjcCkJKChjcCkgKz0gKG4pKQotI2RlZmluZSBERUNQVFIobiwgY3ApCSgoY3ApIC09IChuKSkKLQotLyoKLSAqIFN5c3RlbSBkZXBlbmRlbnQgZGVmaW5pdGlvbnMgZm9yIHVzZXItbGV2ZWwgNC4zQlNEIFVOSVggaW1wbGVtZW50YXRpb24uCi0gKi8KLQotI2RlZmluZSBUSU1FT1VUKHIsIGYsIHQpCXRpbWVvdXQoKHIpLCAoZiksICh0KSwgMCkKLSNkZWZpbmUgVU5USU1FT1VUKHIsIGYpCQl1bnRpbWVvdXQoKHIpLCAoZikpCi0KLSNkZWZpbmUgQkNPUFkocywgZCwgbCkJCW1lbWNweShkLCBzLCBsKQotI2RlZmluZSBCWkVSTyhzLCBuKQkJbWVtc2V0KHMsIDAsIG4pCi0jZGVmaW5lCUJDTVAoczEsIHMyLCBsKQkJbWVtY21wKHMxLCBzMiwgbCkKLQotI2RlZmluZSBQUklOVE1TRyhtLCBsKQkJeyBpbmZvKCJSZW1vdGUgbWVzc2FnZTogJTAuKnYiLCBsLCBtKTsgfQotCi0vKgotICogTUFLRUhFQURFUiAtIEFkZCBIZWFkZXIgZmllbGRzIHRvIGEgcGFja2V0LgotICovCi0jZGVmaW5lIE1BS0VIRUFERVIocCwgdCkgeyBcCi0gICAgUFVUQ0hBUihQUFBfQUxMU1RBVElPTlMsIHApOyBcCi0gICAgUFVUQ0hBUihQUFBfVUksIHApOyBcCi0gICAgUFVUU0hPUlQodCwgcCk7IH0KLQotLyoKLSAqIEV4aXQgc3RhdHVzIHZhbHVlcy4KLSAqLwotI2RlZmluZSBFWElUX09LCQkJMAotI2RlZmluZSBFWElUX0ZBVEFMX0VSUk9SCTEKLSNkZWZpbmUgRVhJVF9PUFRJT05fRVJST1IJMgotI2RlZmluZSBFWElUX05PVF9ST09UCQkzCi0jZGVmaW5lIEVYSVRfTk9fS0VSTkVMX1NVUFBPUlQJNAotI2RlZmluZSBFWElUX1VTRVJfUkVRVUVTVAk1Ci0jZGVmaW5lIEVYSVRfTE9DS19GQUlMRUQJNgotI2RlZmluZSBFWElUX09QRU5fRkFJTEVECTcKLSNkZWZpbmUgRVhJVF9DT05ORUNUX0ZBSUxFRAk4Ci0jZGVmaW5lIEVYSVRfUFRZQ01EX0ZBSUxFRAk5Ci0jZGVmaW5lIEVYSVRfTkVHT1RJQVRJT05fRkFJTEVECTEwCi0jZGVmaW5lIEVYSVRfUEVFUl9BVVRIX0ZBSUxFRAkxMQotI2RlZmluZSBFWElUX0lETEVfVElNRU9VVAkxMgotI2RlZmluZSBFWElUX0NPTk5FQ1RfVElNRQkxMwotI2RlZmluZSBFWElUX0NBTExCQUNLCQkxNAotI2RlZmluZSBFWElUX1BFRVJfREVBRAkJMTUKLSNkZWZpbmUgRVhJVF9IQU5HVVAJCTE2Ci0jZGVmaW5lIEVYSVRfTE9PUEJBQ0sJCTE3Ci0jZGVmaW5lIEVYSVRfSU5JVF9GQUlMRUQJMTgKLSNkZWZpbmUgRVhJVF9BVVRIX1RPUEVFUl9GQUlMRUQJMTkKLSNpZmRlZiBNQVhPQ1RFVFMKLSNkZWZpbmUgRVhJVF9UUkFGRklDX0xJTUlUCTIwCi0jZW5kaWYKLSNkZWZpbmUgRVhJVF9DTklEX0FVVEhfRkFJTEVECTIxCi0KLS8qCi0gKiBEZWJ1ZyBtYWNyb3MuICBTbGlnaHRseSB1c2VmdWwgZm9yIGZpbmRpbmcgYnVncyBpbiBwcHBkLCBub3QgcGFydGljdWxhcmx5Ci0gKiB1c2VmdWwgZm9yIGZpbmRpbmcgb3V0IHdoeSB5b3VyIGNvbm5lY3Rpb24gaXNuJ3QgYmVpbmcgZXN0YWJsaXNoZWQuCi0gKi8KLSNpZmRlZiBERUJVR0FMTAotI2RlZmluZSBERUJVR01BSU4JMQotI2RlZmluZSBERUJVR0ZTTQkxCi0jZGVmaW5lIERFQlVHTENQCTEKLSNkZWZpbmUgREVCVUdJUENQCTEKLSNkZWZpbmUgREVCVUdJUFY2Q1AJMQotI2RlZmluZSBERUJVR1VQQVAJMQotI2RlZmluZSBERUJVR0NIQVAJMQotI2VuZGlmCi0KLSNpZm5kZWYgTE9HX1BQUAkJCS8qIHdlIHVzZSBMT0dfTE9DQUwyIGZvciBzeXNsb2cgYnkgZGVmYXVsdCAqLwotI2lmIGRlZmluZWQoREVCVUdNQUlOKSB8fCBkZWZpbmVkKERFQlVHRlNNKSB8fCBkZWZpbmVkKERFQlVHU1lTKSBcCi0gIHx8IGRlZmluZWQoREVCVUdMQ1ApIHx8IGRlZmluZWQoREVCVUdJUENQKSB8fCBkZWZpbmVkKERFQlVHVVBBUCkgXAotICB8fCBkZWZpbmVkKERFQlVHQ0hBUCkgfHwgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChERUJVR0lQVjZDUCkKLSNkZWZpbmUgTE9HX1BQUCBMT0dfTE9DQUwyCi0jZWxzZQotI2RlZmluZSBMT0dfUFBQIExPR19EQUVNT04KLSNlbmRpZgotI2VuZGlmIC8qIExPR19QUFAgKi8KLQotI2lmZGVmIERFQlVHTUFJTgotI2RlZmluZSBNQUlOREVCVUcoeCkJaWYgKGRlYnVnKSBkYmdsb2cgeAotI2Vsc2UKLSNkZWZpbmUgTUFJTkRFQlVHKHgpCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHU1lTCi0jZGVmaW5lIFNZU0RFQlVHKHgpCWlmIChkZWJ1ZykgZGJnbG9nIHgKLSNlbHNlCi0jZGVmaW5lIFNZU0RFQlVHKHgpCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHRlNNCi0jZGVmaW5lIEZTTURFQlVHKHgpCWlmIChkZWJ1ZykgZGJnbG9nIHgKLSNlbHNlCi0jZGVmaW5lIEZTTURFQlVHKHgpCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHTENQCi0jZGVmaW5lIExDUERFQlVHKHgpCWlmIChkZWJ1ZykgZGJnbG9nIHgKLSNlbHNlCi0jZGVmaW5lIExDUERFQlVHKHgpCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHSVBDUAotI2RlZmluZSBJUENQREVCVUcoeCkJaWYgKGRlYnVnKSBkYmdsb2cgeAotI2Vsc2UKLSNkZWZpbmUgSVBDUERFQlVHKHgpCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHSVBWNkNQCi0jZGVmaW5lIElQVjZDUERFQlVHKHgpICBpZiAoZGVidWcpIGRiZ2xvZyB4Ci0jZWxzZQotI2RlZmluZSBJUFY2Q1BERUJVRyh4KQotI2VuZGlmCi0KLSNpZmRlZiBERUJVR1VQQVAKLSNkZWZpbmUgVVBBUERFQlVHKHgpCWlmIChkZWJ1ZykgZGJnbG9nIHgKLSNlbHNlCi0jZGVmaW5lIFVQQVBERUJVRyh4KQotI2VuZGlmCi0KLSNpZmRlZiBERUJVR0NIQVAKLSNkZWZpbmUgQ0hBUERFQlVHKHgpCWlmIChkZWJ1ZykgZGJnbG9nIHgKLSNlbHNlCi0jZGVmaW5lIENIQVBERUJVRyh4KQotI2VuZGlmCi0KLSNpZmRlZiBERUJVR0lQWENQCi0jZGVmaW5lIElQWENQREVCVUcoeCkJaWYgKGRlYnVnKSBkYmdsb2cgeAotI2Vsc2UKLSNkZWZpbmUgSVBYQ1BERUJVRyh4KQotI2VuZGlmCi0KLSNpZm5kZWYgU0lHVFlQRQotI2lmIGRlZmluZWQoc3VuKSB8fCBkZWZpbmVkKFNZU1YpIHx8IGRlZmluZWQoUE9TSVhfU09VUkNFKQotI2RlZmluZSBTSUdUWVBFIHZvaWQKLSNlbHNlCi0jZGVmaW5lIFNJR1RZUEUgaW50Ci0jZW5kaWYgLyogZGVmaW5lZChzdW4pIHx8IGRlZmluZWQoU1lTVikgfHwgZGVmaW5lZChQT1NJWF9TT1VSQ0UpICovCi0jZW5kaWYgLyogU0lHVFlQRSAqLwotCi0jaWZuZGVmIE1JTgotI2RlZmluZSBNSU4oYSwgYikJKChhKSA8IChiKT8gKGEpOiAoYikpCi0jZW5kaWYKLSNpZm5kZWYgTUFYCi0jZGVmaW5lIE1BWChhLCBiKQkoKGEpID4gKGIpPyAoYSk6IChiKSkKLSNlbmRpZgotCi0jaWZuZGVmIG9mZnNldG9mCi0jZGVmaW5lIG9mZnNldG9mKHR5cGUsIG1lbWJlcikgKChzaXplX3QpICYoKHR5cGUgKikwKS0+bWVtYmVyKQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX1BQUF9IX18gKi8KZGlmZiAtLWdpdCBhL3BwcGQvcHBwb3guYyBiL3BwcGQvcHBwb3guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYwNGZiYS4uMDAwMDAwMAotLS0gYS9wcHBkL3BwcG94LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgInBwcGQuaCIKLQotc3RhdGljIGludCBwcHBveF9zZXQoY2hhciAqKik7Ci1zdGF0aWMgaW50IHBwcG94X2Nvbm5lY3QoKTsKLXN0YXRpYyB2b2lkIHBwcG94X2Rpc2Nvbm5lY3QoKTsKLQotc3RhdGljIG9wdGlvbl90IHBwcG94X29wdGlvbnNbXSA9IHsKLSAgICB7InBwcG94Iiwgb19zcGVjaWFsLCBwcHBveF9zZXQsICJQUFBvWCBzb2NrZXQiLCBPUFRfREVWTkFNfSwKLSAgICB7TlVMTH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNoYW5uZWwgcHBwb3hfY2hhbm5lbCA9IHsKLSAgICAub3B0aW9ucyA9IHBwcG94X29wdGlvbnMsCi0gICAgLnByb2Nlc3NfZXh0cmFfb3B0aW9ucyA9IE5VTEwsCi0gICAgLmNoZWNrX29wdGlvbnMgPSBOVUxMLAotICAgIC5jb25uZWN0ID0gcHBwb3hfY29ubmVjdCwKLSAgICAuZGlzY29ubmVjdCA9IHBwcG94X2Rpc2Nvbm5lY3QsCi0gICAgLmVzdGFibGlzaF9wcHAgPSBnZW5lcmljX2VzdGFibGlzaF9wcHAsCi0gICAgLmRpc2VzdGFibGlzaF9wcHAgPSBnZW5lcmljX2Rpc2VzdGFibGlzaF9wcHAsCi0gICAgLnNlbmRfY29uZmlnID0gTlVMTCwKLSAgICAucmVjdl9jb25maWcgPSBOVUxMLAotICAgIC5jbGVhbnVwID0gTlVMTCwKLSAgICAuY2xvc2UgPSBOVUxMLAotfTsKLQotc3RhdGljIGludCBwcHBveCA9IC0xOwotCi1zdGF0aWMgaW50IHBwcG94X3NldChjaGFyICoqYXJndikgewotICAgIGlmICghaW50X29wdGlvbigqYXJndiwgJnBwcG94KSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW5mbygiVXNpbmcgUFBQb1ggKHNvY2tldCA9ICVkKSIsIHBwcG94KTsKLSAgICB0aGVfY2hhbm5lbCA9ICZwcHBveF9jaGFubmVsOwotICAgIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHBwcG94X2Nvbm5lY3QoKSB7Ci0gICAgcmV0dXJuIHBwcG94OwotfQotCi1zdGF0aWMgdm9pZCBwcHBveF9kaXNjb25uZWN0KCkgewotICAgIGlmIChwcHBveCAhPSAtMSkgewotICAgICAgICBjbG9zZShwcHBveCk7Ci0gICAgICAgIHBwcG94ID0gLTE7Ci0gICAgfQotfQotCi12b2lkIHBwcG94X2luaXQoKSB7Ci0gICAgYWRkX29wdGlvbnMocHBwb3hfb3B0aW9ucyk7Ci19CmRpZmYgLS1naXQgYS9wcHBkL3Nlc3Npb24uYyBiL3BwcGQvc2Vzc2lvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzFlOWIwLi4wMDAwMDAwCi0tLSBhL3BwcGQvc2Vzc2lvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMwICswLDAgQEAKLS8qCi0gKiBzZXNzaW9uLmMgLSBQUFAgc2Vzc2lvbiBjb250cm9sLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNyBEaWVnbyBSaXZlcmEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBUaGUgbmFtZShzKSBvZiB0aGUgYXV0aG9ycyBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogMy4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBQYXVsIE1hY2tlcnJhcwotICogICAgIDxwYXVsdXNAc2FtYmEub3JnPiIuCi0gKgotICogVEhFIEFVVEhPUlMgT0YgVEhJUyBTT0ZUV0FSRSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotICogVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi0gKiBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi0gKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi0gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqCi0gKiBEZXJpdmVkIGZyb20gYXV0aC5jLCB3aGljaCBpczoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODQtMjAwMCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgbmFtZSAiQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciBwZXJtaXNzaW9uIG9yIGFueSBsZWdhbAotICogICAgZGV0YWlscywgcGxlYXNlIGNvbnRhY3QKLSAqICAgICAgT2ZmaWNlIG9mIFRlY2hub2xvZ3kgVHJhbnNmZXIKLSAqICAgICAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAqICAgICAgNTAwMCBGb3JiZXMgQXZlbnVlCi0gKiAgICAgIFBpdHRzYnVyZ2gsIFBBICAxNTIxMy0zODkwCi0gKiAgICAgICg0MTIpIDI2OC00Mzg3LCBmYXg6ICg0MTIpIDI2OC03Mzk1Ci0gKiAgICAgIHRlY2gtdHJhbnNmZXJAYW5kcmV3LmNtdS5lZHUKLSAqCi0gKiA0LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IENvbXB1dGluZyBTZXJ2aWNlcwotICogICAgIGF0IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IChodHRwOi8vd3d3LmNtdS5lZHUvY29tcHV0aW5nLykuIgotICoKLSAqIENBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotICogVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi0gKiBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi0gKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi0gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxwd2QuaD4KLSNpZiAhZGVmaW5lZChfX0FORFJPSURfXykKLSNpbmNsdWRlIDxjcnlwdC5oPgotI2VuZGlmCi0jaWZkZWYgSEFTX1NIQURPVwotI2luY2x1ZGUgPHNoYWRvdy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHV0bXAuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgInBwcGQuaCIKLSNpbmNsdWRlICJzZXNzaW9uLmgiCi0KLSNpZmRlZiBVU0VfUEFNCi0jaW5jbHVkZSA8c2VjdXJpdHkvcGFtX2FwcGwuaD4KLSNlbmRpZiAvKiAjaWZkZWYgVVNFX1BBTSAqLwotCi0jZGVmaW5lIFNFVF9NU0codmFyLCBtc2cpIGlmICh2YXIgIT0gTlVMTCkgeyB2YXJbMF0gPSBtc2c7IH0KLSNkZWZpbmUgQ09QWV9TVFJJTkcocykgKChzKSA/IHN0cmR1cChzKSA6IE5VTEwpCi0KLSNkZWZpbmUgU1VDQ0VTU19NU0cgIlNlc3Npb24gc3RhcnRlZCBzdWNjZXNzZnVsbHkiCi0jZGVmaW5lIEFCT1JUX01TRyAiU2Vzc2lvbiBjYW4ndCBiZSBzdGFydGVkIHdpdGhvdXQgYSB1c2VybmFtZSIKLSNkZWZpbmUgU0VSVklDRV9OQU1FICJwcHAiCi0KLSNkZWZpbmUgU0VTU0lPTl9GQUlMRUQgIDAKLSNkZWZpbmUgU0VTU0lPTl9PSyAgICAgIDEKLQotLyogV2UgaGF2ZSBzdWNjZXNzZnVsbHkgc3RhcnRlZCBhIHNlc3Npb24gKi8KLXN0YXRpYyBib29sIGxvZ2dlZF9pbiA9IDA7Ci0KLSNpZmRlZiBVU0VfUEFNCi0vKgotICogU3RhdGljIHZhcmlhYmxlcyB1c2VkIHRvIGNvbW11bmljYXRlIGJldHdlZW4gdGhlIGNvbnZlcnNhdGlvbiBmdW5jdGlvbgotICogYW5kIHRoZSBzZXJ2ZXJfbG9naW4gZnVuY3Rpb24KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKlBBTV91c2VybmFtZTsKLXN0YXRpYyBjb25zdCBjaGFyICpQQU1fcGFzc3dvcmQ7Ci1zdGF0aWMgaW50ICAgUEFNX3Nlc3Npb24gPSAwOwotc3RhdGljIHBhbV9oYW5kbGVfdCAqcGFtaCA9IE5VTEw7Ci0KLS8qIFBBTSBjb252ZXJzYXRpb24gZnVuY3Rpb24KLSAqIEhlcmUgd2UgYXNzdW1lIChmb3Igbm93LCBhdCBsZWFzdCkgdGhhdCBlY2hvIG9uIG1lYW5zIGxvZ2luIG5hbWUsIGFuZAotICogZWNobyBvZmYgbWVhbnMgcGFzc3dvcmQuCi0gKi8KLQotc3RhdGljIGludCBjb252ZXJzYXRpb24gKGludCBudW1fbXNnLAotI2lmbmRlZiBTT0wyCi0gICAgY29uc3QKLSNlbmRpZgotICAgIHN0cnVjdCBwYW1fbWVzc2FnZSAqKm1zZywKLSAgICBzdHJ1Y3QgcGFtX3Jlc3BvbnNlICoqcmVzcCwgdm9pZCAqYXBwZGF0YV9wdHIpCi17Ci0gICAgaW50IHJlcGxpZXMgPSAwOwotICAgIHN0cnVjdCBwYW1fcmVzcG9uc2UgKnJlcGx5ID0gTlVMTDsKLQotICAgIHJlcGx5ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGFtX3Jlc3BvbnNlKSAqIG51bV9tc2cpOwotICAgIGlmICghcmVwbHkpIHJldHVybiBQQU1fQ09OVl9FUlI7Ci0KLSAgICBmb3IgKHJlcGxpZXMgPSAwOyByZXBsaWVzIDwgbnVtX21zZzsgcmVwbGllcysrKSB7Ci0gICAgICAgIHN3aXRjaCAobXNnW3JlcGxpZXNdLT5tc2dfc3R5bGUpIHsKLSAgICAgICAgICAgIGNhc2UgUEFNX1BST01QVF9FQ0hPX09OOgotICAgICAgICAgICAgICAgIHJlcGx5W3JlcGxpZXNdLnJlc3BfcmV0Y29kZSA9IFBBTV9TVUNDRVNTOwotICAgICAgICAgICAgICAgIHJlcGx5W3JlcGxpZXNdLnJlc3AgPSBDT1BZX1NUUklORyhQQU1fdXNlcm5hbWUpOwotICAgICAgICAgICAgICAgIC8qIFBBTSBmcmVlcyByZXNwICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBBTV9QUk9NUFRfRUNIT19PRkY6Ci0gICAgICAgICAgICAgICAgcmVwbHlbcmVwbGllc10ucmVzcF9yZXRjb2RlID0gUEFNX1NVQ0NFU1M7Ci0gICAgICAgICAgICAgICAgcmVwbHlbcmVwbGllc10ucmVzcCA9IENPUFlfU1RSSU5HKFBBTV9wYXNzd29yZCk7Ci0gICAgICAgICAgICAgICAgLyogUEFNIGZyZWVzIHJlc3AgKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUEFNX1RFWFRfSU5GTzoKLSAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICAgIGNhc2UgUEFNX0VSUk9SX01TRzoKLSAgICAgICAgICAgICAgICAvKiBpZ25vcmUgaXQsIGJ1dCBwYW0gc3RpbGwgd2FudHMgYSBOVUxMIHJlc3BvbnNlLi4uICovCi0gICAgICAgICAgICAgICAgcmVwbHlbcmVwbGllc10ucmVzcF9yZXRjb2RlID0gUEFNX1NVQ0NFU1M7Ci0gICAgICAgICAgICAgICAgcmVwbHlbcmVwbGllc10ucmVzcCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIC8qIE11c3QgYmUgYW4gZXJyb3Igb2Ygc29tZSBzb3J0Li4uICovCi0gICAgICAgICAgICAgICAgZnJlZSAocmVwbHkpOwotICAgICAgICAgICAgICAgIHJldHVybiBQQU1fQ09OVl9FUlI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKnJlc3AgPSByZXBseTsKLSAgICByZXR1cm4gUEFNX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGFtX2NvbnYgcGFtX2NvbnZfZGF0YSA9IHsKLSAgICAmY29udmVyc2F0aW9uLAotICAgIE5VTEwKLX07Ci0jZW5kaWYgLyogI2lmZGVmIFVTRV9QQU0gKi8KLQotaW50Ci1zZXNzaW9uX3N0YXJ0KGZsYWdzLCB1c2VyLCBwYXNzd2QsIHR0eU5hbWUsIG1zZykKLSAgICBjb25zdCBpbnQgZmxhZ3M7Ci0gICAgY29uc3QgY2hhciAqdXNlcjsKLSAgICBjb25zdCBjaGFyICpwYXNzd2Q7Ci0gICAgY29uc3QgY2hhciAqdHR5TmFtZTsKLSAgICBjaGFyICoqbXNnOwotewotI2lmZGVmIFVTRV9QQU0KLSAgICBib29sIG9rID0gMTsKLSAgICBjb25zdCBjaGFyICp1c3I7Ci0gICAgaW50IHBhbV9lcnJvcjsKLSAgICBib29sIHRyeV9zZXNzaW9uID0gMDsKLSNlbHNlIC8qICNpZmRlZiBVU0VfUEFNICovCi0gICAgc3RydWN0IHBhc3N3ZCAqcHc7Ci0gICAgY2hhciAqY2J1ZjsKLSNpZmRlZiBIQVNfU0hBRE9XCi0gICAgc3RydWN0IHNwd2QgKnNwd2Q7Ci0gICAgc3RydWN0IHNwd2QgKmdldHNwbmFtKCk7Ci0gICAgbG9uZyBub3cgPSAwOwotI2VuZGlmIC8qICNpZmRlZiBIQVNfU0hBRE9XICovCi0jZW5kaWYgLyogI2lmZGVmIFVTRV9QQU0gKi8KLQotICAgIFNFVF9NU0cobXNnLCBTVUNDRVNTX01TRyk7Ci0KLSAgICAvKiBJZiBubyB2ZXJpZmljYXRpb24gaXMgcmVxdWVzdGVkLCB0aGVuIHNpbXBseSByZXR1cm4gYW4gT0sgKi8KLSAgICBpZiAoIShTRVNTX0FMTCAmIGZsYWdzKSkgewotICAgICAgICByZXR1cm4gU0VTU0lPTl9PSzsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKQotICAgIHJldHVybiBTRVNTSU9OX0ZBSUxFRDsKLSNlbmRpZgotCi0gICAgaWYgKHVzZXIgPT0gTlVMTCkgewotICAgICAgIFNFVF9NU0cobXNnLCBBQk9SVF9NU0cpOwotICAgICAgIHJldHVybiBTRVNTSU9OX0ZBSUxFRDsKLSAgICB9Ci0KLSNpZmRlZiBVU0VfUEFNCi0gICAgLyogRmluZCB0aGUgJ1xcJyBpbiB0aGUgdXNlcm5hbWUgKi8KLSAgICAvKiBUaGlzIG5lZWRzIHRvIGJlIGZpeGVkIHRvIHN1cHBvcnQgZGlmZmVyZW50IHVzZXJuYW1lIHNjaGVtZXMgKi8KLSAgICBpZiAoKHVzciA9IHN0cmNocih1c2VyLCAnXFwnKSkgPT0gTlVMTCkKLQl1c3IgPSB1c2VyOwotICAgIGVsc2UKLQl1c3IrKzsKLQotICAgIFBBTV9zZXNzaW9uID0gMDsKLSAgICBQQU1fdXNlcm5hbWUgPSB1c3I7Ci0gICAgUEFNX3Bhc3N3b3JkID0gcGFzc3dkOwotCi0gICAgZGJnbG9nKCJJbml0aWFsaXppbmcgUEFNICglZCkgZm9yIHVzZXIgJXMiLCBmbGFncywgdXNyKTsKLSAgICBwYW1fZXJyb3IgPSBwYW1fc3RhcnQgKFNFUlZJQ0VfTkFNRSwgdXNyLCAmcGFtX2NvbnZfZGF0YSwgJnBhbWgpOwotICAgIGRiZ2xvZygiLS0tPiBQQU0gSU5JVCBSZXN1bHQgPSAlZCIsIHBhbV9lcnJvcik7Ci0gICAgb2sgPSAocGFtX2Vycm9yID09IFBBTV9TVUNDRVNTKTsKLQotICAgIGlmIChvaykgewotICAgICAgICBvayA9IChwYW1fc2V0X2l0ZW0ocGFtaCwgUEFNX1RUWSwgdHR5TmFtZSkgPT0gUEFNX1NVQ0NFU1MpICYmCi0JICAgIChwYW1fc2V0X2l0ZW0ocGFtaCwgUEFNX1JIT1NULCBpZm5hbWUpID09IFBBTV9TVUNDRVNTKTsKLSAgICB9Ci0KLSAgICBpZiAob2sgJiYgKFNFU1NfQVVUSCAmIGZsYWdzKSkgewotICAgICAgICBkYmdsb2coIkF0dGVtcHRpbmcgUEFNIGF1dGhlbnRpY2F0aW9uIik7Ci0gICAgICAgIHBhbV9lcnJvciA9IHBhbV9hdXRoZW50aWNhdGUgKHBhbWgsIFBBTV9TSUxFTlQpOwotICAgICAgICBpZiAocGFtX2Vycm9yID09IFBBTV9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAvKiBQQU0gYXV0aCB3YXMgT0sgKi8KLSAgICAgICAgICAgIGRiZ2xvZygiUEFNIEF1dGhlbnRpY2F0aW9uIE9LIGZvciAlcyIsIHVzZXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogTm8gbWF0dGVyIHRoZSByZWFzb24sIHdlIGZhaWwgYmVjYXVzZSB3ZSdyZSBhdXRoZW50aWNhdGluZyAqLwotICAgICAgICAgICAgb2sgPSAwOwotICAgICAgICAgICAgaWYgKHBhbV9lcnJvciA9PSBQQU1fVVNFUl9VTktOT1dOKSB7Ci0gICAgICAgICAgICAgICAgZGJnbG9nKCJVc2VyIHVua25vd24sIGZhaWxpbmcgUEFNIGF1dGhlbnRpY2F0aW9uIik7Ci0gICAgICAgICAgICAgICAgU0VUX01TRyhtc2csICJVc2VyIHVua25vd24gLSBjYW5ub3QgYXV0aGVudGljYXRlIHZpYSBQQU0iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyogQW55IG90aGVyIGVycm9yIG1lYW5zIGF1dGhlbnRpY2F0aW9uIHdhcyBiYWQgKi8KLSAgICAgICAgICAgICAgICBkYmdsb2coIlBBTSBBdXRoZW50aWNhdGlvbiBmYWlsZWQ6ICVkOiAlcyIsIHBhbV9lcnJvciwKLQkJICAgICAgIHBhbV9zdHJlcnJvcihwYW1oLCBwYW1fZXJyb3IpKTsKLSAgICAgICAgICAgICAgICBTRVRfTVNHKG1zZywgKGNoYXIgKikgcGFtX3N0cmVycm9yIChwYW1oLCBwYW1fZXJyb3IpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChvayAmJiAoU0VTU19BQ0NUICYgZmxhZ3MpKSB7Ci0gICAgICAgIGRiZ2xvZygiQXR0ZW1wdGluZyBQQU0gYWNjb3VudCBjaGVja3MiKTsKLSAgICAgICAgcGFtX2Vycm9yID0gcGFtX2FjY3RfbWdtdCAocGFtaCwgUEFNX1NJTEVOVCk7Ci0gICAgICAgIGlmIChwYW1fZXJyb3IgPT0gUEFNX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIC8qCi0JICAgICAqIFBBTSBhY2NvdW50IHdhcyBPSywgc2V0IHRoZSBmbGFnIHdoaWNoIGluZGljYXRlcyB0aGF0IHdlIHNob3VsZAotCSAgICAgKiB0cnkgdG8gcGVyZm9ybSB0aGUgc2Vzc2lvbiBjaGVja3MuCi0JICAgICAqLwotICAgICAgICAgICAgdHJ5X3Nlc3Npb24gPSAxOwotICAgICAgICAgICAgZGJnbG9nKCJQQU0gQWNjb3VudCBPSyBmb3IgJXMiLCB1c2VyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qCi0JICAgICAqIElmIHRoZSBhY2NvdW50IGNoZWNrcyBmYWlsLCB0aGVuIHdlIHNob3VsZCBub3QgdHJ5IHRvIHBlcmZvcm0KLQkgICAgICogdGhlIHNlc3Npb24gY2hlY2ssIGJlY2F1c2UgdGhleSBkb24ndCBtYWtlIHNlbnNlLgotCSAgICAgKi8KLSAgICAgICAgICAgIHRyeV9zZXNzaW9uID0gMDsKLSAgICAgICAgICAgIGlmIChwYW1fZXJyb3IgPT0gUEFNX1VTRVJfVU5LTk9XTikgewotICAgICAgICAgICAgICAgIC8qCi0JCSAqIFdlJ3JlIGNoZWNraW5nIHRoZSBhY2NvdW50LCBzbyBpdCdzIG9rIHRvIG5vdCBoYXZlIG9uZQotCQkgKiBiZWNhdXNlIHRoZSB1c2VyIG1pZ2h0IGNvbWUgZnJvbSB0aGUgc2VjcmV0cyBmaWxlcywgb3Igc29tZQotCQkgKiBvdGhlciBwbHVnaW4uCi0JCSAqLwotICAgICAgICAgICAgICAgIGRiZ2xvZygiVXNlciB1bmtub3duLCBpZ25vcmluZyBQQU0gcmVzdHJpY3Rpb25zIik7Ci0gICAgICAgICAgICAgICAgU0VUX01TRyhtc2csICJVc2VyIHVua25vd24gLSBpZ25vcmluZyBQQU0gcmVzdHJpY3Rpb25zIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8qIEFueSBvdGhlciBlcnJvciBtZWFucyBzZXNzaW9uIGlzIHJlamVjdGVkICovCi0gICAgICAgICAgICAgICAgb2sgPSAwOwotICAgICAgICAgICAgICAgIGRiZ2xvZygiUEFNIEFjY291bnQgY2hlY2tzIGZhaWxlZDogJWQ6ICVzIiwgcGFtX2Vycm9yLAotCQkgICAgICAgcGFtX3N0cmVycm9yKHBhbWgsIHBhbV9lcnJvcikpOwotICAgICAgICAgICAgICAgIFNFVF9NU0cobXNnLCAoY2hhciAqKSBwYW1fc3RyZXJyb3IgKHBhbWgsIHBhbV9lcnJvcikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG9rICYmIHRyeV9zZXNzaW9uICYmIChTRVNTX0FDQ1QgJiBmbGFncykpIHsKLSAgICAgICAgLyogT25seSBvcGVuIGEgc2Vzc2lvbiBpZiB0aGUgdXNlcidzIGFjY291bnQgd2FzIGZvdW5kICovCi0gICAgICAgIHBhbV9lcnJvciA9IHBhbV9vcGVuX3Nlc3Npb24gKHBhbWgsIFBBTV9TSUxFTlQpOwotICAgICAgICBpZiAocGFtX2Vycm9yID09IFBBTV9TVUNDRVNTKSB7Ci0gICAgICAgICAgICBkYmdsb2coIlBBTSBTZXNzaW9uIG9wZW5lZCBmb3IgdXNlciAlcyIsIHVzZXIpOwotICAgICAgICAgICAgUEFNX3Nlc3Npb24gPSAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGJnbG9nKCJQQU0gU2Vzc2lvbiBkZW5pZWQgZm9yIHVzZXIgJXMiLCB1c2VyKTsKLSAgICAgICAgICAgIFNFVF9NU0cobXNnLCAoY2hhciAqKSBwYW1fc3RyZXJyb3IgKHBhbWgsIHBhbV9lcnJvcikpOwotICAgICAgICAgICAgb2sgPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBhcHBhcmVudGx5IHRoZSBQQU0gc3R1ZmYgY2xvc2VzIHRoZSBsb2cgKi8KLSAgICByZW9wZW5fbG9nKCk7Ci0KLSAgICAvKiBJZiBvdXIgUEFNIGNoZWNrcyBoYXZlIGFscmVhZHkgZmFpbGVkLCB0aGVuIHdlIG11c3QgcmV0dXJuIGEgZmFpbHVyZSAqLwotICAgIGlmICghb2spIHJldHVybiBTRVNTSU9OX0ZBSUxFRDsKLQotI2VsaWYgIWRlZmluZWQoX19BTkRST0lEX18pIC8qICNpZmRlZiBVU0VfUEFNICovCi0KLS8qCi0gKiBVc2UgdGhlIG5vbi1QQU0gbWV0aG9kcyBkaXJlY3RseS4gICdwdycgd2lsbCByZW1haW4gTlVMTCBpZiB0aGUgdXNlcgotICogaGFzIG5vdCBiZWVuIGF1dGhlbnRpY2F0ZWQgdXNpbmcgbG9jYWwgVU5JWCBzeXN0ZW0gc2VydmljZXMuCi0gKi8KLQotICAgIHB3ID0gTlVMTDsKLSAgICBpZiAoKFNFU1NfQVVUSCAmIGZsYWdzKSkgewotCXB3ID0gZ2V0cHduYW0odXNlcik7Ci0KLQllbmRwd2VudCgpOwotCS8qCi0JICogSGVyZSwgd2UgYmFpbCBpZiB3ZSBoYXZlIG5vIHVzZXIgYWNjb3VudCwgYmVjYXVzZSB0aGVyZSBpcyBub3RoaW5nCi0JICogdG8gdmVyaWZ5IGFnYWluc3QuCi0JICovCi0JaWYgKHB3ID09IE5VTEwpCi0JICAgIHJldHVybiBTRVNTSU9OX0ZBSUxFRDsKLQotI2lmZGVmIEhBU19TSEFET1cKLQotCXNwd2QgPSBnZXRzcG5hbSh1c2VyKTsKLQllbmRzcGVudCgpOwotCi0JLyoKLQkgKiBJZiB0aGVyZSBpcyBubyBzaGFkb3cgZW50cnkgZm9yIHRoZSB1c2VyLCB0aGVuIHdlIGNhbid0IHZlcmlmeSB0aGUKLQkgKiBhY2NvdW50LgotCSAqLwotCWlmIChzcHdkID09IE5VTEwpCi0JICAgIHJldHVybiBTRVNTSU9OX0ZBSUxFRDsKLQotCS8qCi0JICogV2UgY2hlY2sgdmFsaWRpdHkgYWxsIHRoZSB0aW1lLCBiZWNhdXNlIGlmIHRoZSBwYXNzd29yZCBoYXMgZXhwaXJlZCwKLQkgKiB0aGVuIGNsZWFybHkgd2Ugc2hvdWxkIG5vdCBhdXRoZW50aWNhdGUgYWdhaW5zdCBpdCAoaWYgd2UncmUgYmVpbmcKLQkgKiBjYWxsZWQgZm9yIGF1dGhlbnRpY2F0aW9uIG9ubHkpLiAgVGh1cywgaW4gdGhpcyBwYXJ0aWN1bGFyIGluc3RhbmNlLAotCSAqIHRoZXJlIGlzIG5vIHJlYWwgZGlmZmVyZW5jZSBiZXR3ZWVuIHVzaW5nIHRoZSBBVVRILCBTRVNTIG9yIEFDQ1QKLQkgKiBmbGFncywgb3IgY29tYmluYXRpb25zIHRoZXJlb2YuCi0JICovCi0Jbm93ID0gdGltZShOVUxMKSAvIDg2NDAwTDsKLQlpZiAoKHNwd2QtPnNwX2V4cGlyZSA+IDAgJiYgbm93ID49IHNwd2QtPnNwX2V4cGlyZSkKLQkgICAgfHwgKChzcHdkLT5zcF9tYXggPj0gMCAmJiBzcHdkLT5zcF9tYXggPCAxMDAwMCkKLQkgICAgJiYgc3B3ZC0+c3BfbHN0Y2hnID49IDAKLQkgICAgJiYgbm93ID49IHNwd2QtPnNwX2xzdGNoZyArIHNwd2QtPnNwX21heCkpIHsKLQkgICAgd2FybigiUGFzc3dvcmQgZm9yICVzIGhhcyBleHBpcmVkIiwgdXNlcik7Ci0JICAgIHJldHVybiBTRVNTSU9OX0ZBSUxFRDsKLQl9Ci0KLQkvKiBXZSBoYXZlIGEgdmFsaWQgc2hhZG93IGVudHJ5LCBrZWVwIHRoZSBwYXNzd29yZCAqLwotCXB3LT5wd19wYXNzd2QgPSBzcHdkLT5zcF9wd2RwOwotCi0jZW5kaWYgLyogI2lmZGVmIEhBU19TSEFET1cgKi8KLQotCS8qCi0JICogSWYgbm8gcGFzc3dkLCBkb24ndCBsZXQgdGhlbSBsb2dpbiBpZiB3ZSdyZSBhdXRoZW50aWNhdGluZy4KLQkgKi8KLSAgICAgICAgaWYgKHB3LT5wd19wYXNzd2QgPT0gTlVMTCB8fCBzdHJsZW4ocHctPnB3X3Bhc3N3ZCkgPCAyKQotICAgICAgICAgICAgcmV0dXJuIFNFU1NJT05fRkFJTEVEOwotCWNidWYgPSBjcnlwdChwYXNzd2QsIHB3LT5wd19wYXNzd2QpOwotCWlmICghY2J1ZiB8fCBzdHJjbXAoY2J1ZiwgcHctPnB3X3Bhc3N3ZCkgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiBTRVNTSU9OX0ZBSUxFRDsKLSAgICB9Ci0KLSNlbmRpZiAvKiAjaWZkZWYgVVNFX1BBTSAqLwotCi0gICAgLyoKLSAgICAgKiBXcml0ZSBhIHd0bXAgZW50cnkgZm9yIHRoaXMgdXNlci4KLSAgICAgKi8KLQotICAgIGlmIChTRVNTX0FDQ1QgJiBmbGFncykgewotCWlmIChzdHJuY21wKHR0eU5hbWUsICIvZGV2LyIsIDUpID09IDApCi0JICAgIHR0eU5hbWUgKz0gNTsKLQlsb2d3dG1wKHR0eU5hbWUsIHVzZXIsIGlmbmFtZSk7IC8qIEFkZCB3dG1wIGxvZ2luIGVudHJ5ICovCi0JbG9nZ2VkX2luID0gMTsKLQotI2lmIGRlZmluZWQoX1BBVEhfTEFTVExPRykgJiYgIWRlZmluZWQoVVNFX1BBTSkKLQkvKgotCSAqIEVudGVyIHRoZSB1c2VyIGluIGxhc3Rsb2cgb25seSBpZiBoZSBoYXMgYmVlbiBhdXRoZW50aWNhdGVkIHVzaW5nCi0JICogbG9jYWwgc3lzdGVtIHNlcnZpY2VzLiAgSWYgaGUgaGFzIG5vdCwgdGhlbiB3ZSBkb24ndCBrbm93IHdoYXQgaGlzCi0JICogVUlEIG1pZ2h0IGJlLCBhbmQgbGFzdGxvZyBpcyBpbmRleGVkIGJ5IFVJRC4KLQkgKi8KLQlpZiAocHcgIT0gTlVMTCkgewotICAgICAgICAgICAgc3RydWN0IGxhc3Rsb2cgbGw7Ci0gICAgICAgICAgICBpbnQgZmQ7Ci0JICAgIHRpbWVfdCB0bm93OwotCi0gICAgICAgICAgICBpZiAoKGZkID0gb3BlbihfUEFUSF9MQVNUTE9HLCBPX1JEV1IsIDApKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpbHNlZWsoZmQsIChvZmZfdCkocHctPnB3X3VpZCAqIHNpemVvZihsbCkpLCBTRUVLX1NFVCk7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopJmxsLCAwLCBzaXplb2YobGwpKTsKLQkJKHZvaWQpdGltZSgmdG5vdyk7Ci0gICAgICAgICAgICAgICAgbGwubGxfdGltZSA9IHRub3c7Ci0gICAgICAgICAgICAgICAgKHZvaWQpc3RybmNweShsbC5sbF9saW5lLCB0dHlOYW1lLCBzaXplb2YobGwubGxfbGluZSkpOwotICAgICAgICAgICAgICAgICh2b2lkKXN0cm5jcHkobGwubGxfaG9zdCwgaWZuYW1lLCBzaXplb2YobGwubGxfaG9zdCkpOwotICAgICAgICAgICAgICAgICh2b2lkKXdyaXRlKGZkLCAoY2hhciAqKSZsbCwgc2l6ZW9mKGxsKSk7Ci0gICAgICAgICAgICAgICAgKHZvaWQpY2xvc2UoZmQpOwotICAgICAgICAgICAgfQotCX0KLSNlbmRpZiAvKiBfUEFUSF9MQVNUTE9HIGFuZCBub3QgVVNFX1BBTSAqLwotCWluZm8oInVzZXIgJXMgbG9nZ2VkIGluIG9uIHR0eSAlcyBpbnRmICVzIiwgdXNlciwgdHR5TmFtZSwgaWZuYW1lKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gU0VTU0lPTl9PSzsKLX0KLQotLyoKLSAqIHNlc3Npb25fZW5kIC0gTG9nb3V0IHRoZSB1c2VyLgotICovCi12b2lkCi1zZXNzaW9uX2VuZChjb25zdCBjaGFyKiB0dHlOYW1lKQotewotI2lmZGVmIFVTRV9QQU0KLSAgICBpbnQgcGFtX2Vycm9yID0gUEFNX1NVQ0NFU1M7Ci0KLSAgICBpZiAocGFtaCAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChQQU1fc2Vzc2lvbikgcGFtX2Vycm9yID0gcGFtX2Nsb3NlX3Nlc3Npb24gKHBhbWgsIFBBTV9TSUxFTlQpOwotICAgICAgICBQQU1fc2Vzc2lvbiA9IDA7Ci0gICAgICAgIHBhbV9lbmQgKHBhbWgsIHBhbV9lcnJvcik7Ci0gICAgICAgIHBhbWggPSBOVUxMOwotCS8qIEFwcGFyZW50bHkgdGhlIHBhbSBzdHVmZiBkb2VzIGNsb3NlbG9nKCkuICovCi0JcmVvcGVuX2xvZygpOwotICAgIH0KLSNlbmRpZgotICAgIGlmIChsb2dnZWRfaW4pIHsKLQlpZiAoc3RybmNtcCh0dHlOYW1lLCAiL2Rldi8iLCA1KSA9PSAwKQotCSAgICB0dHlOYW1lICs9IDU7Ci0JbG9nd3RtcCh0dHlOYW1lLCAiIiwgIiIpOyAvKiBXaXBlIG91dCB1dG1wIGxvZ291dCBlbnRyeSAqLwotCWxvZ2dlZF9pbiA9IDA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHBwZC9zZXNzaW9uLmggYi9wcHBkL3Nlc3Npb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVlOGM0MS4uMDAwMDAwMAotLS0gYS9wcHBkL3Nlc3Npb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBzZXNzaW9uLmMgLSBQUFAgc2Vzc2lvbiBjb250cm9sLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNyBEaWVnbyBSaXZlcmEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBUaGUgbmFtZShzKSBvZiB0aGUgYXV0aG9ycyBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogMy4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBQYXVsIE1hY2tlcnJhcwotICogICAgIDxwYXVsdXNAc2FtYmEub3JnPiIuCi0gKgotICogVEhFIEFVVEhPUlMgT0YgVEhJUyBTT0ZUV0FSRSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotICogVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi0gKiBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi0gKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi0gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaWZuZGVmIF9fU0VTU0lPTl9ICi0jZGVmaW5lIF9fU0VTU0lPTl9ICi0KLSNkZWZpbmUgU0VTU19BVVRIICAxCS8qIENoZWNrIFVzZXIgQXV0aGVudGljYXRpb24gKi8KLSNkZWZpbmUgU0VTU19BQ0NUICAyCS8qIENoZWNrIEFjY291bnQgVmFsaWRpdHkgKi8KLQotLyogQ29udmVuaWVuY2UgcGFyYW1ldGVyIHRvIGRvIHRoZSB3aG9sZSBlbmNoaWxhZGEgKi8KLSNkZWZpbmUgU0VTU19BTEwgICAoU0VTU19BVVRIIHwgU0VTU19BQ0NUKQotCi0vKgotICogaW50IHNlc3Npb25fc3RhcnQoLi4uKQotICoKLSAqIFN0YXJ0IGEgc2Vzc2lvbiwgcGVyZm9ybWluZyBhbnkgbmVjZXNzYXJ5IHZhbGlkYXRpb25zLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiAJY29uc3QgaW50IGZsYWdzIDoKLSAqIAkJQW55IGNvbWJpbmF0aW9uIG9mIHRoZSBTRVNTX1hYWCBmbGFncywgdG8gaW5kaWNhdGUgd2hhdCB0aGUgZnVuY3Rpb24KLSAqCQlzaG91bGQgZG8gYXMgcGFydCBvZiBpdHMgY2hlY2tzCi0gKgotICoJY29uc3QgY2hhciogdXNlciA6Ci0gKgkJVGhlIHVzZXJuYW1lIHRvIHZhbGlkYXRlLiAgTWF5IHNhZmVseSBiZSBudWxsLgotICoKLSAqCWNvbnN0IGNoYXIqIHBhc3N3ZCA6Ci0gKgkJVGhlIHBhc3N3b3JkIHRvIHZhbGlkYXRlIHRoZSB1c2VyIHdpdGguIE1heSBzYWZlbHkgYmUgbnVsbC4KLSAqCi0gKgljb25zdCBjaGFyKiB0dHkgOgotICoJCVRoZSBUVFkgdGhlIHVzZXIgaXMgY29ubmVjdGVkIG9uLiBNYXkgc2FmZWx5IGJlIG51bGwuCi0gKgotICoJY2hhcioqIG1zZyA6Ci0gKgkJQSBjaGFyKiB0byByZXR1cm4gYW4gZXJyb3Igb3Igc3VjY2VzcyBtZXNzYWdlLiAgVGhpcyBtZXNzYWdlIHdpbGwgYmUgcmV0dXJuZWQKLSAqCQlyZWdhcmRsZXNzIG9mIHRoZSByZXN1bHQuICBNYXkgc2FmZWx5IGJlIG51bGwuCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogCVplcm8gdmFsdWUgZm9yIGZhaWx1cmUsIG5vbi16ZXJvIHZhbHVlIGZvciBzdWNjZXNzZnVsIHNlc3Npb24gdmVyaWZpY2F0aW9uLgotICovCi1pbnQKLXNlc3Npb25fc3RhcnQoY29uc3QgaW50IGZsYWdzLCBjb25zdCBjaGFyKiB1c2VyLCBjb25zdCBjaGFyKiBwYXNzd2QsIGNvbnN0IGNoYXIqIHR0eSwgY2hhcioqIG1zZyk7Ci0KLS8qIEFkZGVkIHRoZXNlIG1hY3JvcyBmb3IgY29udmVuaWVuY2UuLi4gKi8KLSNkZWZpbmUgc2Vzc2lvbl9hdXRoKHVzZXIsIHBhc3MsIHR0eSwgbXNnKSBcCi0Jc2Vzc2lvbl9zdGFydChTRVNTX0FVVEgsIHVzZXIsIHBhc3MsIHR0eSwgbXNnKQotCi0jZGVmaW5lIHNlc3Npb25fY2hlY2sodXNlciwgcGFzcywgdHR5LCBtc2cpIFwKLQlzZXNzaW9uX3N0YXJ0KFNFU1NfQUNDVCwgdXNlciwgcGFzcywgdHR5LCBtc2cpCi0KLSNkZWZpbmUgc2Vzc2lvbl9mdWxsKHVzZXIsIHBhc3MsIHR0eSwgbXNnKSBcCi0Jc2Vzc2lvbl9zdGFydChTRVNTX0FMTCwgdXNlciwgcGFzcywgdHR5LCBtc2cpCi0KLS8qCi0gKiB2b2lkIHNlc3Npb25fZW5kKC4uLikKLSAqCi0gKiBFbmQgYSBwcmV2aW91c2x5LXN0YXJ0ZWQgc2Vzc2lvbi4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICoJY29uc3QgY2hhciogdHR5IDoKLSAqCQlUaGUgVFRZIHRoZSB1c2VyIGlzIGNvbm5lY3RlZCBvbi4gTWF5IHNhZmVseSBiZSBudWxsLgotICovCi12b2lkCi1zZXNzaW9uX2VuZChjb25zdCBjaGFyKiB0dHkpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3BwcGQvc2hhMS5jIGIvcHBwZC9zaGExLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0Zjk3NWMuLjAwMDAwMDAKLS0tIGEvcHBwZC9zaGExLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoKLSAqIGZ0cDovL2Z0cC5mdW5ldC5maS9wdWIvY3J5cHQvaGFzaC9zaGEvc2hhMS5jCi0gKiAKLSAqIFNIQS0xIGluIEMKLSAqIEJ5IFN0ZXZlIFJlaWQgPHN0ZXZlQGVkbXdlYi5jb20+Ci0gKiAxMDAlIFB1YmxpYyBEb21haW4KLSAqIAotICogVGVzdCBWZWN0b3JzIChmcm9tIEZJUFMgUFVCIDE4MC0xKQotICogImFiYyIKLSAqIEE5OTkzRTM2IDQ3MDY4MTZBIEJBM0UyNTcxIDc4NTBDMjZDIDlDRDBEODlECi0gKiAiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHEiCi0gKiA4NDk4M0U0NCAxQzNCRDI2RSBCQUFFNEFBMSBGOTUxMjlFNSBFNTQ2NzBGMQotICogQSBtaWxsaW9uIHJlcGV0aXRpb25zIG9mICJhIgotICogMzRBQTk3M0MgRDRDNERBQTQgRjYxRUVCMkIgREJBRDI3MzEgNjUzNDAxNkYKLSAqLwotCi0vKiAjZGVmaW5lIFNIQTFIQU5EU09GRiAqIENvcGllcyBkYXRhIGJlZm9yZSBtZXNzaW5nIHdpdGggaXQuICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CS8qIGh0b25sKCkgKi8KLSNpbmNsdWRlIDxuZXQvcHBwX2RlZnMuaD4KLSNpbmNsdWRlICJzaGExLmgiCi0KLXN0YXRpYyB2b2lkCi1TSEExX1RyYW5zZm9ybSh1X2ludDMyX3RbNV0sIGNvbnN0IHVuc2lnbmVkIGNoYXJbNjRdKTsKLQotI2RlZmluZSByb2wodmFsdWUsIGJpdHMpICgoKHZhbHVlKSA8PCAoYml0cykpIHwgKCh2YWx1ZSkgPj4gKDMyIC0gKGJpdHMpKSkpCi0KLS8qIGJsazAoKSBhbmQgYmxrKCkgcGVyZm9ybSB0aGUgaW5pdGlhbCBleHBhbmQuICovCi0vKiBJIGdvdCB0aGUgaWRlYSBvZiBleHBhbmRpbmcgZHVyaW5nIHRoZSByb3VuZCBmdW5jdGlvbiBmcm9tIFNTTGVheSAqLwotI2RlZmluZSBibGswKGkpIChibG9jay0+bFtpXSA9IGh0b25sKGJsb2NrLT5sW2ldKSkKLSNkZWZpbmUgYmxrKGkpIChibG9jay0+bFtpJjE1XSA9IHJvbChibG9jay0+bFsoaSsxMykmMTVdXmJsb2NrLT5sWyhpKzgpJjE1XSBcCi0gICAgXmJsb2NrLT5sWyhpKzIpJjE1XV5ibG9jay0+bFtpJjE1XSwxKSkKLQotLyogKFIwK1IxKSwgUjIsIFIzLCBSNCBhcmUgdGhlIGRpZmZlcmVudCBvcGVyYXRpb25zIHVzZWQgaW4gU0hBMSAqLwotI2RlZmluZSBSMCh2LHcseCx5LHosaSkgeis9KCh3Jih4XnkpKV55KStibGswKGkpKzB4NUE4Mjc5OTkrcm9sKHYsNSk7dz1yb2wodywzMCk7Ci0jZGVmaW5lIFIxKHYsdyx4LHkseixpKSB6Kz0oKHcmKHheeSkpXnkpK2JsayhpKSsweDVBODI3OTk5K3JvbCh2LDUpO3c9cm9sKHcsMzApOwotI2RlZmluZSBSMih2LHcseCx5LHosaSkgeis9KHdeeF55KStibGsoaSkrMHg2RUQ5RUJBMStyb2wodiw1KTt3PXJvbCh3LDMwKTsKLSNkZWZpbmUgUjModix3LHgseSx6LGkpIHorPSgoKHd8eCkmeSl8KHcmeCkpK2JsayhpKSsweDhGMUJCQ0RDK3JvbCh2LDUpO3c9cm9sKHcsMzApOwotI2RlZmluZSBSNCh2LHcseCx5LHosaSkgeis9KHdeeF55KStibGsoaSkrMHhDQTYyQzFENityb2wodiw1KTt3PXJvbCh3LDMwKTsKLQotCi0vKiBIYXNoIGEgc2luZ2xlIDUxMi1iaXQgYmxvY2suIFRoaXMgaXMgdGhlIGNvcmUgb2YgdGhlIGFsZ29yaXRobS4gKi8KLQotc3RhdGljIHZvaWQKLVNIQTFfVHJhbnNmb3JtKHVfaW50MzJfdCBzdGF0ZVs1XSwgY29uc3QgdW5zaWduZWQgY2hhciBidWZmZXJbNjRdKQotewotICAgIHVfaW50MzJfdCBhLCBiLCBjLCBkLCBlOwotICAgIHR5cGVkZWYgdW5pb24gewotCXVuc2lnbmVkIGNoYXIgY1s2NF07Ci0JdV9pbnQzMl90IGxbMTZdOwotICAgIH0gQ0hBUjY0TE9ORzE2OwotICAgIENIQVI2NExPTkcxNiAqYmxvY2s7Ci0KLSNpZmRlZiBTSEExSEFORFNPRkYKLSAgICBzdGF0aWMgdW5zaWduZWQgY2hhciB3b3Jrc3BhY2VbNjRdOwotICAgIGJsb2NrID0gKENIQVI2NExPTkcxNiAqKSB3b3Jrc3BhY2U7Ci0gICAgbWVtY3B5KGJsb2NrLCBidWZmZXIsIDY0KTsKLSNlbHNlCi0gICAgYmxvY2sgPSAoQ0hBUjY0TE9ORzE2ICopIGJ1ZmZlcjsKLSNlbmRpZgotICAgIC8qIENvcHkgY29udGV4dC0+c3RhdGVbXSB0byB3b3JraW5nIHZhcnMgKi8KLSAgICBhID0gc3RhdGVbMF07Ci0gICAgYiA9IHN0YXRlWzFdOwotICAgIGMgPSBzdGF0ZVsyXTsKLSAgICBkID0gc3RhdGVbM107Ci0gICAgZSA9IHN0YXRlWzRdOwotICAgIC8qIDQgcm91bmRzIG9mIDIwIG9wZXJhdGlvbnMgZWFjaC4gTG9vcCB1bnJvbGxlZC4gKi8KLSAgICBSMChhLGIsYyxkLGUsIDApOyBSMChlLGEsYixjLGQsIDEpOyBSMChkLGUsYSxiLGMsIDIpOyBSMChjLGQsZSxhLGIsIDMpOwotICAgIFIwKGIsYyxkLGUsYSwgNCk7IFIwKGEsYixjLGQsZSwgNSk7IFIwKGUsYSxiLGMsZCwgNik7IFIwKGQsZSxhLGIsYywgNyk7Ci0gICAgUjAoYyxkLGUsYSxiLCA4KTsgUjAoYixjLGQsZSxhLCA5KTsgUjAoYSxiLGMsZCxlLDEwKTsgUjAoZSxhLGIsYyxkLDExKTsKLSAgICBSMChkLGUsYSxiLGMsMTIpOyBSMChjLGQsZSxhLGIsMTMpOyBSMChiLGMsZCxlLGEsMTQpOyBSMChhLGIsYyxkLGUsMTUpOwotICAgIFIxKGUsYSxiLGMsZCwxNik7IFIxKGQsZSxhLGIsYywxNyk7IFIxKGMsZCxlLGEsYiwxOCk7IFIxKGIsYyxkLGUsYSwxOSk7Ci0gICAgUjIoYSxiLGMsZCxlLDIwKTsgUjIoZSxhLGIsYyxkLDIxKTsgUjIoZCxlLGEsYixjLDIyKTsgUjIoYyxkLGUsYSxiLDIzKTsKLSAgICBSMihiLGMsZCxlLGEsMjQpOyBSMihhLGIsYyxkLGUsMjUpOyBSMihlLGEsYixjLGQsMjYpOyBSMihkLGUsYSxiLGMsMjcpOwotICAgIFIyKGMsZCxlLGEsYiwyOCk7IFIyKGIsYyxkLGUsYSwyOSk7IFIyKGEsYixjLGQsZSwzMCk7IFIyKGUsYSxiLGMsZCwzMSk7Ci0gICAgUjIoZCxlLGEsYixjLDMyKTsgUjIoYyxkLGUsYSxiLDMzKTsgUjIoYixjLGQsZSxhLDM0KTsgUjIoYSxiLGMsZCxlLDM1KTsKLSAgICBSMihlLGEsYixjLGQsMzYpOyBSMihkLGUsYSxiLGMsMzcpOyBSMihjLGQsZSxhLGIsMzgpOyBSMihiLGMsZCxlLGEsMzkpOwotICAgIFIzKGEsYixjLGQsZSw0MCk7IFIzKGUsYSxiLGMsZCw0MSk7IFIzKGQsZSxhLGIsYyw0Mik7IFIzKGMsZCxlLGEsYiw0Myk7Ci0gICAgUjMoYixjLGQsZSxhLDQ0KTsgUjMoYSxiLGMsZCxlLDQ1KTsgUjMoZSxhLGIsYyxkLDQ2KTsgUjMoZCxlLGEsYixjLDQ3KTsKLSAgICBSMyhjLGQsZSxhLGIsNDgpOyBSMyhiLGMsZCxlLGEsNDkpOyBSMyhhLGIsYyxkLGUsNTApOyBSMyhlLGEsYixjLGQsNTEpOwotICAgIFIzKGQsZSxhLGIsYyw1Mik7IFIzKGMsZCxlLGEsYiw1Myk7IFIzKGIsYyxkLGUsYSw1NCk7IFIzKGEsYixjLGQsZSw1NSk7Ci0gICAgUjMoZSxhLGIsYyxkLDU2KTsgUjMoZCxlLGEsYixjLDU3KTsgUjMoYyxkLGUsYSxiLDU4KTsgUjMoYixjLGQsZSxhLDU5KTsKLSAgICBSNChhLGIsYyxkLGUsNjApOyBSNChlLGEsYixjLGQsNjEpOyBSNChkLGUsYSxiLGMsNjIpOyBSNChjLGQsZSxhLGIsNjMpOwotICAgIFI0KGIsYyxkLGUsYSw2NCk7IFI0KGEsYixjLGQsZSw2NSk7IFI0KGUsYSxiLGMsZCw2Nik7IFI0KGQsZSxhLGIsYyw2Nyk7Ci0gICAgUjQoYyxkLGUsYSxiLDY4KTsgUjQoYixjLGQsZSxhLDY5KTsgUjQoYSxiLGMsZCxlLDcwKTsgUjQoZSxhLGIsYyxkLDcxKTsKLSAgICBSNChkLGUsYSxiLGMsNzIpOyBSNChjLGQsZSxhLGIsNzMpOyBSNChiLGMsZCxlLGEsNzQpOyBSNChhLGIsYyxkLGUsNzUpOwotICAgIFI0KGUsYSxiLGMsZCw3Nik7IFI0KGQsZSxhLGIsYyw3Nyk7IFI0KGMsZCxlLGEsYiw3OCk7IFI0KGIsYyxkLGUsYSw3OSk7Ci0gICAgLyogQWRkIHRoZSB3b3JraW5nIHZhcnMgYmFjayBpbnRvIGNvbnRleHQuc3RhdGVbXSAqLwotICAgIHN0YXRlWzBdICs9IGE7Ci0gICAgc3RhdGVbMV0gKz0gYjsKLSAgICBzdGF0ZVsyXSArPSBjOwotICAgIHN0YXRlWzNdICs9IGQ7Ci0gICAgc3RhdGVbNF0gKz0gZTsKLSAgICAvKiBXaXBlIHZhcmlhYmxlcyAqLwotICAgIGEgPSBiID0gYyA9IGQgPSBlID0gMDsKLX0KLQotCi0vKiBTSEExSW5pdCAtIEluaXRpYWxpemUgbmV3IGNvbnRleHQgKi8KLQotdm9pZAotU0hBMV9Jbml0KFNIQTFfQ1RYICpjb250ZXh0KQotewotICAgIC8qIFNIQTEgaW5pdGlhbGl6YXRpb24gY29uc3RhbnRzICovCi0gICAgY29udGV4dC0+c3RhdGVbMF0gPSAweDY3NDUyMzAxOwotICAgIGNvbnRleHQtPnN0YXRlWzFdID0gMHhFRkNEQUI4OTsKLSAgICBjb250ZXh0LT5zdGF0ZVsyXSA9IDB4OThCQURDRkU7Ci0gICAgY29udGV4dC0+c3RhdGVbM10gPSAweDEwMzI1NDc2OwotICAgIGNvbnRleHQtPnN0YXRlWzRdID0gMHhDM0QyRTFGMDsKLSAgICBjb250ZXh0LT5jb3VudFswXSA9IGNvbnRleHQtPmNvdW50WzFdID0gMDsKLX0KLQotCi0vKiBSdW4geW91ciBkYXRhIHRocm91Z2ggdGhpcy4gKi8KLQotdm9pZAotU0hBMV9VcGRhdGUoU0hBMV9DVFggKmNvbnRleHQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCi17Ci0gICAgdW5zaWduZWQgaW50IGksIGo7Ci0KLSAgICBqID0gKGNvbnRleHQtPmNvdW50WzBdID4+IDMpICYgNjM7Ci0gICAgaWYgKChjb250ZXh0LT5jb3VudFswXSArPSBsZW4gPDwgMykgPCAobGVuIDw8IDMpKSBjb250ZXh0LT5jb3VudFsxXSsrOwotICAgIGNvbnRleHQtPmNvdW50WzFdICs9IChsZW4gPj4gMjkpOwotICAgIGkgPSA2NCAtIGo7Ci0gICAgd2hpbGUgKGxlbiA+PSBpKSB7Ci0JbWVtY3B5KCZjb250ZXh0LT5idWZmZXJbal0sIGRhdGEsIGkpOwotCVNIQTFfVHJhbnNmb3JtKGNvbnRleHQtPnN0YXRlLCBjb250ZXh0LT5idWZmZXIpOwotCWRhdGEgKz0gaTsKLQlsZW4gLT0gaTsKLQlpID0gNjQ7Ci0JaiA9IDA7Ci0gICAgfQotCi0gICAgbWVtY3B5KCZjb250ZXh0LT5idWZmZXJbal0sIGRhdGEsIGxlbik7Ci19Ci0KLQotLyogQWRkIHBhZGRpbmcgYW5kIHJldHVybiB0aGUgbWVzc2FnZSBkaWdlc3QuICovCi0KLXZvaWQKLVNIQTFfRmluYWwodW5zaWduZWQgY2hhciBkaWdlc3RbMjBdLCBTSEExX0NUWCAqY29udGV4dCkKLXsKLSAgICB1X2ludDMyX3QgaSwgajsKLSAgICB1bnNpZ25lZCBjaGFyIGZpbmFsY291bnRbOF07Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0gICAgICAgIGZpbmFsY291bnRbaV0gPSAodW5zaWduZWQgY2hhcikoKGNvbnRleHQtPmNvdW50WyhpID49IDQgPyAwIDogMSldCi0gICAgICAgICA+PiAoKDMtKGkgJiAzKSkgKiA4KSApICYgMjU1KTsgIC8qIEVuZGlhbiBpbmRlcGVuZGVudCAqLwotICAgIH0KLSAgICBTSEExX1VwZGF0ZShjb250ZXh0LCAodW5zaWduZWQgY2hhciAqKSAiXDIwMCIsIDEpOwotICAgIHdoaWxlICgoY29udGV4dC0+Y291bnRbMF0gJiA1MDQpICE9IDQ0OCkgewotCVNIQTFfVXBkYXRlKGNvbnRleHQsICh1bnNpZ25lZCBjaGFyICopICJcMCIsIDEpOwotICAgIH0KLSAgICBTSEExX1VwZGF0ZShjb250ZXh0LCBmaW5hbGNvdW50LCA4KTsgIC8qIFNob3VsZCBjYXVzZSBhIFNIQTFUcmFuc2Zvcm0oKSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSB7Ci0JZGlnZXN0W2ldID0gKHVuc2lnbmVkIGNoYXIpCi0JCSAgICAgKChjb250ZXh0LT5zdGF0ZVtpPj4yXSA+PiAoKDMtKGkgJiAzKSkgKiA4KSApICYgMjU1KTsKLSAgICB9Ci0gICAgLyogV2lwZSB2YXJpYWJsZXMgKi8KLSAgICBpID0gaiA9IDA7Ci0gICAgbWVtc2V0KGNvbnRleHQtPmJ1ZmZlciwgMCwgNjQpOwotICAgIG1lbXNldChjb250ZXh0LT5zdGF0ZSwgMCwgMjApOwotICAgIG1lbXNldChjb250ZXh0LT5jb3VudCwgMCwgOCk7Ci0gICAgbWVtc2V0KCZmaW5hbGNvdW50LCAwLCA4KTsKLSNpZmRlZiBTSEExSEFORFNPRkYgIC8qIG1ha2UgU0hBMVRyYW5zZm9ybSBvdmVyd3JpdGUgaXQncyBvd24gc3RhdGljIHZhcnMgKi8KLSAgICBTSEExVHJhbnNmb3JtKGNvbnRleHQtPnN0YXRlLCBjb250ZXh0LT5idWZmZXIpOwotI2VuZGlmCi19Ci0KZGlmZiAtLWdpdCBhL3BwcGQvc2hhMS5oIGIvcHBwZC9zaGExLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZjY0ZGYuLjAwMDAwMDAKLS0tIGEvcHBwZC9zaGExLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiBzaGExLmggKi8KLQotLyogSWYgT3BlblNTTCBpcyBpbiB1c2UsIHRoZW4gdXNlIHRoYXQgdmVyc2lvbiBvZiBTSEEtMSAqLwotI2lmZGVmIE9QRU5TU0wKLSNpbmNsdWRlIDx0X3NoYS5oPgotI2RlZmluZSBfX1NIQTFfSU5DTFVERV8KLSNlbmRpZgotCi0jaWZuZGVmIF9fU0hBMV9JTkNMVURFXwotCi0jaWZuZGVmIFNIQTFfU0lHTkFUVVJFX1NJWkUKLSNpZmRlZiBTSEFfRElHRVNUU0laRQotI2RlZmluZSBTSEExX1NJR05BVFVSRV9TSVpFIFNIQV9ESUdFU1RTSVpFCi0jZWxzZQotI2RlZmluZSBTSEExX1NJR05BVFVSRV9TSVpFIDIwCi0jZW5kaWYKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdV9pbnQzMl90IHN0YXRlWzVdOwotICAgIHVfaW50MzJfdCBjb3VudFsyXTsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlcls2NF07Ci19IFNIQTFfQ1RYOwotCi1leHRlcm4gdm9pZCBTSEExX0luaXQoU0hBMV9DVFggKik7Ci1leHRlcm4gdm9pZCBTSEExX1VwZGF0ZShTSEExX0NUWCAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCk7Ci1leHRlcm4gdm9pZCBTSEExX0ZpbmFsKHVuc2lnbmVkIGNoYXJbU0hBMV9TSUdOQVRVUkVfU0laRV0sIFNIQTFfQ1RYICopOwotCi0jZGVmaW5lIF9fU0hBMV9JTkNMVURFXwotI2VuZGlmIC8qIF9fU0hBMV9JTkNMVURFXyAqLwotCmRpZmYgLS1naXQgYS9wcHBkL3NycC1lbnRyeS44IGIvcHBwZC9zcnAtZW50cnkuOApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk3MjgxYS4uMDAwMDAwMAotLS0gYS9wcHBkL3NycC1lbnRyeS44CisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLlwiIG1hbnVhbCBwYWdlIFtdIGZvciBzcnAtZW50cnkKLS5cIiAkSWQ6IHNycC1lbnRyeS44LHYgMS4yIDIwMDQvMTEvMTMgMTI6MjI6NDkgcGF1bHVzIEV4cCAkCi0uXCIgU0ggc2VjdGlvbiBoZWFkaW5nCi0uXCIgU1Mgc3Vic2VjdGlvbiBoZWFkaW5nCi0uXCIgTFAgcGFyYWdyYXBoCi0uXCIgSVAgaW5kZW50ZWQgcGFyYWdyYXBoCi0uXCIgVFAgaGFuZ2luZyBsYWJlbAotLlRIIFNSUC1FTlRSWSA4Ci0uU0ggTkFNRQotc3JwXC1lbnRyeSBcLSBHZW5lcmF0ZSBhIFNSUFwtU0hBMSBTZXJ2ZXIgRW50cnkKLS5TSCBTWU5PUFNJUwotLkIgc3JwXC1lbnRyeQotWwotLkkgXC1pIGluZGV4Ci1dIFsKLS5JIGNsaWVudG5hbWUKLV0KLS5TSCBERVNDUklQVElPTgotLkxQCi1UaGlzIHV0aWxpdHkgZ2VuZXJhdGVzIGFuIGVudHJ5IHN1aXRhYmxlIGZvciB1c2UgaW4gdGhlCi0vZXRjL3BwcC9zcnBcLXNlY3JldHMgZmlsZSBvbiBhIFBQUCBFQVAgU1JQXC1TSEExIGF1dGhlbnRpY2F0b3IKLSgic2VydmVyIikuICBUaGlzIGZpbGUgaGFzIHRoZSBzYW1lIGJhc2ljIGxheW91dCBhcyB0aGUgb3RoZXIgcHBwZCg4KQotYXV0aGVudGljYXRpb24gZmlsZXMsIC9ldGMvcHBwL3BhcFwtc2VjcmV0cyBhbmQgL2V0Yy9wcHAvY2hhcFwtc2VjcmV0cy4KLVRodXMsIHRoZSBlbnRyeSBnZW5lcmF0ZWQgaGFzIGF0IGxlYXN0IGZvdXIgbWFpbiBmaWVsZHMgc2VwYXJhdGVkIGJ5Ci1zcGFjZXMuICBUaGUgZmlyc3QgZmllbGQgaXMgdGhlIGF1dGhlbnRpY2F0ZWUgKCJjbGllbnQiKSBuYW1lLiAgVGhlCi1zZWNvbmQgaXMgdGhlIHNlcnZlciBuYW1lLiAgVGhlIHRoaXJkIGlzIHRoZSBzZWNyZXQuICBUaGUgZm91cnRoIGlzCi10aGUgYWxsb3dlZCAob3IgYXNzaWduZWQpIElQIGFkZHJlc3MgZm9yIHRoZSBjbGllbnQsIGFuZCBkZWZhdWx0cyB0bwotIioiLiAgQWRkaXRpb25hbCBmaWVsZHMgY2FuIGNvbnRhaW4gYWRkaXRpb25hbCBJUCBhZGRyZXNzZXMgb3IgcHBwZAotb3B0aW9uczsgc2VlIHBwcGQoOCkgZm9yIGRldGFpbHMuCi0uTFAKLVRoZSB0aGlyZCBmaWVsZCBoYXMgdGhyZWUgc3ViZmllbGRzLCBzZXBhcmF0ZWQgYnkgY29sb25zLiAgVGhlIGZpcnN0Ci1zdWJmaWVsZCBpcyB0aGUgaW5kZXggb2YgdGhlIG1vZHVsdXMgYW5kIGdlbmVyYXRvciBmcm9tIFNSUCdzCi0vZXRjL3RwYXNzd2QuY29uZi4gIFRoZSBzcGVjaWFsIHZhbHVlIDAgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlCi13ZWxsLWtub3duIG1vZHVsdXMgYW5kIGdlbmVyYXRvciBzcGVjaWZpZWQgaW4gdGhlIEVBUCBTUlBcLVNIQTEgZHJhZnQuCi1UaGUgc2Vjb25kIHN1YmZpZWxkIGlzIHRoZSBwYXNzd29yZCB2YWxpZGF0b3IuICBUaGUgdGhpcmQgaXMgdGhlCi1wYXNzd29yZCBzYWx0LiAgVGhlc2UgbGF0dGVyIHR3byB2YWx1ZXMgYXJlIGVuY29kZWQgaW4gYmFzZTY0IG5vdGF0aW9uLgotLlNIIE9QVElPTlMKLS5UUAotLkkgXC1pIDxpbmRleD4KLVNwZWNpZmllcyB0aGUgbW9kdWx1cy9nZW5lcmF0b3IgaW5kZXggaW4gL2V0Yy90cGFzc3dkLmNvbmYuICBJbiBvcmRlcgotdG8gdXNlIHRoaXMgb3B0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvIHJ1biB0aGUgInRjb25mIiB1dGlsaXR5IGZyb20gdGhlCi1TUlAgcGFja2FnZSB0byBnZW5lcmF0ZSBsb2NhbCBlbnRyaWVzIGZvciB0aGlzIGZpbGUuICBOb3RlIHRoYXQgaWYKLXRoZXNlIHZhbHVlcyBhcmUgbm90IGtub3duIHRvIHRoZSBjbGllbnQsIHRoZSBjbGllbnQgd2lsbCBiZSBmb3JjZWQgdG8KLXJ1biB0aW1lLWNvbnN1bWluZyBzYWZldHkgdGVzdHMgb24gdGhlIHZhbHVlcyB1c2VkLiAgRm9yIHRoaXMgcmVhc29uLAotdXNpbmcgdGhlIHdlbGwta25vd24gdmFsdWVzIGlzIHJlY29tbWVuZGVkLgotLlRQCi0uSSA8Y2xpZW50bmFtZT4KLVNwZWNpZmllcyB0aGUgY2xpZW50IG5hbWUuICBUaGUgcGFzc3dvcmQgdmFsaWRhdG9yIGlzIGEgaGFzaGVkCi1jb21iaW5hdGlvbiBvZiB0aGUgY2xpZW50J3MgbmFtZSBhbmQgcGFzc3dvcmQsIGFuZCBib3RoIGFyZSByZXF1aXJlZC4KLUlmIHRoZSBjbGllbnQgbmFtZSBpcyBub3Qgc3VwcGxpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgc3JwXC1lbnRyeSB3aWxsCi1wcm9tcHQgZm9yIHRoZSBjbGllbnQgbmFtZSBmaXJzdC4KLS5TSCBGSUxFUwotLlRQCi0uQiAvZXRjL3BwcC9zcnBcLXNlY3JldHMKLVVzZXJuYW1lcywgcGFzc3dvcmRzIGFuZCBJUCBhZGRyZXNzZXMgZm9yIFNSUCBhdXRoZW50aWNhdGlvbi4gIFRoaXMKLWZpbGUgc2hvdWxkIGJlIG93bmVkIGJ5IHJvb3QgYW5kIG5vdCByZWFkYWJsZSBvciB3cml0YWJsZSBieSBhbnkgb3RoZXIKLXVzZXIuICBQcHBkIHdpbGwgbG9nIGEgd2FybmluZyBpZiB0aGlzIGlzIG5vdCB0aGUgY2FzZS4gIE5vdGUgdGhhdAotc3JwXC1lbnRyeSBkb2VzIG5vdCB3cml0ZSB0byB0aGlzIGZpbGUuICBUaGUgdXNlciBpcyByZXNwb25zaWJsZSBmb3IKLWNvcHlpbmcgdGhlIG91dHB1dCBvZiBzcnBcLWVudHJ5IGludG8gdGhpcyBmaWxlLgotLlRQCi0uQiAvZXRjL3RwYXNzd2QuY29uZgotSW5kZXhlZCBjb3BpZXMgb2YgdGVzdGVkIG1vZHVsdXMvZ2VuZXJhdG9yIGNvbWJpbmF0aW9uczsgcGFydCBvZiB0aGUKLVNSUCBwYWNrYWdlLgotLlNIIFNFRSBBTFNPCi0uVFAKLXBwcGQoOCkKLS5UUAotLkIgUkZDMjI4NAotQmx1bmssIEwuLCBWb2xsYnJlY2h0LCBKLiwKLS5JIFBQUCBFeHRlbnNpYmxlIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sIChFQVApLgotTWFyY2ggMTk5OC4KLS5UUAotLkIgZHJhZnRcLWlldGZcLXBwcGV4dFwtZWFwXC1zcnBcLTAzLnR4dAotQ2FybHNvbiwgSi4sIGV0IGFsLiwKLS5JIEVBUCBTUlBcLVNIQTEgQXV0aGVudGljYXRpb24gUHJvdG9jb2wuCi1KdWx5IDIwMDEuCi0uVFAKLS5CIFJGQzI5NDUKLVd1LCBULiwKLS5JIFRoZSBTUlAgQXV0aGVudGljYXRpb24gYW5kIEtleSBFeGNoYW5nZSBTeXN0ZW0KLVNlcHRlbWJlciAyMDAwLgotLlNIIEFVVEhPUgotSmFtZXMgQ2FybHNvbiAoamFtZXMuZC5jYXJsc29uQHN1bi5jb20pCmRpZmYgLS1naXQgYS9wcHBkL3NycC1lbnRyeS5jIGIvcHBwZC9zcnAtZW50cnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwZTI5Ny4uMDAwMDAwMAotLS0gYS9wcHBkL3NycC1lbnRyeS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qCi0gKiBVdGlsaXR5IHByb2dyYW0gZm9yIGdlbmVyYXRpbmcgZW50cmllcyBpbiAvZXRjL3BwcC9zcnAtc2VjcmV0cwotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIE5vbi1leGNsdXNpdmUgcmlnaHRzIHRvIHJlZGlzdHJpYnV0ZSwgbW9kaWZ5LCB0cmFuc2xhdGUsIGFuZCB1c2UKLSAqIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIGluIHdob2xlIG9yIGluIHBhcnQsIGlzCi0gKiBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcwotICogZHVwbGljYXRlZCBpbiBhbnkgc291cmNlIGZvcm0sIGFuZCB0aGF0IG5laXRoZXIgdGhlIG5hbWUgb2YgdGhlCi0gKiBjb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgYXV0aG9yIGlzIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZS4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBPcmlnaW5hbCB2ZXJzaW9uIGJ5IEphbWVzIENhcmxzb24KLSAqCi0gKiBVc2FnZToKLSAqCXNycC1lbnRyeSBbLWkgaW5kZXhdIFtjbGllbnRuYW1lXQotICoKLSAqIEluZGV4LCBpZiBzdXBwbGllZCwgaXMgdGhlIG1vZHVsdXMvZ2VuZXJhdG9yIGluZGV4IGZyb20KLSAqIC9ldGMvdHBhc3N3ZC5jb25mLiAgSWYgbm90IHN1cHBsaWVkLCB0aGVuIHRoZSBsYXN0IChoaWdoZXN0Ci0gKiBudW1iZXJlZCkgZW50cnkgZnJvbSB0aGF0IGZpbGUgaXMgdXNlZC4gIElmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QsCi0gKiB0aGVuIHRoZSBkZWZhdWx0ICJ3ZWxsIGtub3duIiBFQVAgU1JQLVNIQTEgbW9kdWx1cy9nZW5lcmF0b3IgaXMKLSAqIHVzZWQuCi0gKgotICogVGhlIGRlZmF1bHQgbW9kdWx1cy9nZW5lcmF0b3IgY2FuIGJlIHJlcXVlc3RlZCBhcyBpbmRleCAwLgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8dF9wd2QuaD4KLQotI2lmbmRlZglTT0wyCi0jZGVmaW5lCWdldHBhc3NwaHJhc2UJZ2V0cGFzcwotI2VuZGlmCi0KLSNkZWZpbmUJSEFTX1NQQUNFCTEKLSNkZWZpbmUJSEFTX0RRVU9URQkyCi0jZGVmaW5lCUhBU19TUVVPVEUJNAotI2RlZmluZQlIQVNfQkFDS1NMQVNICTgKLQotc3RhdGljIGNvbnN0IHVfY2hhciB3a21vZHVsdXNbXSA9IHsKLQkweEFDLCAweDZCLCAweERCLCAweDQxLCAweDMyLCAweDRBLCAweDlBLCAweDlCLAotCTB4RjEsIDB4NjYsIDB4REUsIDB4NUUsIDB4MTMsIDB4ODksIDB4NTgsIDB4MkYsCi0JMHhBRiwgMHg3MiwgMHhCNiwgMHg2NSwgMHgxOSwgMHg4NywgMHhFRSwgMHgwNywKLQkweEZDLCAweDMxLCAweDkyLCAweDk0LCAweDNELCAweEI1LCAweDYwLCAweDUwLAotCTB4QTMsIDB4NzMsIDB4MjksIDB4Q0IsIDB4QjQsIDB4QTAsIDB4OTksIDB4RUQsCi0JMHg4MSwgMHg5MywgMHhFMCwgMHg3NSwgMHg3NywgMHg2NywgMHhBMSwgMHgzRCwKLQkweEQ1LCAweDIzLCAweDEyLCAweEFCLCAweDRCLCAweDAzLCAweDMxLCAweDBELAotCTB4Q0QsIDB4N0YsIDB4NDgsIDB4QTksIDB4REEsIDB4MDQsIDB4RkQsIDB4NTAsCi0JMHhFOCwgMHgwOCwgMHgzOSwgMHg2OSwgMHhFRCwgMHhCNywgMHg2NywgMHhCMCwKLQkweENGLCAweDYwLCAweDk1LCAweDE3LCAweDlBLCAweDE2LCAweDNBLCAweEIzLAotCTB4NjYsIDB4MUEsIDB4MDUsIDB4RkIsIDB4RDUsIDB4RkEsIDB4QUEsIDB4RTgsCi0JMHgyOSwgMHgxOCwgMHhBOSwgMHg5NiwgMHgyRiwgMHgwQiwgMHg5MywgMHhCOCwKLQkweDU1LCAweEY5LCAweDc5LCAweDkzLCAweEVDLCAweDk3LCAweDVFLCAweEVBLAotCTB4QTgsIDB4MEQsIDB4NzQsIDB4MEEsIDB4REIsIDB4RjQsIDB4RkYsIDB4NzQsCi0JMHg3MywgMHg1OSwgMHhEMCwgMHg0MSwgMHhENSwgMHhDMywgMHgzRSwgMHhBNywKLQkweDFELCAweDI4LCAweDFFLCAweDQ0LCAweDZCLCAweDE0LCAweDc3LCAweDNCLAotCTB4Q0EsIDB4OTcsIDB4QjQsIDB4M0EsIDB4MjMsIDB4RkIsIDB4ODAsIDB4MTYsCi0JMHg3NiwgMHhCRCwgMHgyMCwgMHg3QSwgMHg0MywgMHg2QywgMHg2NCwgMHg4MSwKLQkweEYxLCAweEQyLCAweEI5LCAweDA3LCAweDg3LCAweDE3LCAweDQ2LCAweDFBLAotCTB4NUIsIDB4OUQsIDB4MzIsIDB4RTYsIDB4ODgsIDB4RjgsIDB4NzcsIDB4NDgsCi0JMHg1NCwgMHg0NSwgMHgyMywgMHhCNSwgMHgyNCwgMHhCMCwgMHhENSwgMHg3RCwKLQkweDVFLCAweEE3LCAweDdBLCAweDI3LCAweDc1LCAweEQyLCAweEVDLCAweEZBLAotCTB4MDMsIDB4MkMsIDB4RkIsIDB4REIsIDB4RjUsIDB4MkYsIDB4QjMsIDB4NzgsCi0JMHg2MSwgMHg2MCwgMHgyNywgMHg5MCwgMHgwNCwgMHhFNSwgMHg3QSwgMHhFNiwKLQkweEFGLCAweDg3LCAweDRFLCAweDczLCAweDAzLCAweENFLCAweDUzLCAweDI5LAotCTB4OUMsIDB4Q0MsIDB4MDQsIDB4MUMsIDB4N0IsIDB4QzMsIDB4MDgsIDB4RDgsCi0JMHgyQSwgMHg1NiwgMHg5OCwgMHhGMywgMHhBOCwgMHhEMCwgMHhDMywgMHg4MiwKLQkweDcxLCAweEFFLCAweDM1LCAweEY4LCAweEU5LCAweERCLCAweEZCLCAweEI2LAotCTB4OTQsIDB4QjUsIDB4QzgsIDB4MDMsIDB4RDgsIDB4OUYsIDB4N0EsIDB4RTQsCi0JMHgzNSwgMHhERSwgMHgyMywgMHg2RCwgMHg1MiwgMHg1RiwgMHg1NCwgMHg3NSwKLQkweDlCLCAweDY1LCAweEUzLCAweDcyLCAweEZDLCAweEQ2LCAweDhFLCAweEYyLAotCTB4MEYsIDB4QTcsIDB4MTEsIDB4MUYsIDB4OUUsIDB4NEEsIDB4RkYsIDB4NzMKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpteW5hbWU7Ci0KLXN0YXRpYyB2b2lkCi11c2FnZSh2b2lkKQotewotCSh2b2lkKSBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOlxuXHQlcyBbLWkgaW5kZXhdIFtjbGllbnRuYW1lXVxuIiwKLQkgICAgbXluYW1lKTsKLQlleGl0KDEpOwotfQotCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotCXN0cnVjdCB0X2NvbmYgKnRjOwotCXN0cnVjdCB0X2NvbmZlbnQgKnRjZW50LCBteXRjZTsKLQlzdHJ1Y3QgdF9wdyBwd3ZhbDsKLQljaGFyICpuYW1lOwotCWNoYXIgcG5hbWVbMjU2XTsKLQljaGFyICpwYXNzMSwgKnBhc3MyOwotCWludCBmbGFncywgaWR4OwotCWNoYXIgKmNwOwotCWNoYXIgZGVsaW1pdDsKLQljaGFyIHN0cmJ1ZltNQVhCNjRQQVJBTUxFTl07Ci0JY2hhciBzYWx0YnVmW01BWEI2NFNBTFRMRU5dOwotCi0JaWYgKChteW5hbWUgPSAqYXJndikgPT0gTlVMTCkKLQkJbXluYW1lID0gInNycC1lbnRyeSI7Ci0JZWxzZQotCQlhcmd2Kys7Ci0KLQlpZHggPSAtMTsKLQlpZiAoKmFyZ3YgIT0gTlVMTCAmJiBzdHJjbXAoKmFyZ3YsICItaSIpID09IDApIHsKLQkJaWYgKCorK2FyZ3YgPT0gTlVMTCkKLQkJCXVzYWdlKCk7Ci0JCWlkeCA9IGF0b2koKmFyZ3YrKyk7Ci0JfQotCi0JdGNlbnQgPSBOVUxMOwotCWlmIChpZHggIT0gMCAmJiAodGMgPSB0X29wZW5jb25mKE5VTEwpKSAhPSBOVUxMKSB7Ci0JCWlmIChpZHggPT0gLTEpCi0JCQl0Y2VudCA9IHRfZ2V0Y29uZmxhc3QodGMpOwotCQllbHNlCi0JCQl0Y2VudCA9IHRfZ2V0Y29uZmJ5aW5kZXgodGMsIGlkeCk7Ci0JfQotCWlmIChpZHggPD0gMCAmJiB0Y2VudCA9PSBOVUxMKSB7Ci0JCW15dGNlLmluZGV4ID0gMDsKLQkJbXl0Y2UubW9kdWx1cy5kYXRhID0gKHVfY2hhciAqKXdrbW9kdWx1czsKLQkJbXl0Y2UubW9kdWx1cy5sZW4gPSBzaXplb2YgKHdrbW9kdWx1cyk7Ci0JCW15dGNlLmdlbmVyYXRvci5kYXRhID0gKHVfY2hhciAqKSJcMDAyIjsKLQkJbXl0Y2UuZ2VuZXJhdG9yLmxlbiA9IDE7Ci0JCXRjZW50ID0gJm15dGNlOwotCX0KLQlpZiAodGNlbnQgPT0gTlVMTCkgewotCQkodm9pZCkgZnByaW50ZihzdGRlcnIsICJTUlAgbW9kdWx1cy9nZW5lcmF0b3IgJWQgbm90IGZvdW5kXG4iLAotCQkgICAgaWR4KTsKLQkJZXhpdCgxKTsKLQl9Ci0KLQlpZiAoKG5hbWUgPSAqYXJndikgPT0gTlVMTCkgewotCQkodm9pZCkgcHJpbnRmKCJDbGllbnQgbmFtZTogIik7Ci0JCWlmIChmZ2V0cyhwbmFtZSwgc2l6ZW9mIChwbmFtZSksIHN0ZGluKSA9PSBOVUxMKQotCQkJZXhpdCgxKTsKLQkJaWYgKChjcCA9IHN0cmNocihwbmFtZSwgJ1xuJykpICE9IE5VTEwpCi0JCQkqY3AgPSAnXDAnOwotCQluYW1lID0gcG5hbWU7Ci0JfQotCi0JZm9yICg7OykgewotCQlpZiAoKHBhc3MxID0gZ2V0cGFzc3BocmFzZSgiUGFzcyBwaHJhc2U6ICIpKSA9PSBOVUxMKQotCQkJZXhpdCgxKTsKLQkJcGFzczEgPSBzdHJkdXAocGFzczEpOwotCQlpZiAoKHBhc3MyID0gZ2V0cGFzc3BocmFzZSgiUmUtZW50ZXIgcGhyYXNlOiAiKSkgPT0gTlVMTCkKLQkJCWV4aXQoMSk7Ci0JCWlmIChzdHJjbXAocGFzczEsIHBhc3MyKSA9PSAwKQotCQkJYnJlYWs7Ci0JCWZyZWUocGFzczEpOwotCQkodm9pZCkgcHJpbnRmKCJQaHJhc2VzIGRvbid0IG1hdGNoOyB0cnkgYWdhaW4uXG4iKTsKLQl9Ci0KLQltZW1zZXQoJnB3dmFsLCAwLCBzaXplb2YgKHB3dmFsKSk7Ci0JdF9tYWtlcHdlbnQoJnB3dmFsLCBuYW1lLCBwYXNzMSwgTlVMTCwgdGNlbnQpOwotCWZsYWdzID0gMDsKLQlmb3IgKGNwID0gbmFtZTsgKmNwICE9ICdcMCc7IGNwKyspCi0JCWlmIChpc3NwYWNlKCpjcCkpCi0JCQlmbGFncyB8PSBIQVNfU1BBQ0U7Ci0JCWVsc2UgaWYgKCpjcCA9PSAnIicpCi0JCQlmbGFncyB8PSBIQVNfRFFVT1RFOwotCQllbHNlIGlmICgqY3AgPT0gJ1wnJykKLQkJCWZsYWdzIHw9IEhBU19TUVVPVEU7Ci0JCWVsc2UgaWYgKCpjcCA9PSAnXFwnKQotCQkJZmxhZ3MgfD0gSEFTX0JBQ0tTTEFTSDsKLQlkZWxpbWl0ID0gZmxhZ3MgPT0gMCA/ICdcMCcgOiAoZmxhZ3MgJiBIQVNfRFFVT1RFKSA/ICdcJycgOiAnIic7Ci0JaWYgKGRlbGltaXQgIT0gJ1wwJykKLQkJKHZvaWQpIHB1dGNoYXIoZGVsaW1pdCk7Ci0JZm9yIChjcCA9IG5hbWU7ICpjcCAhPSAnXDAnOyBjcCsrKSB7Ci0JCWlmICgqY3AgPT0gZGVsaW1pdCB8fCAqY3AgPT0gJ1xcJykKLQkJCSh2b2lkKSBwdXRjaGFyKCdcXCcpOwotCQkodm9pZCkgcHV0Y2hhcigqY3ApOwotCX0KLQlpZiAoZGVsaW1pdCAhPSAnXDAnKQotCQkodm9pZCkgcHV0Y2hhcihkZWxpbWl0KTsKLQkodm9pZCkgcHJpbnRmKCIgKiAlZDolczolcyAqXG4iLAotCSAgICBwd3ZhbC5wZWJ1Zi5pbmRleCwgdF90b2I2NChzdHJidWYsCi0JCShjaGFyICopcHd2YWwucGVidWYucGFzc3dvcmQuZGF0YSwgcHd2YWwucGVidWYucGFzc3dvcmQubGVuKSwKLQkgICAgdF90b2I2NChzYWx0YnVmLCAoY2hhciAqKXB3dmFsLnBlYnVmLnNhbHQuZGF0YSwKLQkJcHd2YWwucGVidWYuc2FsdC5sZW4pKTsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3BwcGQvc3lzLWxpbnV4LmMgYi9wcHBkL3N5cy1saW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmJjY2E5Li4wMDAwMDAwCi0tLSBhL3BwcGQvc3lzLWxpbnV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQ3ICswLDAgQEAKLS8qCi0gKiBzeXMtbGludXguYyAtIFN5c3RlbS1kZXBlbmRlbnQgcHJvY2VkdXJlcyBmb3Igc2V0dGluZyB1cAotICogUFBQIGludGVyZmFjZXMgb24gTGludXggc3lzdGVtcwotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NC0yMDA0IFBhdWwgTWFja2VycmFzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIDMuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgUGF1bCBNYWNrZXJyYXMKLSAqICAgICA8cGF1bHVzQHNhbWJhLm9yZz4iLgotICoKLSAqIFRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLSAqIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotICogQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKgotICogRGVyaXZlZCBmcm9tIG1haW4uYyBhbmQgcHBwZC5oLCB3aGljaCBhcmU6Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTg0LTIwMDAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIG5hbWUgIkNhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3IgcGVybWlzc2lvbiBvciBhbnkgbGVnYWwKLSAqICAgIGRldGFpbHMsIHBsZWFzZSBjb250YWN0Ci0gKiAgICAgIE9mZmljZSBvZiBUZWNobm9sb2d5IFRyYW5zZmVyCi0gKiAgICAgIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5Ci0gKiAgICAgIDUwMDAgRm9yYmVzIEF2ZW51ZQotICogICAgICBQaXR0c2J1cmdoLCBQQSAgMTUyMTMtMzg5MAotICogICAgICAoNDEyKSAyNjgtNDM4NywgZmF4OiAoNDEyKSAyNjgtNzM5NQotICogICAgICB0ZWNoLXRyYW5zZmVyQGFuZHJldy5jbXUuZWR1Ci0gKgotICogNC4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBDb21wdXRpbmcgU2VydmljZXMKLSAqICAgICBhdCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSAoaHR0cDovL3d3dy5jbXUuZWR1L2NvbXB1dGluZy8pLiIKLSAqCi0gKiBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLSAqIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotICogQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIENBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIEJFIExJQUJMRQotICogRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy9lcnJuby5oPgotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgotI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzbG9nLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPG1lbW9yeS5oPgotI2luY2x1ZGUgPHV0bXAuaD4KLSNpbmNsdWRlIDxtbnRlbnQuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8dGVybWlvcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0vKiBUaGlzIGlzIGluIG5ldGRldmljZS5oLiBIb3dldmVyLCB0aGlzIGNvbXBpbGUgd2lsbCBmYWlsIG1pc2VyYWJseSBpZgotICAgeW91IGF0dGVtcHQgdG8gaW5jbHVkZSBuZXRkZXZpY2UuaCBiZWNhdXNlIGl0IGhhcyBzbyBtYW55IHJlZmVyZW5jZXMKLSAgIHRvIF9fbWVtY3B5IGZ1bmN0aW9ucyB3aGljaCBpdCBzaG91bGQgbm90IGF0dGVtcHQgdG8gZG8uIFNvLCBzaW5jZSBJCi0gICByZWFsbHkgZG9uJ3QgdXNlIGl0LCBidXQgaXQgbXVzdCBiZSBkZWZpbmVkLCBkZWZpbmUgaXQgbm93LiAqLwotCi0jaWZuZGVmIE1BWF9BRERSX0xFTgotI2RlZmluZSBNQVhfQUREUl9MRU4gNwotI2VuZGlmCi0KLSNpZiBfX0dMSUJDX18gPj0gMgotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgkJLyogZ2xpYmMgMiBjb25mbGljdHMgd2l0aCBsaW51eC90eXBlcy5oICovCi0jaW5jbHVkZSA8bmV0L2lmLmg+Ci0jaW5jbHVkZSA8bmV0L2lmX2FycC5oPgotI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgotI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KLSNlbHNlCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pZi5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgotI2luY2x1ZGUgPGxpbnV4L3JvdXRlLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KLSNlbmRpZgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3BwcF9kZWZzLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfcHBwLmg+Ci0KLSNpbmNsdWRlICJwcHBkLmgiCi0jaW5jbHVkZSAiZnNtLmgiCi0jaW5jbHVkZSAiaXBjcC5oIgotCi0jaWZkZWYgSVBYX0NIQU5HRQotI2luY2x1ZGUgImlweGNwLmgiCi0jaWYgX19HTElCQ19fID49IDIgJiYgXAotICAgICEoZGVmaW5lZChfX3Bvd2VycGNfXykgJiYgX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID09IDApCi0jaW5jbHVkZSA8bmV0aXB4L2lweC5oPgotI2Vsc2UKLSNpbmNsdWRlIDxsaW51eC9pcHguaD4KLSNlbmRpZgotI2VuZGlmIC8qIElQWF9DSEFOR0UgKi8KLQotI2lmZGVmIFBQUF9GSUxURVIKLSNpbmNsdWRlIDxwY2FwLWJwZi5oPgotI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPgotI2VuZGlmIC8qIFBQUF9GSUxURVIgKi8KLQotI2lmZGVmIExPQ0tMSUIKLSNpbmNsdWRlIDxzeXMvbG9ja3MuaD4KLSNlbmRpZgotCi0jaWZkZWYgSU5FVDYKLSNpZiAhZGVmaW5lZChfTElOVVhfSU42X0gpICYmICFkZWZpbmVkKF9VQVBJX0xJTlVYX0lONl9IKQotLyoKLSAqICAgIFRoaXMgaXMgaW4gbGludXgvaW5jbHVkZS9uZXQvaXB2Ni5oLgotICovCi0KLXN0cnVjdCBpbjZfaWZyZXEgewotICAgIHN0cnVjdCBpbjZfYWRkciBpZnI2X2FkZHI7Ci0gICAgX191MzIgaWZyNl9wcmVmaXhsZW47Ci0gICAgdW5zaWduZWQgaW50IGlmcjZfaWZpbmRleDsKLX07Ci0jZW5kaWYKLQotI2RlZmluZSBJTjZfTExBRERSX0ZST01fRVVJNjQoc2luNiwgZXVpNjQpIGRvIHsJCQlcCi0JbWVtc2V0KCZzaW42LnM2X2FkZHIsIDAsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsJXAotCXNpbjYuczZfYWRkcjE2WzBdID0gaHRvbnMoMHhmZTgwKTsJCQlcCi0JZXVpNjRfY29weShldWk2NCwgc2luNi5zNl9hZGRyMzJbMl0pOwkJCVwKLQl9IHdoaWxlICgwKQotCi0jaWYgZGVmaW5lZChfX0FORFJPSURfXykKLSNpbmNsdWRlIDxuZXQvcm91dGUuaD4KLSNlbmRpZgotCi0jZW5kaWYgLyogSU5FVDYgKi8KLQotLyogV2UgY2FuIGdldCBhbiBFSU8gZXJyb3Igb24gYW4gaW9jdGwgaWYgdGhlIG1vZGVtIGhhcyBodW5nIHVwICovCi0jZGVmaW5lIG9rX2Vycm9yKG51bSkgKChudW0pPT1FSU8pCi0KLXN0YXRpYyBpbnQgdHR5X2Rpc2MgPSBOX1RUWTsJLyogVGhlIFRUWSBkaXNjaXBsaW5lICovCi1zdGF0aWMgaW50IHBwcF9kaXNjID0gTl9QUFA7CS8qIFRoZSBQUFAgZGlzY3BsaW5lICovCi1zdGF0aWMgaW50IGluaXRmZGZsYWdzID0gLTE7CS8qIEluaXRpYWwgZmlsZSBkZXNjcmlwdG9yIGZsYWdzIGZvciBmZCAqLwotc3RhdGljIGludCBwcHBfZmQgPSAtMTsJCS8qIGZkIHdoaWNoIGlzIHNldCB0byBQUFAgZGlzY2lwbGluZSAqLwotc3RhdGljIGludCBzb2NrX2ZkID0gLTE7CS8qIHNvY2tldCBmb3IgZG9pbmcgaW50ZXJmYWNlIGlvY3RscyAqLwotc3RhdGljIGludCBzbGF2ZV9mZCA9IC0xOwkvKiBwdHkgZm9yIG9sZC1zdHlsZSBkZW1hbmQgbW9kZSwgc2xhdmUgKi8KLXN0YXRpYyBpbnQgbWFzdGVyX2ZkID0gLTE7CS8qIHB0eSBmb3Igb2xkLXN0eWxlIGRlbWFuZCBtb2RlLCBtYXN0ZXIgKi8KLSNpZmRlZiBJTkVUNgotc3RhdGljIGludCBzb2NrNl9mZCA9IC0xOwotI2VuZGlmIC8qIElORVQ2ICovCi0KLS8qCi0gKiBGb3IgdGhlIG9sZC1zdHlsZSBrZXJuZWwgZHJpdmVyLCB0aGlzIGlzIHRoZSBzYW1lIGFzIHBwcF9mZC4KLSAqIEZvciB0aGUgbmV3LXN0eWxlIGRyaXZlciwgaXQgaXMgdGhlIGZkIG9mIGFuIGluc3RhbmNlIG9mIC9kZXYvcHBwCi0gKiB3aGljaCBpcyBhdHRhY2hlZCB0byB0aGUgcHBwIHVuaXQgYW5kIGlzIHVzZWQgZm9yIGNvbnRyb2xsaW5nIGl0LgotICovCi1pbnQgcHBwX2Rldl9mZCA9IC0xOwkJLyogZmQgZm9yIC9kZXYvcHBwIChuZXcgc3R5bGUgZHJpdmVyKSAqLwotCi1zdGF0aWMgaW50IGNoaW5kZXg7CQkvKiBjaGFubmVsIGluZGV4IChuZXcgc3R5bGUgZHJpdmVyKSAqLwotCi1zdGF0aWMgZmRfc2V0IGluX2ZkczsJCS8qIHNldCBvZiBmZHMgdGhhdCB3YWl0X2lucHV0IHdhaXRzIGZvciAqLwotc3RhdGljIGludCBtYXhfaW5fZmQ7CQkvKiBoaWdoZXN0IGZkIHNldCBpbiBpbl9mZHMgKi8KLQotc3RhdGljIGludCBoYXNfcHJveHlfYXJwICAgICAgID0gMDsKLXN0YXRpYyBpbnQgZHJpdmVyX3ZlcnNpb24gICAgICA9IDA7Ci1zdGF0aWMgaW50IGRyaXZlcl9tb2RpZmljYXRpb24gPSAwOwotc3RhdGljIGludCBkcml2ZXJfcGF0Y2ggICAgICAgID0gMDsKLXN0YXRpYyBpbnQgZHJpdmVyX2lzX29sZCAgICAgICA9IDA7Ci1zdGF0aWMgaW50IHJlc3RvcmVfdGVybSAgICAgICAgPSAwOwkvKiAxID0+IHdlJ3ZlIG11bmdlZCB0aGUgdGVybWluYWwgKi8KLXN0YXRpYyBzdHJ1Y3QgdGVybWlvcyBpbml0dGVybWlvczsJLyogSW5pdGlhbCBUVFkgdGVybWlvcyAqLwotCi1pbnQgbmV3X3N0eWxlX2RyaXZlciA9IDA7Ci0KLXN0YXRpYyBjaGFyIGxvb3BfbmFtZVsyMF07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBpbmJ1Zls1MTJdOyAvKiBidWZmZXIgZm9yIGNoYXJzIHJlYWQgZnJvbSBsb29wYmFjayAqLwotCi1zdGF0aWMgaW50CWlmX2lzX3VwOwkvKiBJbnRlcmZhY2UgaGFzIGJlZW4gbWFya2VkIHVwICovCi1zdGF0aWMgaW50CWlmNl9pc191cDsJLyogSW50ZXJmYWNlIGhhcyBiZWVuIG1hcmtlZCB1cCBmb3IgSVB2NiwgdG8gaGVscCBkaWZmZXJlbnRpYXRlICovCi1zdGF0aWMgaW50CWhhdmVfZGVmYXVsdF9yb3V0ZTsJLyogR2F0ZXdheSBmb3IgZGVmYXVsdCByb3V0ZSBhZGRlZCAqLwotc3RhdGljIHVfaW50MzJfdCBwcm94eV9hcnBfYWRkcjsJLyogQWRkciBmb3IgcHJveHkgYXJwIGVudHJ5IGFkZGVkICovCi1zdGF0aWMgY2hhciBwcm94eV9hcnBfZGV2WzE2XTsJCS8qIERldmljZSBmb3IgcHJveHkgYXJwIGVudHJ5ICovCi1zdGF0aWMgdV9pbnQzMl90IG91cl9vbGRfYWRkcjsJCS8qIGZvciBkZXRlY3RpbmcgYWRkcmVzcyBjaGFuZ2VzICovCi1zdGF0aWMgaW50CWR5bmFkZHJfc2V0OwkJLyogMSBpZiBpcF9keW5hZGRyIHNldCAqLwotc3RhdGljIGludAlsb29wZWQ7CQkJLyogMSBpZiB1c2luZyBsb29wICovCi1zdGF0aWMgaW50CWxpbmtfbXR1OwkJLyogbXR1IGZvciB0aGUgbGluayAobm90IGJ1bmRsZSkgKi8KLQotc3RhdGljIHN0cnVjdCB1dHNuYW1lIHV0c25hbWU7CS8qIGZvciB0aGUga2VybmVsIHZlcnNpb24gKi8KLXN0YXRpYyBpbnQga2VybmVsX3ZlcnNpb247Ci0jZGVmaW5lIEtWRVJTSU9OKGosbixwKQkoKGopKjEwMDAwMDAgKyAobikqMTAwMCArIChwKSkKLQotI2RlZmluZSBNQVhfSUZTCQkxMDAKLQotI2RlZmluZSBGTEFHU19HT09EIChJRkZfVVAgICAgICAgICAgfCBJRkZfQlJPQURDQVNUKQotI2RlZmluZSBGTEFHU19NQVNLIChJRkZfVVAgICAgICAgICAgfCBJRkZfQlJPQURDQVNUIHwgXAotCQkgICAgSUZGX1BPSU5UT1BPSU5UIHwgSUZGX0xPT1BCQUNLICB8IElGRl9OT0FSUCkKLQotI2RlZmluZSBTSU5fQUREUih4KQkoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgKCYoeCkpKS0+c2luX2FkZHIuc19hZGRyKQotCi0vKiBQcm90b3R5cGVzIGZvciBwcm9jZWR1cmVzIGxvY2FsIHRvIHRoaXMgZmlsZS4gKi8KLXN0YXRpYyBpbnQgbW9kaWZ5X2ZsYWdzKGludCBmZCwgaW50IGNsZWFyX2JpdHMsIGludCBzZXRfYml0cyk7Ci1zdGF0aWMgaW50IHRyYW5zbGF0ZV9zcGVlZCAoaW50IGJwcyk7Ci1zdGF0aWMgaW50IGJhdWRfcmF0ZV9vZiAoaW50IHNwZWVkKTsKLXN0YXRpYyB2b2lkIGNsb3NlX3JvdXRlX3RhYmxlICh2b2lkKTsKLXN0YXRpYyBpbnQgb3Blbl9yb3V0ZV90YWJsZSAodm9pZCk7Ci1zdGF0aWMgaW50IHJlYWRfcm91dGVfdGFibGUgKHN0cnVjdCBydGVudHJ5ICpydCk7Ci1zdGF0aWMgaW50IGRlZmF1bHRyb3V0ZV9leGlzdHMgKHN0cnVjdCBydGVudHJ5ICpydCk7Ci1zdGF0aWMgaW50IGdldF9ldGhlcl9hZGRyICh1X2ludDMyX3QgaXBhZGRyLCBzdHJ1Y3Qgc29ja2FkZHIgKmh3YWRkciwKLQkJCSAgIGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKTsKLXN0YXRpYyB2b2lkIGRlY29kZV92ZXJzaW9uIChjaGFyICpidWYsIGludCAqdmVyc2lvbiwgaW50ICptb2QsIGludCAqcGF0Y2gpOwotc3RhdGljIGludCBzZXRfa2RlYnVnZmxhZyhpbnQgbGV2ZWwpOwotc3RhdGljIGludCBwcHBfcmVnaXN0ZXJlZCh2b2lkKTsKLXN0YXRpYyBpbnQgbWFrZV9wcHBfdW5pdCh2b2lkKTsKLXN0YXRpYyBpbnQgc2V0aWZzdGF0ZSAoaW50IHUsIGludCBzdGF0ZSk7Ci0KLWV4dGVybiB1X2NoYXIJaW5wYWNrZXRfYnVmW107CS8qIGJvcnJvd2VkIGZyb20gbWFpbi5jICovCi0KLS8qCi0gKiBTRVRfU0FfRkFNSUxZIC0gc2V0IHRoZSBzYV9mYW1pbHkgZmllbGQgb2YgYSBzdHJ1Y3Qgc29ja2FkZHIsCi0gKiBpZiBpdCBleGlzdHMuCi0gKi8KLQotI2RlZmluZSBTRVRfU0FfRkFNSUxZKGFkZHIsIGZhbWlseSkJCQlcCi0gICAgbWVtc2V0ICgoY2hhciAqKSAmKGFkZHIpLCAnXDAnLCBzaXplb2YoYWRkcikpOwlcCi0gICAgYWRkci5zYV9mYW1pbHkgPSAoZmFtaWx5KTsKLQotLyoKLSAqIERldGVybWluZSBpZiB0aGUgUFBQIGNvbm5lY3Rpb24gc2hvdWxkIHN0aWxsIGJlIHByZXNlbnQuCi0gKi8KLQotZXh0ZXJuIGludCBodW5ndXA7Ci0KLS8qIG5ld19mZCBpcyB0aGUgZmQgb2YgYSB0dHkgKi8KLXN0YXRpYyB2b2lkIHNldF9wcHBfZmQgKGludCBuZXdfZmQpCi17Ci0JcHBwX2ZkID0gbmV3X2ZkOwotCWlmICghbmV3X3N0eWxlX2RyaXZlcikKLQkJcHBwX2Rldl9mZCA9IG5ld19mZDsKLX0KLQotc3RhdGljIGludCBzdGlsbF9wcHAodm9pZCkKLXsKLQlpZiAobmV3X3N0eWxlX2RyaXZlcikKLQkJcmV0dXJuICFodW5ndXAgJiYgcHBwX2ZkID49IDA7Ci0JaWYgKCFodW5ndXAgfHwgcHBwX2ZkID09IHNsYXZlX2ZkKQotCQlyZXR1cm4gMTsKLQlpZiAoc2xhdmVfZmQgPj0gMCkgewotCQlzZXRfcHBwX2ZkKHNsYXZlX2ZkKTsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKgotICogbW9kaWZ5X2ZsYWdzIC0gc2V0IGFuZCBjbGVhciBmbGFnIGJpdHMgY29udHJvbGxpbmcgdGhlIGtlcm5lbAotICogUFBQIGRyaXZlci4KLSAqLwotc3RhdGljIGludCBtb2RpZnlfZmxhZ3MoaW50IGZkLCBpbnQgY2xlYXJfYml0cywgaW50IHNldF9iaXRzKQotewotCWludCBmbGFnczsKLQotCWlmIChpb2N0bChmZCwgUFBQSU9DR0ZMQUdTLCAmZmxhZ3MpID09IC0xKQotCQlnb3RvIGVycjsKLQlmbGFncyA9IChmbGFncyAmIH5jbGVhcl9iaXRzKSB8IHNldF9iaXRzOwotCWlmIChpb2N0bChmZCwgUFBQSU9DU0ZMQUdTLCAmZmxhZ3MpID09IC0xKQotCQlnb3RvIGVycjsKLQotCXJldHVybiAwOwotCi0gZXJyOgotCWlmIChlcnJubyAhPSBFSU8pCi0JCWVycm9yKCJGYWlsZWQgdG8gc2V0IFBQUCBrZXJuZWwgb3B0aW9uIGZsYWdzOiAlbSIpOwotCXJldHVybiAtMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogc3lzX2luaXQgLSBTeXN0ZW0tZGVwZW5kZW50IGluaXRpYWxpemF0aW9uLgotICovCi0KLXZvaWQgc3lzX2luaXQodm9pZCkKLXsKLSAgICAvKiBHZXQgYW4gaW50ZXJuZXQgc29ja2V0IGZvciBkb2luZyBzb2NrZXQgaW9jdGxzLiAqLwotICAgIHNvY2tfZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7Ci0gICAgaWYgKHNvY2tfZmQgPCAwKQotCWZhdGFsKCJDb3VsZG4ndCBjcmVhdGUgSVAgc29ja2V0OiAlbSglZCkiLCBlcnJubyk7Ci0KLSNpZmRlZiBJTkVUNgotICAgIHNvY2s2X2ZkID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKTsKLSAgICBpZiAoc29jazZfZmQgPCAwKQotCXNvY2s2X2ZkID0gLWVycm5vOwkvKiBzYXZlIGVycm5vIGZvciBsYXRlciAqLwotI2VuZGlmCi0KLSAgICBGRF9aRVJPKCZpbl9mZHMpOwotICAgIG1heF9pbl9mZCA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIHN5c19jbGVhbnVwIC0gcmVzdG9yZSBhbnkgc3lzdGVtIHN0YXRlIHdlIG1vZGlmaWVkIGJlZm9yZSBleGl0aW5nOgotICogbWFyayB0aGUgaW50ZXJmYWNlIGRvd24sIGRlbGV0ZSBkZWZhdWx0IHJvdXRlIGFuZC9vciBwcm94eSBhcnAgZW50cnkuCi0gKiBUaGlzIHNob3VsZG4ndCBjYWxsIGRpZSgpIGJlY2F1c2UgaXQncyBjYWxsZWQgZnJvbSBkaWUoKS4KLSAqLwotCi12b2lkIHN5c19jbGVhbnVwKHZvaWQpCi17Ci0vKgotICogVGFrZSBkb3duIHRoZSBkZXZpY2UKLSAqLwotICAgIGlmIChpZl9pc191cCkgewotCWlmX2lzX3VwID0gMDsKLQlzaWZkb3duKDApOwotICAgIH0KLSAgICBpZiAoaWY2X2lzX3VwKQotCXNpZjZkb3duKDApOwotCi0vKgotICogRGVsZXRlIGFueSByb3V0ZXMgdGhyb3VnaCB0aGUgZGV2aWNlLgotICovCi0gICAgaWYgKGhhdmVfZGVmYXVsdF9yb3V0ZSkKLQljaWZkZWZhdWx0cm91dGUoMCwgMCwgMCk7Ci0KLSAgICBpZiAoaGFzX3Byb3h5X2FycCkKLQljaWZwcm94eWFycCgwLCBwcm94eV9hcnBfYWRkcik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIHN5c19jbG9zZSAtIENsZWFuIHVwIGluIGEgY2hpbGQgcHJvY2VzcyBiZWZvcmUgZXhlY2luZy4KLSAqLwotdm9pZAotc3lzX2Nsb3NlKHZvaWQpCi17Ci0gICAgaWYgKG5ld19zdHlsZV9kcml2ZXIgJiYgcHBwX2Rldl9mZCA+PSAwKQotCWNsb3NlKHBwcF9kZXZfZmQpOwotICAgIGlmIChzb2NrX2ZkID49IDApCi0JY2xvc2Uoc29ja19mZCk7Ci0jaWZkZWYgSU5FVDYKLSAgICBpZiAoc29jazZfZmQgPj0gMCkKLQljbG9zZShzb2NrNl9mZCk7Ci0jZW5kaWYKLSAgICBpZiAoc2xhdmVfZmQgPj0gMCkKLQljbG9zZShzbGF2ZV9mZCk7Ci0gICAgaWYgKG1hc3Rlcl9mZCA+PSAwKQotCWNsb3NlKG1hc3Rlcl9mZCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIHNldF9rZGVidWdmbGFnIC0gRGVmaW5lIHRoZSBkZWJ1Z2dpbmcgbGV2ZWwgZm9yIHRoZSBrZXJuZWwKLSAqLwotCi1zdGF0aWMgaW50IHNldF9rZGVidWdmbGFnIChpbnQgcmVxdWVzdGVkX2xldmVsKQotewotICAgIGlmIChwcHBfZGV2X2ZkIDwgMCkKLQlyZXR1cm4gMTsKLSAgICBpZiAoaW9jdGwocHBwX2Rldl9mZCwgUFBQSU9DU0RFQlVHLCAmcmVxdWVzdGVkX2xldmVsKSA8IDApIHsKLQlpZiAoICEgb2tfZXJyb3IgKGVycm5vKSApCi0JICAgIGVycm9yKCJpb2N0bChQUFBJT0NTREVCVUcpOiAlbSAobGluZSAlZCkiLCBfX0xJTkVfXyk7Ci0JcmV0dXJuICgwKTsKLSAgICB9Ci0gICAgcmV0dXJuICgxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogdHR5X2VzdGFibGlzaF9wcHAgLSBUdXJuIHRoZSBzZXJpYWwgcG9ydCBpbnRvIGEgcHBwIGludGVyZmFjZS4KLSAqLwotCi1pbnQgdHR5X2VzdGFibGlzaF9wcHAgKGludCB0dHlfZmQpCi17Ci0gICAgaW50IHJldF9mZDsKLQotLyoKLSAqIEVuc3VyZSB0aGF0IHRoZSB0dHkgZGV2aWNlIGlzIGluIGV4Y2x1c2l2ZSBtb2RlLgotICovCi0gICAgaWYgKGlvY3RsKHR0eV9mZCwgVElPQ0VYQ0wsIDApIDwgMCkgewotCWlmICggISBva19lcnJvciAoIGVycm5vICkpCi0JICAgIHdhcm4oIkNvdWxkbid0IG1ha2UgdHR5IGV4Y2x1c2l2ZTogJW0iKTsKLSAgICB9Ci0vKgotICogRGVtYW5kIG1vZGUgLSBwcmltZSB0aGUgb2xkIHBwcCBkZXZpY2UgdG8gcmVsaW5xdWlzaCB0aGUgdW5pdC4KLSAqLwotICAgIGlmICghbmV3X3N0eWxlX2RyaXZlciAmJiBsb29wZWQKLQkmJiBpb2N0bChzbGF2ZV9mZCwgUFBQSU9DWEZFUlVOSVQsIDApIDwgMCkgewotCWVycm9yKCJpb2N0bCh0cmFuc2ZlciBwcHAgdW5pdCk6ICVtLCBsaW5lICVkIiwgX19MSU5FX18pOwotCXJldHVybiAtMTsKLSAgICB9Ci0vKgotICogU2V0IHRoZSBjdXJyZW50IHR0eSB0byB0aGUgUFBQIGRpc2NwbGluZQotICovCi0KLSNpZm5kZWYgTl9TWU5DX1BQUAotI2RlZmluZSBOX1NZTkNfUFBQIDE0Ci0jZW5kaWYKLSAgICBwcHBfZGlzYyA9IChuZXdfc3R5bGVfZHJpdmVyICYmIHN5bmNfc2VyaWFsKT8gTl9TWU5DX1BQUDogTl9QUFA7Ci0gICAgaWYgKGlvY3RsKHR0eV9mZCwgVElPQ1NFVEQsICZwcHBfZGlzYykgPCAwKSB7Ci0JaWYgKCAhIG9rX2Vycm9yIChlcnJubykgKSB7Ci0JICAgIGVycm9yKCJDb3VsZG4ndCBzZXQgdHR5IHRvIFBQUCBkaXNjaXBsaW5lOiAlbSIpOwotCSAgICByZXR1cm4gLTE7Ci0JfQotICAgIH0KLQotICAgIHJldF9mZCA9IGdlbmVyaWNfZXN0YWJsaXNoX3BwcCh0dHlfZmQpOwotCi0jZGVmaW5lIFNDX1JDVkIJKFNDX1JDVl9CN18wIHwgU0NfUkNWX0I3XzEgfCBTQ19SQ1ZfRVZOUCB8IFNDX1JDVl9PRERQKQotI2RlZmluZSBTQ19MT0dCCShTQ19ERUJVRyB8IFNDX0xPR19JTlBLVCB8IFNDX0xPR19PVVRQS1QgfCBTQ19MT0dfUkFXSU4gXAotCQkgfCBTQ19MT0dfRkxVU0gpCi0KLSAgICBpZiAocmV0X2ZkID49IDApIHsKLQltb2RpZnlfZmxhZ3MocHBwX2ZkLCBTQ19SQ1ZCIHwgU0NfTE9HQiwKLQkJICAgICAoa2RlYnVnZmxhZyAqIFNDX0RFQlVHKSAmIFNDX0xPR0IpOwotICAgIH0gZWxzZSB7Ci0JaWYgKGlvY3RsKHR0eV9mZCwgVElPQ1NFVEQsICZ0dHlfZGlzYykgPCAwICYmICFva19lcnJvcihlcnJubykpCi0JICAgIHdhcm4oIkNvdWxkbid0IHJlc2V0IHR0eSB0byBub3JtYWwgbGluZSBkaXNjaXBsaW5lOiAlbSIpOwotICAgIH0KLQotICAgIHJldHVybiByZXRfZmQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIGdlbmVyaWNfZXN0YWJsaXNoX3BwcCAtIFR1cm4gdGhlIGZkIGludG8gYSBwcHAgaW50ZXJmYWNlLgotICovCi1pbnQgZ2VuZXJpY19lc3RhYmxpc2hfcHBwIChpbnQgZmQpCi17Ci0gICAgaW50IHg7Ci0KLSAgICBpZiAobmV3X3N0eWxlX2RyaXZlcikgewotCWludCBmbGFnczsKLQotCS8qIE9wZW4gYW4gaW5zdGFuY2Ugb2YgL2Rldi9wcHAgYW5kIGNvbm5lY3QgdGhlIGNoYW5uZWwgdG8gaXQgKi8KLQlpZiAoaW9jdGwoZmQsIFBQUElPQ0dDSEFOLCAmY2hpbmRleCkgPT0gLTEpIHsKLQkgICAgZXJyb3IoIkNvdWxkbid0IGdldCBjaGFubmVsIG51bWJlcjogJW0iKTsKLQkgICAgZ290byBlcnI7Ci0JfQotCWRiZ2xvZygidXNpbmcgY2hhbm5lbCAlZCIsIGNoaW5kZXgpOwotCWZkID0gb3BlbigiL2Rldi9wcHAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApIHsKLQkgICAgZXJyb3IoIkNvdWxkbid0IHJlb3BlbiAvZGV2L3BwcDogJW0iKTsKLQkgICAgZ290byBlcnI7Ci0JfQotCSh2b2lkKSBmY250bChmZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7Ci0JaWYgKGlvY3RsKGZkLCBQUFBJT0NBVFRDSEFOLCAmY2hpbmRleCkgPCAwKSB7Ci0JICAgIGVycm9yKCJDb3VsZG4ndCBhdHRhY2ggdG8gY2hhbm5lbCAlZDogJW0iLCBjaGluZGV4KTsKLQkgICAgZ290byBlcnJfY2xvc2U7Ci0JfQotCWZsYWdzID0gZmNudGwoZmQsIEZfR0VURkwpOwotCWlmIChmbGFncyA9PSAtMSB8fCBmY250bChmZCwgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKSA9PSAtMSkKLQkgICAgd2FybigiQ291bGRuJ3Qgc2V0IC9kZXYvcHBwIChjaGFubmVsKSB0byBub25ibG9jazogJW0iKTsKLQlzZXRfcHBwX2ZkKGZkKTsKLQotCWlmICghbG9vcGVkKQotCSAgICBpZnVuaXQgPSAtMTsKLQlpZiAoIWxvb3BlZCAmJiAhbXVsdGlsaW5rKSB7Ci0JICAgIC8qCi0JICAgICAqIENyZWF0ZSBhIG5ldyBQUFAgdW5pdC4KLQkgICAgICovCi0JICAgIGlmIChtYWtlX3BwcF91bml0KCkgPCAwKQotCQlnb3RvIGVycl9jbG9zZTsKLQl9Ci0KLQlpZiAobG9vcGVkKQotCSAgICBtb2RpZnlfZmxhZ3MocHBwX2Rldl9mZCwgU0NfTE9PUF9UUkFGRklDLCAwKTsKLQotCWlmICghbXVsdGlsaW5rKSB7Ci0JICAgIGFkZF9mZChwcHBfZGV2X2ZkKTsKLQkgICAgaWYgKGlvY3RsKGZkLCBQUFBJT0NDT05ORUNULCAmaWZ1bml0KSA8IDApIHsKLQkJZXJyb3IoIkNvdWxkbid0IGF0dGFjaCB0byBQUFAgdW5pdCAlZDogJW0iLCBpZnVuaXQpOwotCQlnb3RvIGVycl9jbG9zZTsKLQkgICAgfQotCX0KLQotICAgIH0gZWxzZSB7Ci0JLyoKLQkgKiBPbGQtc3R5bGUgZHJpdmVyOiBmaW5kIG91dCB3aGljaCBpbnRlcmZhY2Ugd2Ugd2VyZSBnaXZlbi4KLQkgKi8KLQlzZXRfcHBwX2ZkIChmZCk7Ci0JaWYgKGlvY3RsKGZkLCBQUFBJT0NHVU5JVCwgJngpIDwgMCkgewotCSAgICBpZiAob2tfZXJyb3IgKGVycm5vKSkKLQkJZ290byBlcnI7Ci0JICAgIGZhdGFsKCJpb2N0bChQUFBJT0NHVU5JVCk6ICVtIChsaW5lICVkKSIsIF9fTElORV9fKTsKLQl9Ci0JLyogQ2hlY2sgdGhhdCB3ZSBnb3QgdGhlIHNhbWUgdW5pdCBhZ2Fpbi4gKi8KLQlpZiAobG9vcGVkICYmIHggIT0gaWZ1bml0KQotCSAgICBmYXRhbCgidHJhbnNmZXJfcHBwIGZhaWxlZDogd2FudGVkIHVuaXQgJWQsIGdvdCAlZCIsIGlmdW5pdCwgeCk7Ci0JaWZ1bml0ID0geDsKLQotCS8qCi0JICogRmV0Y2ggdGhlIGluaXRpYWwgZmlsZSBmbGFncyBhbmQgcmVzZXQgYmxvY2tpbmcgbW9kZSBvbiB0aGUgZmlsZS4KLQkgKi8KLQlpbml0ZmRmbGFncyA9IGZjbnRsKGZkLCBGX0dFVEZMKTsKLQlpZiAoaW5pdGZkZmxhZ3MgPT0gLTEgfHwKLQkgICAgZmNudGwoZmQsIEZfU0VURkwsIGluaXRmZGZsYWdzIHwgT19OT05CTE9DSykgPT0gLTEpIHsKLQkgICAgaWYgKCAhIG9rX2Vycm9yIChlcnJubykpCi0JCXdhcm4oIkNvdWxkbid0IHNldCBkZXZpY2UgdG8gbm9uLWJsb2NraW5nIG1vZGU6ICVtIik7Ci0JfQotICAgIH0KLQotICAgIC8qCi0gICAgICogRW5hYmxlIGRlYnVnIGluIHRoZSBkcml2ZXIgaWYgcmVxdWVzdGVkLgotICAgICAqLwotICAgIGlmICghbG9vcGVkKQotCXNldF9rZGVidWdmbGFnIChrZGVidWdmbGFnKTsKLQotICAgIGxvb3BlZCA9IDA7Ci0KLSAgICByZXR1cm4gcHBwX2ZkOwotCi0gZXJyX2Nsb3NlOgotICAgIGNsb3NlKGZkKTsKLSBlcnI6Ci0gICAgcmV0dXJuIC0xOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiB0dHlfZGlzZXN0YWJsaXNoX3BwcCAtIFJlc3RvcmUgdGhlIHNlcmlhbCBwb3J0IHRvIG5vcm1hbCBvcGVyYXRpb24uCi0gKiBUaGlzIHNob3VsZG4ndCBjYWxsIGRpZSgpIGJlY2F1c2UgaXQncyBjYWxsZWQgZnJvbSBkaWUoKS4KLSAqLwotCi12b2lkIHR0eV9kaXNlc3RhYmxpc2hfcHBwKGludCB0dHlfZmQpCi17Ci0gICAgaWYgKCFodW5ndXApIHsKLS8qCi0gKiBGbHVzaCB0aGUgdHR5IG91dHB1dCBidWZmZXIgc28gdGhhdCB0aGUgVElPQ1NFVEQgZG9lc24ndCBoYW5nLgotICovCi0JaWYgKHRjZmx1c2godHR5X2ZkLCBUQ0lPRkxVU0gpIDwgMCkKLQl7Ci0JICAgIHdhcm4oInRjZmx1c2ggZmFpbGVkOiAlbSIpOwotCSAgICBnb3RvIGZsdXNoZmFpbGVkOwotCX0KLS8qCi0gKiBSZXN0b3JlIHRoZSBwcmV2aW91cyBsaW5lIGRpc2NpcGxpbmUKLSAqLwotCWlmIChpb2N0bCh0dHlfZmQsIFRJT0NTRVRELCAmdHR5X2Rpc2MpIDwgMCkgewotCSAgICBpZiAoICEgb2tfZXJyb3IgKGVycm5vKSkKLQkJZXJyb3IoImlvY3RsKFRJT0NTRVRELCBOX1RUWSk6ICVtIChsaW5lICVkKSIsIF9fTElORV9fKTsKLQl9Ci0KLQlpZiAoaW9jdGwodHR5X2ZkLCBUSU9DTlhDTCwgMCkgPCAwKSB7Ci0JICAgIGlmICggISBva19lcnJvciAoZXJybm8pKQotCQl3YXJuKCJpb2N0bChUSU9DTlhDTCk6ICVtIChsaW5lICVkKSIsIF9fTElORV9fKTsKLQl9Ci0KLQkvKiBSZXNldCBub24tYmxvY2tpbmcgbW9kZSBvbiBmZC4gKi8KLQlpZiAoaW5pdGZkZmxhZ3MgIT0gLTEgJiYgZmNudGwodHR5X2ZkLCBGX1NFVEZMLCBpbml0ZmRmbGFncykgPCAwKSB7Ci0JICAgIGlmICggISBva19lcnJvciAoZXJybm8pKQotCQl3YXJuKCJDb3VsZG4ndCByZXN0b3JlIGRldmljZSBmZCBmbGFnczogJW0iKTsKLQl9Ci0gICAgfQotZmx1c2hmYWlsZWQ6Ci0gICAgaW5pdGZkZmxhZ3MgPSAtMTsKLQotICAgIGdlbmVyaWNfZGlzZXN0YWJsaXNoX3BwcCh0dHlfZmQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBnZW5lcmljX2Rpc2VzdGFibGlzaF9wcHAgLSBSZXN0b3JlIGRldmljZSBjb21wb25lbnRzIHRvIG5vcm1hbAotICogb3BlcmF0aW9uLCBhbmQgcmVjb25uZWN0IHRoZSBwcHAgdW5pdCB0byB0aGUgbG9vcGJhY2sgaWYgaW4gZGVtYW5kCi0gKiBtb2RlLiAgVGhpcyBzaG91bGRuJ3QgY2FsbCBkaWUoKSBiZWNhdXNlIGl0J3MgY2FsbGVkIGZyb20gZGllKCkuCi0gKi8KLXZvaWQgZ2VuZXJpY19kaXNlc3RhYmxpc2hfcHBwKGludCBkZXZfZmQpCi17Ci0gICAgaWYgKG5ld19zdHlsZV9kcml2ZXIpIHsKLQljbG9zZShwcHBfZmQpOwotCXBwcF9mZCA9IC0xOwotCWlmIChkZW1hbmQpIHsKLQkgICAgbW9kaWZ5X2ZsYWdzKHBwcF9kZXZfZmQsIDAsIFNDX0xPT1BfVFJBRkZJQyk7Ci0JICAgIGxvb3BlZCA9IDE7Ci0JfSBlbHNlIGlmICghZG9pbmdfbXVsdGlsaW5rICYmIHBwcF9kZXZfZmQgPj0gMCkgewotCSAgICBjbG9zZShwcHBfZGV2X2ZkKTsKLQkgICAgcmVtb3ZlX2ZkKHBwcF9kZXZfZmQpOwotCSAgICBwcHBfZGV2X2ZkID0gLTE7Ci0JfQotICAgIH0gZWxzZSB7Ci0JLyogb2xkLXN0eWxlIGRyaXZlciAqLwotCWlmIChkZW1hbmQpCi0JICAgIHNldF9wcHBfZmQoc2xhdmVfZmQpOwotCWVsc2UKLQkgICAgcHBwX2Rldl9mZCA9IC0xOwotICAgIH0KLX0KLQotLyoKLSAqIG1ha2VfcHBwX3VuaXQgLSBtYWtlIGEgbmV3IHBwcCB1bml0IGZvciBwcHBfZGV2X2ZkLgotICogQXNzdW1lcyBuZXdfc3R5bGVfZHJpdmVyLgotICovCi1zdGF0aWMgaW50IG1ha2VfcHBwX3VuaXQoKQotewotCWludCB4LCBmbGFnczsKLQotCWlmIChwcHBfZGV2X2ZkID49IDApIHsKLQkJZGJnbG9nKCJpbiBtYWtlX3BwcF91bml0LCBhbHJlYWR5IGhhZCAvZGV2L3BwcCBvcGVuPyIpOwotCQljbG9zZShwcHBfZGV2X2ZkKTsKLQl9Ci0JcHBwX2Rldl9mZCA9IG9wZW4oIi9kZXYvcHBwIiwgT19SRFdSKTsKLQlpZiAocHBwX2Rldl9mZCA8IDApCi0JCWZhdGFsKCJDb3VsZG4ndCBvcGVuIC9kZXYvcHBwOiAlbSIpOwotCWZsYWdzID0gZmNudGwocHBwX2Rldl9mZCwgRl9HRVRGTCk7Ci0JaWYgKGZsYWdzID09IC0xCi0JICAgIHx8IGZjbnRsKHBwcF9kZXZfZmQsIEZfU0VURkwsIGZsYWdzIHwgT19OT05CTE9DSykgPT0gLTEpCi0JCXdhcm4oIkNvdWxkbid0IHNldCAvZGV2L3BwcCB0byBub25ibG9jazogJW0iKTsKLQotCWlmdW5pdCA9IHJlcV91bml0OwotCXggPSBpb2N0bChwcHBfZGV2X2ZkLCBQUFBJT0NORVdVTklULCAmaWZ1bml0KTsKLQlpZiAoeCA8IDAgJiYgcmVxX3VuaXQgPj0gMCAmJiBlcnJubyA9PSBFRVhJU1QpIHsKLQkJd2FybigiQ291bGRuJ3QgYWxsb2NhdGUgUFBQIHVuaXQgJWQgYXMgaXQgaXMgYWxyZWFkeSBpbiB1c2UiLCByZXFfdW5pdCk7Ci0JCWlmdW5pdCA9IC0xOwotCQl4ID0gaW9jdGwocHBwX2Rldl9mZCwgUFBQSU9DTkVXVU5JVCwgJmlmdW5pdCk7Ci0JfQotCWlmICh4IDwgMCkKLQkJZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBuZXcgcHBwIHVuaXQ6ICVtIik7Ci0JcmV0dXJuIHg7Ci19Ci0KLS8qCi0gKiBjZmdfYnVuZGxlIC0gY29uZmlndXJlIHRoZSBleGlzdGluZyBidW5kbGUuCi0gKiBVc2VkIGluIGRlbWFuZCBtb2RlLgotICovCi12b2lkIGNmZ19idW5kbGUoaW50IG1ycnUsIGludCBtdHJ1LCBpbnQgcnNzbiwgaW50IHRzc24pCi17Ci0JaWYgKCFuZXdfc3R5bGVfZHJpdmVyKQotCQlyZXR1cm47Ci0KLQkvKiBzZXQgdGhlIG1ycnUsIG10dSBhbmQgZmxhZ3MgKi8KLQlpZiAoaW9jdGwocHBwX2Rldl9mZCwgUFBQSU9DU01SUlUsICZtcnJ1KSA8IDApCi0JCWVycm9yKCJDb3VsZG4ndCBzZXQgTVJSVTogJW0iKTsKLQotCW1vZGlmeV9mbGFncyhwcHBfZGV2X2ZkLCBTQ19NUF9TSE9SVFNFUXxTQ19NUF9YU0hPUlRTRVF8U0NfTVVMVElMSU5LLAotCQkgICAgICgocnNzbj8gU0NfTVBfU0hPUlRTRVE6IDApIHwgKHRzc24/IFNDX01QX1hTSE9SVFNFUTogMCkKLQkJICAgICAgfCAobXJydT8gU0NfTVVMVElMSU5LOiAwKSkpOwotCi0JLyogY29ubmVjdCB1cCB0aGUgY2hhbm5lbCAqLwotCWlmIChpb2N0bChwcHBfZmQsIFBQUElPQ0NPTk5FQ1QsICZpZnVuaXQpIDwgMCkKLQkJZmF0YWwoIkNvdWxkbid0IGF0dGFjaCB0byBQUFAgdW5pdCAlZDogJW0iLCBpZnVuaXQpOwotCWFkZF9mZChwcHBfZGV2X2ZkKTsKLX0KLQotLyoKLSAqIG1ha2VfbmV3X2J1bmRsZSAtIGNyZWF0ZSBhIG5ldyBQUFAgdW5pdCAoaS5lLiBhIGJ1bmRsZSkKLSAqIGFuZCBjb25uZWN0IG91ciBjaGFubmVsIHRvIGl0LiAgVGhpcyBzaG91bGQgb25seSBnZXQgY2FsbGVkCi0gKiBpZiBgbXVsdGlsaW5rJyB3YXMgc2V0IGF0IHRoZSB0aW1lIGVzdGFibGlzaF9wcHAgd2FzIGNhbGxlZC4KLSAqIEluIGRlbWFuZCBtb2RlIHRoaXMgdXNlcyBvdXIgZXhpc3RpbmcgYnVuZGxlIGluc3RlYWQgb2YgbWFraW5nCi0gKiBhIG5ldyBvbmUuCi0gKi8KLXZvaWQgbWFrZV9uZXdfYnVuZGxlKGludCBtcnJ1LCBpbnQgbXRydSwgaW50IHJzc24sIGludCB0c3NuKQotewotCWlmICghbmV3X3N0eWxlX2RyaXZlcikKLQkJcmV0dXJuOwotCi0JLyogbWFrZSB1cyBhIHBwcCB1bml0ICovCi0JaWYgKG1ha2VfcHBwX3VuaXQoKSA8IDApCi0JCWRpZSgxKTsKLQotCS8qIHNldCB0aGUgbXJydSBhbmQgZmxhZ3MgKi8KLQljZmdfYnVuZGxlKG1ycnUsIG10cnUsIHJzc24sIHRzc24pOwotfQotCi0vKgotICogYnVuZGxlX2F0dGFjaCAtIGF0dGFjaCBvdXIgbGluayB0byBhIGdpdmVuIFBQUCB1bml0LgotICogV2UgYXNzdW1lIHRoZSB1bml0IGlzIGNvbnRyb2xsZWQgYnkgYW5vdGhlciBwcHBkLgotICovCi1pbnQgYnVuZGxlX2F0dGFjaChpbnQgaWZudW0pCi17Ci0JaW50IG1hc3Rlcl9mZDsKLQotCWlmICghbmV3X3N0eWxlX2RyaXZlcikKLQkJcmV0dXJuIC0xOwotCi0JbWFzdGVyX2ZkID0gb3BlbigiL2Rldi9wcHAiLCBPX1JEV1IpOwotCWlmIChtYXN0ZXJfZmQgPCAwKQotCQlmYXRhbCgiQ291bGRuJ3Qgb3BlbiAvZGV2L3BwcDogJW0iKTsKLQlpZiAoaW9jdGwobWFzdGVyX2ZkLCBQUFBJT0NBVFRBQ0gsICZpZm51bSkgPCAwKSB7Ci0JCWlmIChlcnJubyA9PSBFTlhJTykgewotCQkJY2xvc2UobWFzdGVyX2ZkKTsKLQkJCXJldHVybiAwOwkvKiBkb2Vzbid0IHN0aWxsIGV4aXN0ICovCi0JCX0KLQkJZmF0YWwoIkNvdWxkbid0IGF0dGFjaCB0byBpbnRlcmZhY2UgdW5pdCAlZDogJW1cbiIsIGlmbnVtKTsKLQl9Ci0JaWYgKGlvY3RsKHBwcF9mZCwgUFBQSU9DQ09OTkVDVCwgJmlmbnVtKSA8IDApCi0JCWZhdGFsKCJDb3VsZG4ndCBjb25uZWN0IHRvIGludGVyZmFjZSB1bml0ICVkOiAlbSIsIGlmbnVtKTsKLQltb2RpZnlfZmxhZ3MobWFzdGVyX2ZkLCAwLCBTQ19NVUxUSUxJTkspOwotCWNsb3NlKG1hc3Rlcl9mZCk7Ci0KLQlpZnVuaXQgPSBpZm51bTsKLQlyZXR1cm4gMTsKLX0KLQotLyoKLSAqIGRlc3Ryb3lfYnVuZGxlIC0gdGVsbCB0aGUgZHJpdmVyIHRvIGRlc3Ryb3kgb3VyIGJ1bmRsZS4KLSAqLwotdm9pZCBkZXN0cm95X2J1bmRsZSh2b2lkKQotewotCWlmIChwcHBfZGV2X2ZkID49IDApIHsKLQkJY2xvc2UocHBwX2Rldl9mZCk7Ci0JCXJlbW92ZV9mZChwcHBfZGV2X2ZkKTsKLQkJcHBwX2Rldl9mZCA9IC0xOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogY2xlYW5fY2hlY2sgLSBGZXRjaCB0aGUgZmxhZ3MgZm9yIHRoZSBkZXZpY2UgYW5kIGdlbmVyYXRlCi0gKiBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlcy4KLSAqLwotdm9pZCBjbGVhbl9jaGVjayh2b2lkKQotewotICAgIGludCB4OwotICAgIGNoYXIgKnM7Ci0KLSAgICBpZiAoc3RpbGxfcHBwKCkpIHsKLQlpZiAoaW9jdGwocHBwX2ZkLCBQUFBJT0NHRkxBR1MsIChjYWRkcl90KSAmeCkgPT0gMCkgewotCSAgICBzID0gTlVMTDsKLQkgICAgc3dpdGNoICh+eCAmIChTQ19SQ1ZfQjdfMHxTQ19SQ1ZfQjdfMXxTQ19SQ1ZfRVZOUHxTQ19SQ1ZfT0REUCkpIHsKLQkgICAgY2FzZSBTQ19SQ1ZfQjdfMDoKLQkJcyA9ICJhbGwgaGFkIGJpdCA3IHNldCB0byAxIjsKLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSBTQ19SQ1ZfQjdfMToKLQkJcyA9ICJhbGwgaGFkIGJpdCA3IHNldCB0byAwIjsKLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSBTQ19SQ1ZfRVZOUDoKLQkJcyA9ICJhbGwgaGFkIG9kZCBwYXJpdHkiOwotCQlicmVhazsKLQotCSAgICBjYXNlIFNDX1JDVl9PRERQOgotCQlzID0gImFsbCBoYWQgZXZlbiBwYXJpdHkiOwotCQlicmVhazsKLQkgICAgfQotCi0JICAgIGlmIChzICE9IE5VTEwpIHsKLQkJd2FybigiUmVjZWl2ZSBzZXJpYWwgbGluayBpcyBub3QgOC1iaXQgY2xlYW46Iik7Ci0JCXdhcm4oIlByb2JsZW06ICVzIiwgcyk7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0KLS8qCi0gKiBMaXN0IG9mIHZhbGlkIHNwZWVkcy4KLSAqLwotCi1zdHJ1Y3Qgc3BlZWQgewotICAgIGludCBzcGVlZF9pbnQsIHNwZWVkX3ZhbDsKLX0gc3BlZWRzW10gPSB7Ci0jaWZkZWYgQjUwCi0gICAgeyA1MCwgQjUwIH0sCi0jZW5kaWYKLSNpZmRlZiBCNzUKLSAgICB7IDc1LCBCNzUgfSwKLSNlbmRpZgotI2lmZGVmIEIxMTAKLSAgICB7IDExMCwgQjExMCB9LAotI2VuZGlmCi0jaWZkZWYgQjEzNAotICAgIHsgMTM0LCBCMTM0IH0sCi0jZW5kaWYKLSNpZmRlZiBCMTUwCi0gICAgeyAxNTAsIEIxNTAgfSwKLSNlbmRpZgotI2lmZGVmIEIyMDAKLSAgICB7IDIwMCwgQjIwMCB9LAotI2VuZGlmCi0jaWZkZWYgQjMwMAotICAgIHsgMzAwLCBCMzAwIH0sCi0jZW5kaWYKLSNpZmRlZiBCNjAwCi0gICAgeyA2MDAsIEI2MDAgfSwKLSNlbmRpZgotI2lmZGVmIEIxMjAwCi0gICAgeyAxMjAwLCBCMTIwMCB9LAotI2VuZGlmCi0jaWZkZWYgQjE4MDAKLSAgICB7IDE4MDAsIEIxODAwIH0sCi0jZW5kaWYKLSNpZmRlZiBCMjAwMAotICAgIHsgMjAwMCwgQjIwMDAgfSwKLSNlbmRpZgotI2lmZGVmIEIyNDAwCi0gICAgeyAyNDAwLCBCMjQwMCB9LAotI2VuZGlmCi0jaWZkZWYgQjM2MDAKLSAgICB7IDM2MDAsIEIzNjAwIH0sCi0jZW5kaWYKLSNpZmRlZiBCNDgwMAotICAgIHsgNDgwMCwgQjQ4MDAgfSwKLSNlbmRpZgotI2lmZGVmIEI3MjAwCi0gICAgeyA3MjAwLCBCNzIwMCB9LAotI2VuZGlmCi0jaWZkZWYgQjk2MDAKLSAgICB7IDk2MDAsIEI5NjAwIH0sCi0jZW5kaWYKLSNpZmRlZiBCMTkyMDAKLSAgICB7IDE5MjAwLCBCMTkyMDAgfSwKLSNlbmRpZgotI2lmZGVmIEIzODQwMAotICAgIHsgMzg0MDAsIEIzODQwMCB9LAotI2VuZGlmCi0jaWZkZWYgQjU3NjAwCi0gICAgeyA1NzYwMCwgQjU3NjAwIH0sCi0jZW5kaWYKLSNpZmRlZiBCNzY4MDAKLSAgICB7IDc2ODAwLCBCNzY4MDAgfSwKLSNlbmRpZgotI2lmZGVmIEIxMTUyMDAKLSAgICB7IDExNTIwMCwgQjExNTIwMCB9LAotI2VuZGlmCi0jaWZkZWYgRVhUQQotICAgIHsgMTkyMDAsIEVYVEEgfSwKLSNlbmRpZgotI2lmZGVmIEVYVEIKLSAgICB7IDM4NDAwLCBFWFRCIH0sCi0jZW5kaWYKLSNpZmRlZiBCMjMwNDAwCi0gICAgeyAyMzA0MDAsIEIyMzA0MDAgfSwKLSNlbmRpZgotI2lmZGVmIEI0NjA4MDAKLSAgICB7IDQ2MDgwMCwgQjQ2MDgwMCB9LAotI2VuZGlmCi0jaWZkZWYgQjkyMTYwMAotICAgIHsgOTIxNjAwLCBCOTIxNjAwIH0sCi0jZW5kaWYKLSNpZmRlZiBCMTAwMDAwMAotICAgIHsgMTAwMDAwMCwgQjEwMDAwMDAgfSwKLSNlbmRpZgotI2lmZGVmIEIxMTUyMDAwCi0gICAgeyAxMTUyMDAwLCBCMTE1MjAwMCB9LAotI2VuZGlmCi0jaWZkZWYgQjE1MDAwMDAKLSAgICB7IDE1MDAwMDAsIEIxNTAwMDAwIH0sCi0jZW5kaWYKLSNpZmRlZiBCMjAwMDAwMAotICAgIHsgMjAwMDAwMCwgQjIwMDAwMDAgfSwKLSNlbmRpZgotI2lmZGVmIEIyNTAwMDAwCi0gICAgeyAyNTAwMDAwLCBCMjUwMDAwMCB9LAotI2VuZGlmCi0jaWZkZWYgQjMwMDAwMDAKLSAgICB7IDMwMDAwMDAsIEIzMDAwMDAwIH0sCi0jZW5kaWYKLSNpZmRlZiBCMzUwMDAwMAotICAgIHsgMzUwMDAwMCwgQjM1MDAwMDAgfSwKLSNlbmRpZgotI2lmZGVmIEI0MDAwMDAwCi0gICAgeyA0MDAwMDAwLCBCNDAwMDAwMCB9LAotI2VuZGlmCi0gICAgeyAwLCAwIH0KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRyYW5zbGF0ZSBmcm9tIGJpdHMvc2Vjb25kIHRvIGEgc3BlZWRfdC4KLSAqLwotCi1zdGF0aWMgaW50IHRyYW5zbGF0ZV9zcGVlZCAoaW50IGJwcykKLXsKLSAgICBzdHJ1Y3Qgc3BlZWQgKnNwZWVkcDsKLQotICAgIGlmIChicHMgIT0gMCkgewotCWZvciAoc3BlZWRwID0gc3BlZWRzOyBzcGVlZHAtPnNwZWVkX2ludDsgc3BlZWRwKyspIHsKLQkgICAgaWYgKGJwcyA9PSBzcGVlZHAtPnNwZWVkX2ludCkKLQkJcmV0dXJuIHNwZWVkcC0+c3BlZWRfdmFsOwotCX0KLQl3YXJuKCJzcGVlZCAlZCBub3Qgc3VwcG9ydGVkIiwgYnBzKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRyYW5zbGF0ZSBmcm9tIGEgc3BlZWRfdCB0byBiaXRzL3NlY29uZC4KLSAqLwotCi1zdGF0aWMgaW50IGJhdWRfcmF0ZV9vZiAoaW50IHNwZWVkKQotewotICAgIHN0cnVjdCBzcGVlZCAqc3BlZWRwOwotCi0gICAgaWYgKHNwZWVkICE9IDApIHsKLQlmb3IgKHNwZWVkcCA9IHNwZWVkczsgc3BlZWRwLT5zcGVlZF9pbnQ7IHNwZWVkcCsrKSB7Ci0JICAgIGlmIChzcGVlZCA9PSBzcGVlZHAtPnNwZWVkX3ZhbCkKLQkJcmV0dXJuIHNwZWVkcC0+c3BlZWRfaW50OwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIHNldF91cF90dHk6IFNldCB1cCB0aGUgc2VyaWFsIHBvcnQgb24gYGZkJyBmb3IgOCBiaXRzLCBubyBwYXJpdHksCi0gKiBhdCB0aGUgcmVxdWVzdGVkIHNwZWVkLCBldGMuICBJZiBgbG9jYWwnIGlzIHRydWUsIHNldCBDTE9DQUwKLSAqIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgbW9kZW0gb3B0aW9uIHdhcyBzcGVjaWZpZWQuCi0gKi8KLQotdm9pZCBzZXRfdXBfdHR5KGludCB0dHlfZmQsIGludCBsb2NhbCkKLXsKLSAgICBpbnQgc3BlZWQ7Ci0gICAgc3RydWN0IHRlcm1pb3MgdGlvczsKLQotICAgIHNldGR0cih0dHlfZmQsIDEpOwotICAgIGlmICh0Y2dldGF0dHIodHR5X2ZkLCAmdGlvcykgPCAwKSB7Ci0JaWYgKCFva19lcnJvcihlcnJubykpCi0JICAgIGZhdGFsKCJ0Y2dldGF0dHI6ICVtIChsaW5lICVkKSIsIF9fTElORV9fKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFyZXN0b3JlX3Rlcm0pCi0JaW5pdHRlcm1pb3MgPSB0aW9zOwotCi0gICAgdGlvcy5jX2NmbGFnICAgICAmPSB+KENTSVpFIHwgQ1NUT1BCIHwgUEFSRU5CIHwgQ0xPQ0FMKTsKLSAgICB0aW9zLmNfY2ZsYWcgICAgIHw9IENTOCB8IENSRUFEIHwgSFVQQ0w7Ci0KLSAgICB0aW9zLmNfaWZsYWcgICAgICA9IElHTkJSSyB8IElHTlBBUjsKLSAgICB0aW9zLmNfb2ZsYWcgICAgICA9IDA7Ci0gICAgdGlvcy5jX2xmbGFnICAgICAgPSAwOwotICAgIHRpb3MuY19jY1tWTUlOXSAgID0gMTsKLSAgICB0aW9zLmNfY2NbVlRJTUVdICA9IDA7Ci0KLSAgICBpZiAobG9jYWwgfHwgIW1vZGVtKQotCXRpb3MuY19jZmxhZyBePSAoQ0xPQ0FMIHwgSFVQQ0wpOwotCi0gICAgc3dpdGNoIChjcnRzY3RzKSB7Ci0gICAgY2FzZSAxOgotCXRpb3MuY19jZmxhZyB8PSBDUlRTQ1RTOwotCWJyZWFrOwotCi0gICAgY2FzZSAtMjoKLQl0aW9zLmNfaWZsYWcgICAgIHw9IElYT04gfCBJWE9GRjsKLQl0aW9zLmNfY2NbVlNUT1BdICA9IDB4MTM7CS8qIERDMyA9IFhPRkYgPSBeUyAqLwotCXRpb3MuY19jY1tWU1RBUlRdID0gMHgxMTsJLyogREMxID0gWE9OICA9IF5RICovCi0JYnJlYWs7Ci0KLSAgICBjYXNlIC0xOgotCXRpb3MuY19jZmxhZyAmPSB+Q1JUU0NUUzsKLQlicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0JYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKHN0b3BfYml0cyA+PSAyKQotCXRpb3MuY19jZmxhZyB8PSBDU1RPUEI7Ci0KLSAgICBzcGVlZCA9IHRyYW5zbGF0ZV9zcGVlZChpbnNwZWVkKTsKLSAgICBpZiAoc3BlZWQpIHsKLQljZnNldG9zcGVlZCAoJnRpb3MsIHNwZWVkKTsKLQljZnNldGlzcGVlZCAoJnRpb3MsIHNwZWVkKTsKLSAgICB9Ci0vKgotICogV2UgY2FuJ3QgcHJvY2VlZCBpZiB0aGUgc2VyaWFsIHBvcnQgc3BlZWQgaXMgQjAsCi0gKiBzaW5jZSB0aGF0IGltcGxpZXMgdGhhdCB0aGUgc2VyaWFsIHBvcnQgaXMgZGlzYWJsZWQuCi0gKi8KLSAgICBlbHNlIHsKLQlzcGVlZCA9IGNmZ2V0b3NwZWVkKCZ0aW9zKTsKLQlpZiAoc3BlZWQgPT0gQjApCi0JICAgIGZhdGFsKCJCYXVkIHJhdGUgZm9yICVzIGlzIDA7IG5lZWQgZXhwbGljaXQgYmF1ZCByYXRlIiwgZGV2bmFtKTsKLSAgICB9Ci0KLSAgICB3aGlsZSAodGNzZXRhdHRyKHR0eV9mZCwgVENTQUZMVVNILCAmdGlvcykgPCAwICYmICFva19lcnJvcihlcnJubykpCi0JaWYgKGVycm5vICE9IEVJTlRSKQotCSAgICBmYXRhbCgidGNzZXRhdHRyOiAlbSAobGluZSAlZCkiLCBfX0xJTkVfXyk7Ci0KLSAgICBiYXVkX3JhdGUgICAgPSBiYXVkX3JhdGVfb2Yoc3BlZWQpOwotICAgIHJlc3RvcmVfdGVybSA9IDE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIHNldGR0ciAtIGNvbnRyb2wgdGhlIERUUiBsaW5lIG9uIHRoZSBzZXJpYWwgcG9ydC4KLSAqIFRoaXMgaXMgY2FsbGVkIGZyb20gZGllKCksIHNvIGl0IHNob3VsZG4ndCBjYWxsIGRpZSgpLgotICovCi0KLXZvaWQgc2V0ZHRyIChpbnQgdHR5X2ZkLCBpbnQgb24pCi17Ci0gICAgaW50IG1vZGVtYml0cyA9IFRJT0NNX0RUUjsKLQotICAgIGlvY3RsKHR0eV9mZCwgKG9uID8gVElPQ01CSVMgOiBUSU9DTUJJQyksICZtb2RlbWJpdHMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiByZXN0b3JlX3R0eSAtIHJlc3RvcmUgdGhlIHRlcm1pbmFsIHRvIHRoZSBzYXZlZCBzZXR0aW5ncy4KLSAqLwotCi12b2lkIHJlc3RvcmVfdHR5IChpbnQgdHR5X2ZkKQotewotICAgIGlmIChyZXN0b3JlX3Rlcm0pIHsKLQlyZXN0b3JlX3Rlcm0gPSAwOwotLyoKLSAqIFR1cm4gb2ZmIGVjaG9pbmcsIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIGNhbiBnZXQgaW50bwotICogYSBsb29wIHdpdGggdGhlIHR0eSBhbmQgdGhlIG1vZGVtIGVjaG9pbmcgdG8gZWFjaCBvdGhlci4KLSAqIFdlIHByZXN1bWUgd2UgYXJlIHRoZSBzb2xlIHVzZXIgb2YgdGhpcyB0dHkgZGV2aWNlLCBzbwotICogd2hlbiB3ZSBjbG9zZSBpdCwgaXQgd2lsbCByZXZlcnQgdG8gaXRzIGRlZmF1bHRzIGFueXdheS4KLSAqLwotCWlmICghZGVmYXVsdF9kZXZpY2UpCi0JICAgIGluaXR0ZXJtaW9zLmNfbGZsYWcgJj0gfihFQ0hPIHwgRUNIT05MKTsKLQotCWlmICh0Y3NldGF0dHIodHR5X2ZkLCBUQ1NBRkxVU0gsICZpbml0dGVybWlvcykgPCAwKSB7Ci0JICAgIGlmICghIG9rX2Vycm9yIChlcnJubykpCi0JCXdhcm4oInRjc2V0YXR0cjogJW0gKGxpbmUgJWQpIiwgX19MSU5FX18pOwotCX0KLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIG91dHB1dCAtIE91dHB1dCBQUFAgcGFja2V0LgotICovCi0KLV9fYXR0cmlidXRlKCh3ZWFrKSkgdm9pZCBvdXRwdXQgKGludCB1bml0LCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGVuKQotewotICAgIGludCBmZCA9IHBwcF9mZDsKLSAgICBpbnQgcHJvdG87Ci0KLSAgICBkdW1wX3BhY2tldCgic2VudCIsIHAsIGxlbik7Ci0gICAgaWYgKHNub29wX3NlbmRfaG9vaykgc25vb3Bfc2VuZF9ob29rKHAsIGxlbik7Ci0KLSAgICBpZiAobGVuIDwgUFBQX0hEUkxFTikKLQlyZXR1cm47Ci0gICAgaWYgKG5ld19zdHlsZV9kcml2ZXIpIHsKLQlwICs9IDI7Ci0JbGVuIC09IDI7Ci0JcHJvdG8gPSAocFswXSA8PCA4KSArIHBbMV07Ci0JaWYgKHBwcF9kZXZfZmQgPj0gMCAmJiAhKHByb3RvID49IDB4YzAwMCB8fCBwcm90byA9PSBQUFBfQ0NQRlJBRykpCi0JICAgIGZkID0gcHBwX2Rldl9mZDsKLSAgICB9Ci0gICAgaWYgKHdyaXRlKGZkLCBwLCBsZW4pIDwgMCkgewotCWlmIChlcnJubyA9PSBFV09VTERCTE9DSyB8fCBlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRU5PQlVGUwotCSAgICB8fCBlcnJubyA9PSBFTlhJTyB8fCBlcnJubyA9PSBFSU8gfHwgZXJybm8gPT0gRUlOVFIpCi0JICAgIHdhcm4oIndyaXRlOiB3YXJuaW5nOiAlbSAoJWQpIiwgZXJybm8pOwotCWVsc2UKLQkgICAgZXJyb3IoIndyaXRlOiAlbSAoJWQpIiwgZXJybm8pOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogd2FpdF9pbnB1dCAtIHdhaXQgdW50aWwgdGhlcmUgaXMgZGF0YSBhdmFpbGFibGUsCi0gKiBmb3IgdGhlIGxlbmd0aCBvZiB0aW1lIHNwZWNpZmllZCBieSAqdGltbyAoaW5kZWZpbml0ZQotICogaWYgdGltbyBpcyBOVUxMKS4KLSAqLwotCi12b2lkIHdhaXRfaW5wdXQoc3RydWN0IHRpbWV2YWwgKnRpbW8pCi17Ci0gICAgZmRfc2V0IHJlYWR5LCBleGM7Ci0gICAgaW50IG47Ci0KLSAgICByZWFkeSA9IGluX2ZkczsKLSAgICBleGMgPSBpbl9mZHM7Ci0gICAgbiA9IHNlbGVjdChtYXhfaW5fZmQgKyAxLCAmcmVhZHksIE5VTEwsICZleGMsIHRpbW8pOwotICAgIGlmIChuIDwgMCAmJiBlcnJubyAhPSBFSU5UUikKLQlmYXRhbCgic2VsZWN0OiAlbSIpOwotfQotCi0vKgotICogYWRkX2ZkIC0gYWRkIGFuIGZkIHRvIHRoZSBzZXQgdGhhdCB3YWl0X2lucHV0IHdhaXRzIGZvci4KLSAqLwotdm9pZCBhZGRfZmQoaW50IGZkKQotewotICAgIGlmIChmZCA+PSBGRF9TRVRTSVpFKQotCWZhdGFsKCJpbnRlcm5hbCBlcnJvcjogZmlsZSBkZXNjcmlwdG9yIHRvbyBsYXJnZSAoJWQpIiwgZmQpOwotICAgIEZEX1NFVChmZCwgJmluX2Zkcyk7Ci0gICAgaWYgKGZkID4gbWF4X2luX2ZkKQotCW1heF9pbl9mZCA9IGZkOwotfQotCi0vKgotICogcmVtb3ZlX2ZkIC0gcmVtb3ZlIGFuIGZkIGZyb20gdGhlIHNldCB0aGF0IHdhaXRfaW5wdXQgd2FpdHMgZm9yLgotICovCi12b2lkIHJlbW92ZV9mZChpbnQgZmQpCi17Ci0gICAgRkRfQ0xSKGZkLCAmaW5fZmRzKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiByZWFkX3BhY2tldCAtIGdldCBhIFBQUCBwYWNrZXQgZnJvbSB0aGUgc2VyaWFsIGRldmljZS4KLSAqLwotCi1pbnQgcmVhZF9wYWNrZXQgKHVuc2lnbmVkIGNoYXIgKmJ1ZikKLXsKLSAgICBpbnQgbGVuLCBucjsKLQotICAgIGxlbiA9IFBQUF9NUlUgKyBQUFBfSERSTEVOOwotICAgIGlmIChuZXdfc3R5bGVfZHJpdmVyKSB7Ci0JKmJ1ZisrID0gUFBQX0FMTFNUQVRJT05TOwotCSpidWYrKyA9IFBQUF9VSTsKLQlsZW4gLT0gMjsKLSAgICB9Ci0gICAgbnIgPSAtMTsKLQotICAgIGlmIChwcHBfZmQgPj0gMCkgewotCW5yID0gcmVhZChwcHBfZmQsIGJ1ZiwgbGVuKTsKLQlpZiAobnIgPCAwICYmIGVycm5vICE9IEVXT1VMREJMT0NLICYmIGVycm5vICE9IEVBR0FJTgotCSAgICAmJiBlcnJubyAhPSBFSU8gJiYgZXJybm8gIT0gRUlOVFIpCi0JICAgIGVycm9yKCJyZWFkOiAlbSIpOwotCWlmIChuciA8IDAgJiYgZXJybm8gPT0gRU5YSU8pCi0JICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAobnIgPCAwICYmIG5ld19zdHlsZV9kcml2ZXIgJiYgcHBwX2Rldl9mZCA+PSAwICYmICFidW5kbGVfZW9mKSB7Ci0JLyogTi5CLiB3ZSByZWFkIHBwcF9mZCBmaXJzdCBzaW5jZSBMQ1AgcGFja2V0cyBjb21lIGluIHRoZXJlLiAqLwotCW5yID0gcmVhZChwcHBfZGV2X2ZkLCBidWYsIGxlbik7Ci0JaWYgKG5yIDwgMCAmJiBlcnJubyAhPSBFV09VTERCTE9DSyAmJiBlcnJubyAhPSBFQUdBSU4KLQkgICAgJiYgZXJybm8gIT0gRUlPICYmIGVycm5vICE9IEVJTlRSKQotCSAgICBlcnJvcigicmVhZCAvZGV2L3BwcDogJW0iKTsKLQlpZiAobnIgPCAwICYmIGVycm5vID09IEVOWElPKQotCSAgICBuciA9IDA7Ci0JaWYgKG5yID09IDAgJiYgZG9pbmdfbXVsdGlsaW5rKSB7Ci0JICAgIHJlbW92ZV9mZChwcHBfZGV2X2ZkKTsKLQkgICAgYnVuZGxlX2VvZiA9IDE7Ci0JfQotICAgIH0KLSAgICBpZiAobmV3X3N0eWxlX2RyaXZlciAmJiBwcHBfZmQgPCAwICYmIHBwcF9kZXZfZmQgPCAwKQotCW5yID0gMDsKLSAgICByZXR1cm4gKG5ld19zdHlsZV9kcml2ZXIgJiYgbnIgPiAwKT8gbnIrMjogbnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIGdldF9sb29wX291dHB1dCAtIGdldCBvdXRnb2luZyBwYWNrZXRzIGZyb20gdGhlIHBwcCBkZXZpY2UsCi0gKiBhbmQgZGV0ZWN0IHdoZW4gd2Ugd2FudCB0byBicmluZyB0aGUgcmVhbCBsaW5rIHVwLgotICogUmV0dXJuIHZhbHVlIGlzIDEgaWYgd2UgbmVlZCB0byBicmluZyB1cCB0aGUgbGluaywgMCBvdGhlcndpc2UuCi0gKi8KLWludAotZ2V0X2xvb3Bfb3V0cHV0KHZvaWQpCi17Ci0gICAgaW50IHJ2ID0gMDsKLSAgICBpbnQgbjsKLQotICAgIGlmIChuZXdfc3R5bGVfZHJpdmVyKSB7Ci0Jd2hpbGUgKChuID0gcmVhZF9wYWNrZXQoaW5wYWNrZXRfYnVmKSkgPiAwKQotCSAgICBpZiAobG9vcF9mcmFtZShpbnBhY2tldF9idWYsIG4pKQotCQlydiA9IDE7Ci0JcmV0dXJuIHJ2OwotICAgIH0KLQotICAgIHdoaWxlICgobiA9IHJlYWQobWFzdGVyX2ZkLCBpbmJ1Ziwgc2l6ZW9mKGluYnVmKSkpID4gMCkKLQlpZiAobG9vcF9jaGFycyhpbmJ1ZiwgbikpCi0JICAgIHJ2ID0gMTsKLQotICAgIGlmIChuID09IDApCi0JZmF0YWwoImVvZiBvbiBsb29wYmFjayIpOwotCi0gICAgaWYgKGVycm5vICE9IEVXT1VMREJMT0NLICYmIGVycm5vICE9IEVBR0FJTikKLQlmYXRhbCgicmVhZCBmcm9tIGxvb3BiYWNrOiAlbSglZCkiLCBlcnJubyk7Ci0KLSAgICByZXR1cm4gcnY7Ci19Ci0KLS8qCi0gKiBuZXRpZl9zZXRfbXR1IC0gc2V0IHRoZSBNVFUgb24gdGhlIFBQUCBuZXR3b3JrIGludGVyZmFjZS4KLSAqLwotdm9pZAotbmV0aWZfc2V0X210dShpbnQgdW5pdCwgaW50IG10dSkKLXsKLSAgICBzdHJ1Y3QgaWZyZXEgaWZyOwotCi0gICAgbWVtc2V0ICgmaWZyLCAnXDAnLCBzaXplb2YgKGlmcikpOwotICAgIHN0cmxjcHkoaWZyLmlmcl9uYW1lLCBpZm5hbWUsIHNpemVvZiAoaWZyLmlmcl9uYW1lKSk7Ci0gICAgaWZyLmlmcl9tdHUgPSBtdHU7Ci0KLSAgICBpZiAoaWZ1bml0ID49IDAgJiYgaW9jdGwoc29ja19mZCwgU0lPQ1NJRk1UVSwgKGNhZGRyX3QpICZpZnIpIDwgMCkKLQllcnJvcigiaW9jdGwoU0lPQ1NJRk1UVSk6ICVtIChsaW5lICVkKSIsIF9fTElORV9fKTsKLX0KLQotLyoKLSAqIG5ldGlmX2dldF9tdHUgLSBnZXQgdGhlIE1UVSBvbiB0aGUgUFBQIG5ldHdvcmsgaW50ZXJmYWNlLgotICovCi1pbnQKLW5ldGlmX2dldF9tdHUoaW50IHVuaXQpCi17Ci0gICAgc3RydWN0IGlmcmVxIGlmcjsKLQotICAgIG1lbXNldCAoJmlmciwgJ1wwJywgc2l6ZW9mIChpZnIpKTsKLSAgICBzdHJsY3B5KGlmci5pZnJfbmFtZSwgaWZuYW1lLCBzaXplb2YgKGlmci5pZnJfbmFtZSkpOwotCi0gICAgaWYgKGlmdW5pdCA+PSAwICYmIGlvY3RsKHNvY2tfZmQsIFNJT0NHSUZNVFUsIChjYWRkcl90KSAmaWZyKSA8IDApIHsKLQllcnJvcigiaW9jdGwoU0lPQ0dJRk1UVSk6ICVtIChsaW5lICVkKSIsIF9fTElORV9fKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGlmci5pZnJfbXR1OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiB0dHlfc2VuZF9jb25maWcgLSBjb25maWd1cmUgdGhlIHRyYW5zbWl0IGNoYXJhY3RlcmlzdGljcyBvZgotICogdGhlIHBwcCBpbnRlcmZhY2UuCi0gKi8KLQotdm9pZCB0dHlfc2VuZF9jb25maWcoaW50IG10dSwgdV9pbnQzMl90IGFzeW5jbWFwLCBpbnQgcGNvbXAsIGludCBhY2NvbXApCi17Ci0JaW50IHg7Ci0KLQlpZiAoIXN0aWxsX3BwcCgpKQotCQlyZXR1cm47Ci0JbGlua19tdHUgPSBtdHU7Ci0JaWYgKGlvY3RsKHBwcF9mZCwgUFBQSU9DU0FTWU5DTUFQLCAoY2FkZHJfdCkgJmFzeW5jbWFwKSA8IDApIHsKLQkJaWYgKGVycm5vICE9IEVJTyAmJiBlcnJubyAhPSBFTk9UVFkpCi0JCQllcnJvcigiQ291bGRuJ3Qgc2V0IHRyYW5zbWl0IGFzeW5jIGNoYXJhY3RlciBtYXA6ICVtIik7Ci0JCSsrZXJyb3JfY291bnQ7Ci0JCXJldHVybjsKLQl9Ci0KLQl4ID0gKHBjb21wPyBTQ19DT01QX1BST1Q6IDApIHwgKGFjY29tcD8gU0NfQ09NUF9BQzogMCkKLQkgICAgfCAoc3luY19zZXJpYWw/IFNDX1NZTkM6IDApOwotCW1vZGlmeV9mbGFncyhwcHBfZmQsIFNDX0NPTVBfUFJPVHxTQ19DT01QX0FDfFNDX1NZTkMsIHgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiB0dHlfc2V0X3hhY2NtIC0gc2V0IHRoZSBleHRlbmRlZCB0cmFuc21pdCBBQ0NNIGZvciB0aGUgaW50ZXJmYWNlLgotICovCi0KLXZvaWQgdHR5X3NldF94YWNjbSAoZXh0X2FjY20gYWNjbSkKLXsKLSAgICBpZiAoIXN0aWxsX3BwcCgpKQotCXJldHVybjsKLSAgICBpZiAoaW9jdGwocHBwX2ZkLCBQUFBJT0NTWEFTWU5DTUFQLCBhY2NtKSA8IDAgJiYgZXJybm8gIT0gRU5PVFRZKSB7Ci0JaWYgKCAhIG9rX2Vycm9yIChlcnJubykpCi0JICAgIHdhcm4oImlvY3RsKHNldCBleHRlbmRlZCBBQ0NNKTogJW0gKGxpbmUgJWQpIiwgX19MSU5FX18pOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogdHR5X3JlY3ZfY29uZmlnIC0gY29uZmlndXJlIHRoZSByZWNlaXZlLXNpZGUgY2hhcmFjdGVyaXN0aWNzIG9mCi0gKiB0aGUgcHBwIGludGVyZmFjZS4KLSAqLwotCi12b2lkIHR0eV9yZWN2X2NvbmZpZyhpbnQgbXJ1LCB1X2ludDMyX3QgYXN5bmNtYXAsIGludCBwY29tcCwgaW50IGFjY29tcCkKLXsKLS8qCi0gKiBJZiB3ZSB3ZXJlIGNhbGxlZCBiZWNhdXNlIHRoZSBsaW5rIGhhcyBnb25lIGRvd24gdGhlbiB0aGVyZSBpcyBub3RoaW5nCi0gKiB3aGljaCBtYXkgYmUgZG9uZS4gSnVzdCByZXR1cm4gd2l0aG91dCBpbmNpZGVudC4KLSAqLwotCWlmICghc3RpbGxfcHBwKCkpCi0JCXJldHVybjsKLS8qCi0gKiBTZXQgdGhlIHJlY2VpdmVyIHBhcmFtZXRlcnMKLSAqLwotCWlmIChpb2N0bChwcHBfZmQsIFBQUElPQ1NNUlUsIChjYWRkcl90KSAmbXJ1KSA8IDApIHsKLQkJaWYgKGVycm5vICE9IEVJTyAmJiBlcnJubyAhPSBFTk9UVFkpCi0JCQllcnJvcigiQ291bGRuJ3Qgc2V0IGNoYW5uZWwgcmVjZWl2ZSBNUlU6ICVtIik7Ci0JfQotCWlmIChuZXdfc3R5bGVfZHJpdmVyICYmIHBwcF9kZXZfZmQgPj0gMAotCSAgICAmJiBpb2N0bChwcHBfZGV2X2ZkLCBQUFBJT0NTTVJVLCAoY2FkZHJfdCkgJm1ydSkgPCAwKQotCQllcnJvcigiQ291bGRuJ3Qgc2V0IE1SVSBpbiBnZW5lcmljIFBQUCBsYXllcjogJW0iKTsKLQotCWlmIChpb2N0bChwcHBfZmQsIFBQUElPQ1NSQVNZTkNNQVAsIChjYWRkcl90KSAmYXN5bmNtYXApIDwgMCkgewotCQlpZiAoZXJybm8gIT0gRUlPICYmIGVycm5vICE9IEVOT1RUWSkKLQkJCWVycm9yKCJDb3VsZG4ndCBzZXQgY2hhbm5lbCByZWNlaXZlIGFzeW5jbWFwOiAlbSIpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogY2NwX3Rlc3QgLSBhc2sga2VybmVsIHdoZXRoZXIgYSBnaXZlbiBjb21wcmVzc2lvbiBtZXRob2QKLSAqIGlzIGFjY2VwdGFibGUgZm9yIHVzZS4KLSAqLwotCi1pbnQKLWNjcF90ZXN0KGludCB1bml0LCB1X2NoYXIgKm9wdF9wdHIsIGludCBvcHRfbGVuLCBpbnQgZm9yX3RyYW5zbWl0KQotewotICAgIHN0cnVjdCBwcHBfb3B0aW9uX2RhdGEgZGF0YTsKLQotICAgIG1lbXNldCAoJmRhdGEsICdcMCcsIHNpemVvZiAoZGF0YSkpOwotICAgIGRhdGEucHRyICAgICAgPSBvcHRfcHRyOwotICAgIGRhdGEubGVuZ3RoICAgPSBvcHRfbGVuOwotICAgIGRhdGEudHJhbnNtaXQgPSBmb3JfdHJhbnNtaXQ7Ci0KLSAgICBpZiAoaW9jdGwocHBwX2Rldl9mZCwgUFBQSU9DU0NPTVBSRVNTLCAoY2FkZHJfdCkgJmRhdGEpID49IDApCi0JcmV0dXJuIDE7Ci0KLSAgICByZXR1cm4gKGVycm5vID09IEVOT0JVRlMpPyAwOiAtMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogY2NwX2ZsYWdzX3NldCAtIGluZm9ybSBrZXJuZWwgYWJvdXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgQ0NQLgotICovCi0KLXZvaWQgY2NwX2ZsYWdzX3NldCAoaW50IHVuaXQsIGludCBpc29wZW4sIGludCBpc3VwKQotewotCWludCB4OwotCi0JeCA9IChpc29wZW4/IFNDX0NDUF9PUEVOOiAwKSB8IChpc3VwPyBTQ19DQ1BfVVA6IDApOwotCWlmIChzdGlsbF9wcHAoKSAmJiBwcHBfZGV2X2ZkID49IDApCi0JCW1vZGlmeV9mbGFncyhwcHBfZGV2X2ZkLCBTQ19DQ1BfT1BFTnxTQ19DQ1BfVVAsIHgpOwotfQotCi0jaWZkZWYgUFBQX0ZJTFRFUgotLyoKLSAqIHNldF9maWx0ZXJzIC0gc2V0IHRoZSBhY3RpdmUgYW5kIHBhc3MgZmlsdGVycyBpbiB0aGUga2VybmVsIGRyaXZlci4KLSAqLwotaW50IHNldF9maWx0ZXJzKHN0cnVjdCBicGZfcHJvZ3JhbSAqcGFzcywgc3RydWN0IGJwZl9wcm9ncmFtICphY3RpdmUpCi17Ci0Jc3RydWN0IHNvY2tfZnByb2cgZnA7Ci0KLQlmcC5sZW4gPSBwYXNzLT5iZl9sZW47Ci0JZnAuZmlsdGVyID0gKHN0cnVjdCBzb2NrX2ZpbHRlciAqKSBwYXNzLT5iZl9pbnNuczsKLQlpZiAoaW9jdGwocHBwX2Rldl9mZCwgUFBQSU9DU1BBU1MsICZmcCkgPCAwKSB7Ci0JCWlmIChlcnJubyA9PSBFTk9UVFkpCi0JCQl3YXJuKCJrZXJuZWwgZG9lcyBub3Qgc3VwcG9ydCBQUFAgZmlsdGVyaW5nIik7Ci0JCWVsc2UKLQkJCWVycm9yKCJDb3VsZG4ndCBzZXQgcGFzcy1maWx0ZXIgaW4ga2VybmVsOiAlbSIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZnAubGVuID0gYWN0aXZlLT5iZl9sZW47Ci0JZnAuZmlsdGVyID0gKHN0cnVjdCBzb2NrX2ZpbHRlciAqKSBhY3RpdmUtPmJmX2luc25zOwotCWlmIChpb2N0bChwcHBfZGV2X2ZkLCBQUFBJT0NTQUNUSVZFLCAmZnApIDwgMCkgewotCQllcnJvcigiQ291bGRuJ3Qgc2V0IGFjdGl2ZS1maWx0ZXIgaW4ga2VybmVsOiAlbSIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0jZW5kaWYgLyogUFBQX0ZJTFRFUiAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBnZXRfaWRsZV90aW1lIC0gcmV0dXJuIGhvdyBsb25nIHRoZSBsaW5rIGhhcyBiZWVuIGlkbGUuCi0gKi8KLWludAotZ2V0X2lkbGVfdGltZSh1LCBpcCkKLSAgICBpbnQgdTsKLSAgICBzdHJ1Y3QgcHBwX2lkbGUgKmlwOwotewotICAgIHJldHVybiBpb2N0bChwcHBfZGV2X2ZkLCBQUFBJT0NHSURMRSwgaXApID49IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIGdldF9wcHBfc3RhdHMgLSByZXR1cm4gc3RhdGlzdGljcyBmb3IgdGhlIGxpbmsuCi0gKi8KLWludAotZ2V0X3BwcF9zdGF0cyh1LCBzdGF0cykKLSAgICBpbnQgdTsKLSAgICBzdHJ1Y3QgcHBwZF9zdGF0cyAqc3RhdHM7Ci17Ci0gICAgc3RydWN0IGlmcHBwc3RhdHNyZXEgcmVxOwotCi0gICAgbWVtc2V0ICgmcmVxLCAwLCBzaXplb2YgKHJlcSkpOwotCi0gICAgcmVxLnN0YXRzX3B0ciA9IChjYWRkcl90KSAmcmVxLnN0YXRzOwotICAgIHN0cmxjcHkocmVxLmlmcl9fbmFtZSwgaWZuYW1lLCBzaXplb2YocmVxLmlmcl9fbmFtZSkpOwotICAgIGlmIChpb2N0bChzb2NrX2ZkLCBTSU9DR1BQUFNUQVRTLCAmcmVxKSA8IDApIHsKLQllcnJvcigiQ291bGRuJ3QgZ2V0IFBQUCBzdGF0aXN0aWNzOiAlbSIpOwotCXJldHVybiAwOwotICAgIH0KLSAgICBzdGF0cy0+Ynl0ZXNfaW4gPSByZXEuc3RhdHMucC5wcHBfaWJ5dGVzOwotICAgIHN0YXRzLT5ieXRlc19vdXQgPSByZXEuc3RhdHMucC5wcHBfb2J5dGVzOwotICAgIHN0YXRzLT5wa3RzX2luID0gcmVxLnN0YXRzLnAucHBwX2lwYWNrZXRzOwotICAgIHN0YXRzLT5wa3RzX291dCA9IHJlcS5zdGF0cy5wLnBwcF9vcGFja2V0czsKLSAgICByZXR1cm4gMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogY2NwX2ZhdGFsX2Vycm9yIC0gcmV0dXJucyAxIGlmIGRlY29tcHJlc3Npb24gd2FzIGRpc2FibGVkIGFzIGEKLSAqIHJlc3VsdCBvZiBhbiBlcnJvciBkZXRlY3RlZCBhZnRlciBkZWNvbXByZXNzaW9uIG9mIGEgcGFja2V0LAotICogMCBvdGhlcndpc2UuICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIHBhdGVudCBub25zZW5zZS4KLSAqLwotCi1pbnQgY2NwX2ZhdGFsX2Vycm9yIChpbnQgdW5pdCkKLXsKLQlpbnQgZmxhZ3M7Ci0KLQlpZiAoaW9jdGwocHBwX2Rldl9mZCwgUFBQSU9DR0ZMQUdTLCAmZmxhZ3MpIDwgMCkgewotCQllcnJvcigiQ291bGRuJ3QgcmVhZCBjb21wcmVzc2lvbiBlcnJvciBmbGFnczogJW0iKTsKLQkJZmxhZ3MgPSAwOwotCX0KLQlyZXR1cm4gZmxhZ3MgJiBTQ19EQ19GRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIHBhdGhfdG9fcHJvY2ZzIC0gZmluZCB0aGUgcGF0aCB0byB0aGUgcHJvYyBmaWxlIHN5c3RlbSBtb3VudCBwb2ludAotICovCi1zdGF0aWMgY2hhciBwcm9jX3BhdGhbTUFYUEFUSExFTl07Ci1zdGF0aWMgaW50IHByb2NfcGF0aF9sZW47Ci0KLXN0YXRpYyBjaGFyICpwYXRoX3RvX3Byb2Nmcyhjb25zdCBjaGFyICp0YWlsKQotewotICAgIHN0cnVjdCBtbnRlbnQgKm1udGVudDsKLSAgICBGSUxFICpmcDsKLQotICAgIGlmIChwcm9jX3BhdGhfbGVuID09IDApIHsKLQkvKiBEZWZhdWx0IHRoZSBtb3VudCBsb2NhdGlvbiBvZiAvcHJvYyAqLwotCXN0cmxjcHkgKHByb2NfcGF0aCwgIi9wcm9jIiwgc2l6ZW9mKHByb2NfcGF0aCkpOwotCXByb2NfcGF0aF9sZW4gPSA1OwotCWZwID0gZm9wZW4oTU9VTlRFRCwgInIiKTsKLQlpZiAoZnAgIT0gTlVMTCkgewotCSAgICB3aGlsZSAoKG1udGVudCA9IGdldG1udGVudChmcCkpICE9IE5VTEwpIHsKLQkJaWYgKHN0cmNtcChtbnRlbnQtPm1udF90eXBlLCBNTlRUWVBFX0lHTk9SRSkgPT0gMCkKLQkJICAgIGNvbnRpbnVlOwotCQlpZiAoc3RyY21wKG1udGVudC0+bW50X3R5cGUsICJwcm9jIikgPT0gMCkgewotCQkgICAgc3RybGNweShwcm9jX3BhdGgsIG1udGVudC0+bW50X2Rpciwgc2l6ZW9mKHByb2NfcGF0aCkpOwotCQkgICAgcHJvY19wYXRoX2xlbiA9IHN0cmxlbihwcm9jX3BhdGgpOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgICBmY2xvc2UgKGZwKTsKLQl9Ci0gICAgfQotCi0gICAgc3RybGNweShwcm9jX3BhdGggKyBwcm9jX3BhdGhfbGVuLCB0YWlsLAotCSAgICBzaXplb2YocHJvY19wYXRoKSAtIHByb2NfcGF0aF9sZW4pOwotICAgIHJldHVybiBwcm9jX3BhdGg7Ci19Ci0KLS8qCi0gKiAvcHJvYy9uZXQvcm91dGUgcGFyc2luZyBzdHVmZi4KLSAqLwotI2RlZmluZSBST1VURV9NQVhfQ09MUwkxMgotRklMRSAqcm91dGVfZmQgPSAoRklMRSAqKSAwOwotc3RhdGljIGNoYXIgcm91dGVfYnVmZmVyWzUxMl07Ci1zdGF0aWMgaW50IHJvdXRlX2Rldl9jb2wsIHJvdXRlX2Rlc3RfY29sLCByb3V0ZV9nd19jb2w7Ci1zdGF0aWMgaW50IHJvdXRlX2ZsYWdzX2NvbCwgcm91dGVfbWFza19jb2w7Ci1zdGF0aWMgaW50IHJvdXRlX251bV9jb2xzOwotCi1zdGF0aWMgaW50IG9wZW5fcm91dGVfdGFibGUgKHZvaWQpOwotc3RhdGljIHZvaWQgY2xvc2Vfcm91dGVfdGFibGUgKHZvaWQpOwotc3RhdGljIGludCByZWFkX3JvdXRlX3RhYmxlIChzdHJ1Y3QgcnRlbnRyeSAqcnQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBjbG9zZV9yb3V0ZV90YWJsZSAtIGNsb3NlIHRoZSBpbnRlcmZhY2UgdG8gdGhlIHJvdXRlIHRhYmxlCi0gKi8KLQotc3RhdGljIHZvaWQgY2xvc2Vfcm91dGVfdGFibGUgKHZvaWQpCi17Ci0gICAgaWYgKHJvdXRlX2ZkICE9IChGSUxFICopIDApIHsKLQlmY2xvc2UgKHJvdXRlX2ZkKTsKLQlyb3V0ZV9mZCA9IChGSUxFICopIDA7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBvcGVuX3JvdXRlX3RhYmxlIC0gb3BlbiB0aGUgaW50ZXJmYWNlIHRvIHRoZSByb3V0ZSB0YWJsZQotICovCi1zdGF0aWMgY2hhciByb3V0ZV9kZWxpbXNbXSA9ICIgXHRcbiI7Ci0KLXN0YXRpYyBpbnQgb3Blbl9yb3V0ZV90YWJsZSAodm9pZCkKLXsKLSAgICBjaGFyICpwYXRoOwotCi0gICAgY2xvc2Vfcm91dGVfdGFibGUoKTsKLQotICAgIHBhdGggPSBwYXRoX3RvX3Byb2NmcygiL25ldC9yb3V0ZSIpOwotICAgIHJvdXRlX2ZkID0gZm9wZW4gKHBhdGgsICJyIik7Ci0gICAgaWYgKHJvdXRlX2ZkID09IE5VTEwpIHsKLQllcnJvcigiY2FuJ3Qgb3BlbiByb3V0aW5nIHRhYmxlICVzOiAlbSIsIHBhdGgpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIHJvdXRlX2Rldl9jb2wgPSAwOwkJLyogZGVmYXVsdCB0byB1c3VhbCBjb2x1bW5zICovCi0gICAgcm91dGVfZGVzdF9jb2wgPSAxOwotICAgIHJvdXRlX2d3X2NvbCA9IDI7Ci0gICAgcm91dGVfZmxhZ3NfY29sID0gMzsKLSAgICByb3V0ZV9tYXNrX2NvbCA9IDc7Ci0gICAgcm91dGVfbnVtX2NvbHMgPSA4OwotCi0gICAgLyogcGFyc2UgaGVhZGVyIGxpbmUgKi8KLSAgICBpZiAoZmdldHMocm91dGVfYnVmZmVyLCBzaXplb2Yocm91dGVfYnVmZmVyKSwgcm91dGVfZmQpICE9IDApIHsKLQljaGFyICpwID0gcm91dGVfYnVmZmVyLCAqcTsKLQlpbnQgY29sOwotCWZvciAoY29sID0gMDsgY29sIDwgUk9VVEVfTUFYX0NPTFM7ICsrY29sKSB7Ci0JICAgIGludCB1c2VkID0gMTsKLQkgICAgaWYgKChxID0gc3RydG9rKHAsIHJvdXRlX2RlbGltcykpID09IDApCi0JCWJyZWFrOwotCSAgICBpZiAoc3RyY2FzZWNtcChxLCAiaWZhY2UiKSA9PSAwKQotCQlyb3V0ZV9kZXZfY29sID0gY29sOwotCSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHEsICJkZXN0aW5hdGlvbiIpID09IDApCi0JCXJvdXRlX2Rlc3RfY29sID0gY29sOwotCSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHEsICJnYXRld2F5IikgPT0gMCkKLQkJcm91dGVfZ3dfY29sID0gY29sOwotCSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHEsICJmbGFncyIpID09IDApCi0JCXJvdXRlX2ZsYWdzX2NvbCA9IGNvbDsKLQkgICAgZWxzZSBpZiAoc3RyY2FzZWNtcChxLCAibWFzayIpID09IDApCi0JCXJvdXRlX21hc2tfY29sID0gY29sOwotCSAgICBlbHNlCi0JCXVzZWQgPSAwOwotCSAgICBpZiAodXNlZCAmJiBjb2wgPj0gcm91dGVfbnVtX2NvbHMpCi0JCXJvdXRlX251bV9jb2xzID0gY29sICsgMTsKLQkgICAgcCA9IE5VTEw7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiAxOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiByZWFkX3JvdXRlX3RhYmxlIC0gcmVhZCB0aGUgbmV4dCBlbnRyeSBmcm9tIHRoZSByb3V0ZSB0YWJsZQotICovCi0KLXN0YXRpYyBpbnQgcmVhZF9yb3V0ZV90YWJsZShzdHJ1Y3QgcnRlbnRyeSAqcnQpCi17Ci0gICAgY2hhciAqY29sc1tST1VURV9NQVhfQ09MU10sICpwOwotICAgIGludCBjb2w7Ci0KLSAgICBtZW1zZXQgKHJ0LCAnXDAnLCBzaXplb2YgKHN0cnVjdCBydGVudHJ5KSk7Ci0KLSAgICBpZiAoZmdldHMgKHJvdXRlX2J1ZmZlciwgc2l6ZW9mIChyb3V0ZV9idWZmZXIpLCByb3V0ZV9mZCkgPT0gKGNoYXIgKikgMCkKLQlyZXR1cm4gMDsKLQotICAgIHAgPSByb3V0ZV9idWZmZXI7Ci0gICAgZm9yIChjb2wgPSAwOyBjb2wgPCByb3V0ZV9udW1fY29sczsgKytjb2wpIHsKLQljb2xzW2NvbF0gPSBzdHJ0b2socCwgcm91dGVfZGVsaW1zKTsKLQlpZiAoY29sc1tjb2xdID09IE5VTEwpCi0JICAgIHJldHVybiAwOwkJLyogZGlkbid0IGdldCBlbm91Z2ggY29sdW1ucyAqLwotCXAgPSBOVUxMOwotICAgIH0KLQotICAgIFNJTl9BRERSKHJ0LT5ydF9kc3QpID0gc3RydG91bChjb2xzW3JvdXRlX2Rlc3RfY29sXSwgTlVMTCwgMTYpOwotICAgIFNJTl9BRERSKHJ0LT5ydF9nYXRld2F5KSA9IHN0cnRvdWwoY29sc1tyb3V0ZV9nd19jb2xdLCBOVUxMLCAxNik7Ci0gICAgU0lOX0FERFIocnQtPnJ0X2dlbm1hc2spID0gc3RydG91bChjb2xzW3JvdXRlX21hc2tfY29sXSwgTlVMTCwgMTYpOwotCi0gICAgcnQtPnJ0X2ZsYWdzID0gKHNob3J0KSBzdHJ0b3VsKGNvbHNbcm91dGVfZmxhZ3NfY29sXSwgTlVMTCwgMTYpOwotICAgIHJ0LT5ydF9kZXYgICA9IGNvbHNbcm91dGVfZGV2X2NvbF07Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogZGVmYXVsdHJvdXRlX2V4aXN0cyAtIGRldGVybWluZSBpZiB0aGVyZSBpcyBhIGRlZmF1bHQgcm91dGUKLSAqLwotCi1zdGF0aWMgaW50IGRlZmF1bHRyb3V0ZV9leGlzdHMgKHN0cnVjdCBydGVudHJ5ICpydCkKLXsKLSAgICBpbnQgcmVzdWx0ID0gMDsKLQotICAgIGlmICghb3Blbl9yb3V0ZV90YWJsZSgpKQotCXJldHVybiAwOwotCi0gICAgd2hpbGUgKHJlYWRfcm91dGVfdGFibGUocnQpICE9IDApIHsKLQlpZiAoKHJ0LT5ydF9mbGFncyAmIFJURl9VUCkgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQlpZiAoa2VybmVsX3ZlcnNpb24gPiBLVkVSU0lPTigyLDEsMCkgJiYgU0lOX0FERFIocnQtPnJ0X2dlbm1hc2spICE9IDApCi0JICAgIGNvbnRpbnVlOwotCWlmIChTSU5fQUREUihydC0+cnRfZHN0KSA9PSAwTCkgewotCSAgICByZXN1bHQgPSAxOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gICAgY2xvc2Vfcm91dGVfdGFibGUoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKgotICogaGF2ZV9yb3V0ZV90byAtIGRldGVybWluZSBpZiB0aGUgc3lzdGVtIGhhcyBhbnkgcm91dGUgdG8KLSAqIGEgZ2l2ZW4gSVAgYWRkcmVzcy4gIGBhZGRyJyBpcyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCi0gKiBSZXR1cm4gdmFsdWUgaXMgMSBpZiB5ZXMsIDAgaWYgbm8sIC0xIGlmIGRvbid0IGtub3cuCi0gKiBGb3IgZGVtYW5kIG1vZGUgdG8gd29yayBwcm9wZXJseSwgd2UgaGF2ZSB0byBpZ25vcmUgcm91dGVzCi0gKiB0aHJvdWdoIG91ciBvd24gaW50ZXJmYWNlLgotICovCi1pbnQgaGF2ZV9yb3V0ZV90byh1X2ludDMyX3QgYWRkcikKLXsKLSAgICBzdHJ1Y3QgcnRlbnRyeSBydDsKLSAgICBpbnQgcmVzdWx0ID0gMDsKLQotICAgIGlmICghb3Blbl9yb3V0ZV90YWJsZSgpKQotCXJldHVybiAtMTsJCS8qIGRvbid0IGtub3cgKi8KLQotICAgIHdoaWxlIChyZWFkX3JvdXRlX3RhYmxlKCZydCkpIHsKLQlpZiAoKHJ0LnJ0X2ZsYWdzICYgUlRGX1VQKSA9PSAwIHx8IHN0cmNtcChydC5ydF9kZXYsIGlmbmFtZSkgPT0gMCkKLQkgICAgY29udGludWU7Ci0JaWYgKChhZGRyICYgU0lOX0FERFIocnQucnRfZ2VubWFzaykpID09IFNJTl9BRERSKHJ0LnJ0X2RzdCkpIHsKLQkgICAgcmVzdWx0ID0gMTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAgIGNsb3NlX3JvdXRlX3RhYmxlKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogc2lmZGVmYXVsdHJvdXRlIC0gYXNzaWduIGEgZGVmYXVsdCByb3V0ZSB0aHJvdWdoIHRoZSBhZGRyZXNzIGdpdmVuLgotICovCi0KLWludCBzaWZkZWZhdWx0cm91dGUgKGludCB1bml0LCB1X2ludDMyX3Qgb3VyYWRkciwgdV9pbnQzMl90IGdhdGV3YXkpCi17Ci0gICAgc3RydWN0IHJ0ZW50cnkgcnQ7Ci0KLSAgICBpZiAoZGVmYXVsdHJvdXRlX2V4aXN0cygmcnQpICYmIHN0cmNtcChydC5ydF9kZXYsIGlmbmFtZSkgIT0gMCkgewotCWlmIChydC5ydF9mbGFncyAmIFJURl9HQVRFV0FZKQotCSAgICBlcnJvcigibm90IHJlcGxhY2luZyBleGlzdGluZyBkZWZhdWx0IHJvdXRlIHZpYSAlSSIsCi0JCSAgU0lOX0FERFIocnQucnRfZ2F0ZXdheSkpOwotCWVsc2UKLQkgICAgZXJyb3IoIm5vdCByZXBsYWNpbmcgZXhpc3RpbmcgZGVmYXVsdCByb3V0ZSB0aHJvdWdoICVzIiwKLQkJICBydC5ydF9kZXYpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIG1lbXNldCAoJnJ0LCAwLCBzaXplb2YgKHJ0KSk7Ci0gICAgU0VUX1NBX0ZBTUlMWSAocnQucnRfZHN0LCBBRl9JTkVUKTsKLQotICAgIHJ0LnJ0X2RldiA9IGlmbmFtZTsKLQotICAgIGlmIChrZXJuZWxfdmVyc2lvbiA+IEtWRVJTSU9OKDIsMSwwKSkgewotCVNFVF9TQV9GQU1JTFkgKHJ0LnJ0X2dlbm1hc2ssIEFGX0lORVQpOwotCVNJTl9BRERSKHJ0LnJ0X2dlbm1hc2spID0gMEw7Ci0gICAgfQotCi0gICAgcnQucnRfZmxhZ3MgPSBSVEZfVVA7Ci0gICAgaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NBRERSVCwgJnJ0KSA8IDApIHsKLQlpZiAoICEgb2tfZXJyb3IgKCBlcnJubyApKQotCSAgICBlcnJvcigiZGVmYXVsdCByb3V0ZSBpb2N0bChTSU9DQUREUlQpOiAlbSIpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIGhhdmVfZGVmYXVsdF9yb3V0ZSA9IDE7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIGNpZmRlZmF1bHRyb3V0ZSAtIGRlbGV0ZSBhIGRlZmF1bHQgcm91dGUgdGhyb3VnaCB0aGUgYWRkcmVzcyBnaXZlbi4KLSAqLwotCi1pbnQgY2lmZGVmYXVsdHJvdXRlIChpbnQgdW5pdCwgdV9pbnQzMl90IG91cmFkZHIsIHVfaW50MzJfdCBnYXRld2F5KQotewotICAgIHN0cnVjdCBydGVudHJ5IHJ0OwotCi0gICAgaGF2ZV9kZWZhdWx0X3JvdXRlID0gMDsKLQotICAgIG1lbXNldCAoJnJ0LCAnXDAnLCBzaXplb2YgKHJ0KSk7Ci0gICAgU0VUX1NBX0ZBTUlMWSAocnQucnRfZHN0LCAgICAgQUZfSU5FVCk7Ci0gICAgU0VUX1NBX0ZBTUlMWSAocnQucnRfZ2F0ZXdheSwgQUZfSU5FVCk7Ci0KLSAgICBydC5ydF9kZXYgPSBpZm5hbWU7Ci0KLSAgICBpZiAoa2VybmVsX3ZlcnNpb24gPiBLVkVSU0lPTigyLDEsMCkpIHsKLQlTRVRfU0FfRkFNSUxZIChydC5ydF9nZW5tYXNrLCBBRl9JTkVUKTsKLQlTSU5fQUREUihydC5ydF9nZW5tYXNrKSA9IDBMOwotICAgIH0KLQotICAgIHJ0LnJ0X2ZsYWdzID0gUlRGX1VQOwotICAgIGlmIChpb2N0bChzb2NrX2ZkLCBTSU9DREVMUlQsICZydCkgPCAwICYmIGVycm5vICE9IEVTUkNIKSB7Ci0JaWYgKHN0aWxsX3BwcCgpKSB7Ci0JICAgIGlmICggISBva19lcnJvciAoIGVycm5vICkpCi0JCWVycm9yKCJkZWZhdWx0IHJvdXRlIGlvY3RsKFNJT0NERUxSVCk6ICVtIik7Ci0JICAgIHJldHVybiAwOwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogc2lmcHJveHlhcnAgLSBNYWtlIGEgcHJveHkgQVJQIGVudHJ5IGZvciB0aGUgcGVlci4KLSAqLwotCi1pbnQgc2lmcHJveHlhcnAgKGludCB1bml0LCB1X2ludDMyX3QgaGlzX2FkcikKLXsKLSAgICBzdHJ1Y3QgYXJwcmVxIGFycHJlcTsKLSAgICBjaGFyICpmb3J3X3BhdGg7Ci0KLSAgICBpZiAoaGFzX3Byb3h5X2FycCA9PSAwKSB7Ci0JbWVtc2V0ICgmYXJwcmVxLCAnXDAnLCBzaXplb2YoYXJwcmVxKSk7Ci0KLQlTRVRfU0FfRkFNSUxZKGFycHJlcS5hcnBfcGEsIEFGX0lORVQpOwotCVNJTl9BRERSKGFycHJlcS5hcnBfcGEpID0gaGlzX2FkcjsKLQlhcnByZXEuYXJwX2ZsYWdzID0gQVRGX1BFUk0gfCBBVEZfUFVCTDsKLS8qCi0gKiBHZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3Mgb2YgYW4gaW50ZXJmYWNlIG9uIHRoZSBzYW1lIHN1Ym5ldAotICogYXMgb3VyIGxvY2FsIGFkZHJlc3MuCi0gKi8KLQlpZiAoIWdldF9ldGhlcl9hZGRyKGhpc19hZHIsICZhcnByZXEuYXJwX2hhLCBwcm94eV9hcnBfZGV2LAotCQkJICAgIHNpemVvZihwcm94eV9hcnBfZGV2KSkpIHsKLQkgICAgZXJyb3IoIkNhbm5vdCBkZXRlcm1pbmUgZXRoZXJuZXQgYWRkcmVzcyBmb3IgcHJveHkgQVJQIik7Ci0JICAgIHJldHVybiAwOwotCX0KLQlzdHJsY3B5KGFycHJlcS5hcnBfZGV2LCBwcm94eV9hcnBfZGV2LCBzaXplb2YoYXJwcmVxLmFycF9kZXYpKTsKLQotCWlmIChpb2N0bChzb2NrX2ZkLCBTSU9DU0FSUCwgKGNhZGRyX3QpJmFycHJlcSkgPCAwKSB7Ci0JICAgIGlmICggISBva19lcnJvciAoIGVycm5vICkpCi0JCWVycm9yKCJpb2N0bChTSU9DU0FSUCk6ICVtIik7Ci0JICAgIHJldHVybiAwOwotCX0KLQlwcm94eV9hcnBfYWRkciA9IGhpc19hZHI7Ci0JaGFzX3Byb3h5X2FycCA9IDE7Ci0KLQlpZiAodHVuZV9rZXJuZWwpIHsKLQkgICAgZm9yd19wYXRoID0gcGF0aF90b19wcm9jZnMoIi9zeXMvbmV0L2lwdjQvaXBfZm9yd2FyZCIpOwotCSAgICBpZiAoZm9yd19wYXRoICE9IDApIHsKLQkJaW50IGZkID0gb3Blbihmb3J3X3BhdGgsIE9fV1JPTkxZKTsKLQkJaWYgKGZkID49IDApIHsKLQkJICAgIGlmICh3cml0ZShmZCwgIjEiLCAxKSAhPSAxKQotCQkJZXJyb3IoIkNvdWxkbid0IGVuYWJsZSBJUCBmb3J3YXJkaW5nOiAlbSIpOwotCQkgICAgY2xvc2UoZmQpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIGNpZnByb3h5YXJwIC0gRGVsZXRlIHRoZSBwcm94eSBBUlAgZW50cnkgZm9yIHRoZSBwZWVyLgotICovCi0KLWludCBjaWZwcm94eWFycCAoaW50IHVuaXQsIHVfaW50MzJfdCBoaXNfYWRyKQotewotICAgIHN0cnVjdCBhcnByZXEgYXJwcmVxOwotCi0gICAgaWYgKGhhc19wcm94eV9hcnApIHsKLQloYXNfcHJveHlfYXJwID0gMDsKLQltZW1zZXQgKCZhcnByZXEsICdcMCcsIHNpemVvZihhcnByZXEpKTsKLQlTRVRfU0FfRkFNSUxZKGFycHJlcS5hcnBfcGEsIEFGX0lORVQpOwotCVNJTl9BRERSKGFycHJlcS5hcnBfcGEpID0gaGlzX2FkcjsKLQlhcnByZXEuYXJwX2ZsYWdzID0gQVRGX1BFUk0gfCBBVEZfUFVCTDsKLQlzdHJsY3B5KGFycHJlcS5hcnBfZGV2LCBwcm94eV9hcnBfZGV2LCBzaXplb2YoYXJwcmVxLmFycF9kZXYpKTsKLQotCWlmIChpb2N0bChzb2NrX2ZkLCBTSU9DREFSUCwgKGNhZGRyX3QpJmFycHJlcSkgPCAwKSB7Ci0JICAgIGlmICggISBva19lcnJvciAoIGVycm5vICkpCi0JCXdhcm4oImlvY3RsKFNJT0NEQVJQKTogJW0iKTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogZ2V0X2V0aGVyX2FkZHIgLSBnZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3Mgb2YgYW4gaW50ZXJmYWNlIG9uIHRoZQotICogdGhlIHNhbWUgc3VibmV0IGFzIGlwYWRkci4KLSAqLwotCi1zdGF0aWMgaW50IGdldF9ldGhlcl9hZGRyICh1X2ludDMyX3QgaXBhZGRyLAotCQkJICAgc3RydWN0IHNvY2thZGRyICpod2FkZHIsCi0JCQkgICBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbikKLXsKLSAgICBzdHJ1Y3QgaWZyZXEgKmlmciwgKmlmZW5kOwotICAgIHVfaW50MzJfdCBpbmEsIG1hc2s7Ci0gICAgY2hhciAqYWxpYXNwOwotICAgIHN0cnVjdCBpZnJlcSBpZnJlcSwgYmVzdGlmcmVxOwotICAgIHN0cnVjdCBpZmNvbmYgaWZjOwotICAgIHN0cnVjdCBpZnJlcSBpZnNbTUFYX0lGU107Ci0KLSAgICB1X2ludDMyX3QgYmVzdG1hc2s9MDsKLSAgICBpbnQgZm91bmRfaW50ZXJmYWNlID0gMDsKLQotICAgIGlmYy5pZmNfbGVuID0gc2l6ZW9mKGlmcyk7Ci0gICAgaWZjLmlmY19yZXEgPSBpZnM7Ci0gICAgaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NHSUZDT05GLCAmaWZjKSA8IDApIHsKLQlpZiAoICEgb2tfZXJyb3IgKCBlcnJubyApKQotCSAgICBlcnJvcigiaW9jdGwoU0lPQ0dJRkNPTkYpOiAlbSAobGluZSAlZCkiLCBfX0xJTkVfXyk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0vKgotICogU2NhbiB0aHJvdWdoIGxvb2tpbmcgZm9yIGFuIGludGVyZmFjZSB3aXRoIGFuIEludGVybmV0Ci0gKiBhZGRyZXNzIG9uIHRoZSBzYW1lIHN1Ym5ldCBhcyBgaXBhZGRyJy4KLSAqLwotICAgIGlmZW5kID0gaWZzICsgKGlmYy5pZmNfbGVuIC8gc2l6ZW9mKHN0cnVjdCBpZnJlcSkpOwotICAgIGZvciAoaWZyID0gaWZjLmlmY19yZXE7IGlmciA8IGlmZW5kOyBpZnIrKykgewotCWlmIChpZnItPmlmcl9hZGRyLnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7Ci0JICAgIGluYSA9IFNJTl9BRERSKGlmci0+aWZyX2FkZHIpOwotCSAgICBzdHJsY3B5KGlmcmVxLmlmcl9uYW1lLCBpZnItPmlmcl9uYW1lLCBzaXplb2YoaWZyZXEuaWZyX25hbWUpKTsKLS8qCi0gKiBDaGVjayB0aGF0IHRoZSBpbnRlcmZhY2UgaXMgdXAsIGFuZCBub3QgcG9pbnQtdG8tcG9pbnQKLSAqIG5vciBsb29wYmFjay4KLSAqLwotCSAgICBpZiAoaW9jdGwoc29ja19mZCwgU0lPQ0dJRkZMQUdTLCAmaWZyZXEpIDwgMCkKLQkJY29udGludWU7Ci0KLQkgICAgaWYgKCgoaWZyZXEuaWZyX2ZsYWdzIF4gRkxBR1NfR09PRCkgJiBGTEFHU19NQVNLKSAhPSAwKQotCQljb250aW51ZTsKLS8qCi0gKiBHZXQgaXRzIG5ldG1hc2sgYW5kIGNoZWNrIHRoYXQgaXQncyBvbiB0aGUgcmlnaHQgc3VibmV0LgotICovCi0JICAgIGlmIChpb2N0bChzb2NrX2ZkLCBTSU9DR0lGTkVUTUFTSywgJmlmcmVxKSA8IDApCi0JCWNvbnRpbnVlOwotCi0JICAgIG1hc2sgPSBTSU5fQUREUihpZnJlcS5pZnJfYWRkcik7Ci0KLQkgICAgaWYgKCgoaXBhZGRyIF4gaW5hKSAmIG1hc2spICE9IDApCi0JCWNvbnRpbnVlOyAvKiBubyBtYXRjaCAqLwotCSAgICAvKiBtYXRjaGVkICovCi0JICAgIGlmIChtYXNrID49IGJlc3RtYXNrKSB7Ci0JCS8qIENvbXBhcmUgdXNpbmcgPj0gaW5zdGVhZCBvZiA+IC0tIGl0IGlzIHBvc3NpYmxlIGZvcgotCQkgICBhbiBpbnRlcmZhY2UgdG8gaGF2ZSBhIG5ldG1hc2sgb2YgMC4wLjAuMCAqLwotCQlmb3VuZF9pbnRlcmZhY2UgPSAxOwotCQliZXN0aWZyZXEgPSBpZnJlcTsKLQkJYmVzdG1hc2sgPSBtYXNrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIGlmICghZm91bmRfaW50ZXJmYWNlKSByZXR1cm4gMDsKLQotICAgIHN0cmxjcHkobmFtZSwgYmVzdGlmcmVxLmlmcl9uYW1lLCBuYW1lbGVuKTsKLQotICAgIC8qIHRyaW0gb2ZmIHRoZSA6MSBpbiBldGgwOjEgKi8KLSAgICBhbGlhc3AgPSBzdHJjaHIobmFtZSwgJzonKTsKLSAgICBpZiAoYWxpYXNwICE9IDApCi0JKmFsaWFzcCA9IDA7Ci0KLSAgICBpbmZvKCJmb3VuZCBpbnRlcmZhY2UgJXMgZm9yIHByb3h5IGFycCIsIG5hbWUpOwotLyoKLSAqIE5vdyBnZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3MuCi0gKi8KLSAgICBtZW1zZXQgKCZiZXN0aWZyZXEuaWZyX2h3YWRkciwgMCwgc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHIpKTsKLSAgICBpZiAoaW9jdGwgKHNvY2tfZmQsIFNJT0NHSUZIV0FERFIsICZiZXN0aWZyZXEpIDwgMCkgewotCWVycm9yKCJTSU9DR0lGSFdBRERSKCVzKTogJW0iLCBiZXN0aWZyZXEuaWZyX25hbWUpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIG1lbWNweSAoaHdhZGRyLAotCSAgICAmYmVzdGlmcmVxLmlmcl9od2FkZHIsCi0JICAgIHNpemVvZiAoc3RydWN0IHNvY2thZGRyKSk7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotLyoKLSAqIGdldF9pZl9od2FkZHIgLSBnZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3MgZm9yIHRoZSBzcGVjaWZpZWQKLSAqIG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZS4KLSAqLwotaW50Ci1nZXRfaWZfaHdhZGRyKHVfY2hhciAqYWRkciwgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgaWZyZXEgaWZyZXE7Ci0JaW50IHJldCwgc29ja19mZDsKLQotCXNvY2tfZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7Ci0JaWYgKHNvY2tfZmQgPCAwKQotCQlyZXR1cm4gMDsKLQltZW1zZXQoJmlmcmVxLmlmcl9od2FkZHIsIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKTsKLQlzdHJsY3B5KGlmcmVxLmlmcl9uYW1lLCBuYW1lLCBzaXplb2YoaWZyZXEuaWZyX25hbWUpKTsKLQlyZXQgPSBpb2N0bChzb2NrX2ZkLCBTSU9DR0lGSFdBRERSLCAmaWZyZXEpOwotCWNsb3NlKHNvY2tfZmQpOwotCWlmIChyZXQgPj0gMCkKLQkJbWVtY3B5KGFkZHIsIGlmcmVxLmlmcl9od2FkZHIuc2FfZGF0YSwgNik7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIGdldF9maXJzdF9ldGhlcm5ldCAtIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgZXRoZXJuZXQtc3R5bGUKLSAqIGludGVyZmFjZSBvbiB0aGlzIHN5c3RlbS4KLSAqLwotY2hhciAqCi1nZXRfZmlyc3RfZXRoZXJuZXQoKQotewotCXJldHVybiAiZXRoMCI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFJldHVybiB1c2VyIHNwZWNpZmllZCBuZXRtYXNrLCBtb2RpZmllZCBieSBhbnkgbWFzayB3ZSBtaWdodCBkZXRlcm1pbmUKLSAqIGZvciBhZGRyZXNzIGBhZGRyJyAoaW4gbmV0d29yayBieXRlIG9yZGVyKS4KLSAqIEhlcmUgd2Ugc2NhbiB0aHJvdWdoIHRoZSBzeXN0ZW0ncyBsaXN0IG9mIGludGVyZmFjZXMsIGxvb2tpbmcgZm9yCi0gKiBhbnkgbm9uLXBvaW50LXRvLXBvaW50IGludGVyZmFjZXMgd2hpY2ggbWlnaHQgYXBwZWFyIHRvIGJlIG9uIHRoZSBzYW1lCi0gKiBuZXR3b3JrIGFzIGBhZGRyJy4gIElmIHdlIGZpbmQgYW55LCB3ZSBPUiBpbiB0aGVpciBuZXRtYXNrIHRvIHRoZQotICogdXNlci1zcGVjaWZpZWQgbmV0bWFzay4KLSAqLwotCi11X2ludDMyX3QgR2V0TWFzayAodV9pbnQzMl90IGFkZHIpCi17Ci0gICAgdV9pbnQzMl90IG1hc2ssIG5tYXNrLCBpbmE7Ci0gICAgc3RydWN0IGlmcmVxICppZnIsICppZmVuZCwgaWZyZXE7Ci0gICAgc3RydWN0IGlmY29uZiBpZmM7Ci0gICAgc3RydWN0IGlmcmVxIGlmc1tNQVhfSUZTXTsKLQotICAgIGFkZHIgPSBudG9obChhZGRyKTsKLQotICAgIGlmIChJTl9DTEFTU0EoYWRkcikpCS8qIGRldGVybWluZSBuZXR3b3JrIG1hc2sgZm9yIGFkZHJlc3MgY2xhc3MgKi8KLQlubWFzayA9IElOX0NMQVNTQV9ORVQ7Ci0gICAgZWxzZSBpZiAoSU5fQ0xBU1NCKGFkZHIpKQotCSAgICBubWFzayA9IElOX0NMQVNTQl9ORVQ7Ci0gICAgZWxzZQotCSAgICBubWFzayA9IElOX0NMQVNTQ19ORVQ7Ci0KLSAgICAvKiBjbGFzcyBEIG5ldHMgYXJlIGRpc2FsbG93ZWQgYnkgYmFkX2lwX2FkcnMgKi8KLSAgICBtYXNrID0gbmV0bWFzayB8IGh0b25sKG5tYXNrKTsKLS8qCi0gKiBTY2FuIHRocm91Z2ggdGhlIHN5c3RlbSdzIG5ldHdvcmsgaW50ZXJmYWNlcy4KLSAqLwotICAgIGlmYy5pZmNfbGVuID0gc2l6ZW9mKGlmcyk7Ci0gICAgaWZjLmlmY19yZXEgPSBpZnM7Ci0gICAgaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NHSUZDT05GLCAmaWZjKSA8IDApIHsKLQlpZiAoICEgb2tfZXJyb3IgKCBlcnJubyApKQotCSAgICB3YXJuKCJpb2N0bChTSU9DR0lGQ09ORik6ICVtIChsaW5lICVkKSIsIF9fTElORV9fKTsKLQlyZXR1cm4gbWFzazsKLSAgICB9Ci0KLSAgICBpZmVuZCA9IChzdHJ1Y3QgaWZyZXEgKikgKGlmYy5pZmNfYnVmICsgaWZjLmlmY19sZW4pOwotICAgIGZvciAoaWZyID0gaWZjLmlmY19yZXE7IGlmciA8IGlmZW5kOyBpZnIrKykgewotLyoKLSAqIENoZWNrIHRoZSBpbnRlcmZhY2UncyBpbnRlcm5ldCBhZGRyZXNzLgotICovCi0JaWYgKGlmci0+aWZyX2FkZHIuc2FfZmFtaWx5ICE9IEFGX0lORVQpCi0JICAgIGNvbnRpbnVlOwotCWluYSA9IFNJTl9BRERSKGlmci0+aWZyX2FkZHIpOwotCWlmICgoKG50b2hsKGluYSkgXiBhZGRyKSAmIG5tYXNrKSAhPSAwKQotCSAgICBjb250aW51ZTsKLS8qCi0gKiBDaGVjayB0aGF0IHRoZSBpbnRlcmZhY2UgaXMgdXAsIGFuZCBub3QgcG9pbnQtdG8tcG9pbnQgbm9yIGxvb3BiYWNrLgotICovCi0Jc3RybGNweShpZnJlcS5pZnJfbmFtZSwgaWZyLT5pZnJfbmFtZSwgc2l6ZW9mKGlmcmVxLmlmcl9uYW1lKSk7Ci0JaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NHSUZGTEFHUywgJmlmcmVxKSA8IDApCi0JICAgIGNvbnRpbnVlOwotCi0JaWYgKCgoaWZyZXEuaWZyX2ZsYWdzIF4gRkxBR1NfR09PRCkgJiBGTEFHU19NQVNLKSAhPSAwKQotCSAgICBjb250aW51ZTsKLS8qCi0gKiBHZXQgaXRzIG5ldG1hc2sgYW5kIE9SIGl0IGludG8gb3VyIG1hc2suCi0gKi8KLQlpZiAoaW9jdGwoc29ja19mZCwgU0lPQ0dJRk5FVE1BU0ssICZpZnJlcSkgPCAwKQotCSAgICBjb250aW51ZTsKLQltYXNrIHw9IFNJTl9BRERSKGlmcmVxLmlmcl9hZGRyKTsKLQlicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIG1hc2s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEludGVybmFsIHJvdXRpbmUgdG8gZGVjb2RlIHRoZSB2ZXJzaW9uLm1vZGlmaWNhdGlvbi5wYXRjaCBsZXZlbAotICovCi0KLXN0YXRpYyB2b2lkIGRlY29kZV92ZXJzaW9uIChjaGFyICpidWYsIGludCAqdmVyc2lvbiwKLQkJCSAgICBpbnQgKm1vZGlmaWNhdGlvbiwgaW50ICpwYXRjaCkKLXsKLSAgICBjaGFyICplbmRwOwotCi0gICAgKnZlcnNpb24gICAgICA9IChpbnQpIHN0cnRvdWwgKGJ1ZiwgJmVuZHAsIDEwKTsKLSAgICAqbW9kaWZpY2F0aW9uID0gMDsKLSAgICAqcGF0Y2ggICAgICAgID0gMDsKLQotICAgIGlmIChlbmRwICE9IGJ1ZiAmJiAqZW5kcCA9PSAnLicpIHsKLQlidWYgPSBlbmRwICsgMTsKLQkqbW9kaWZpY2F0aW9uID0gKGludCkgc3RydG91bCAoYnVmLCAmZW5kcCwgMTApOwotCWlmIChlbmRwICE9IGJ1ZiAmJiAqZW5kcCA9PSAnLicpIHsKLQkgICAgYnVmID0gZW5kcCArIDE7Ci0JICAgICpwYXRjaCA9IChpbnQpIHN0cnRvdWwgKGJ1ZiwgJmJ1ZiwgMTApOwotCX0KLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFByb2NlZHVyZSB0byBkZXRlcm1pbmUgaWYgdGhlIFBQUCBsaW5lIGRpc2NpcGxpbmUgaXMgcmVnaXN0ZXJlZC4KLSAqLwotCi1zdGF0aWMgaW50Ci1wcHBfcmVnaXN0ZXJlZCh2b2lkKQotewotICAgIGludCBsb2NhbF9mZDsKLSAgICBpbnQgbWZkID0gLTE7Ci0gICAgaW50IHJldCA9IDA7Ci0gICAgY2hhciBzbGF2ZVsxNl07Ci0KLSAgICAvKgotICAgICAqIFdlIHVzZWQgdG8gb3BlbiB0aGUgc2VyaWFsIGRldmljZSBhbmQgc2V0IGl0IHRvIHRoZSBwcHAgbGluZQotICAgICAqIGRpc2NpcGxpbmUgaGVyZSwgaW4gb3JkZXIgdG8gY3JlYXRlIGEgcHBwIHVuaXQuICBCdXQgdGhhdCBpcwotICAgICAqIG5vdCBhIGdvb2QgaWRlYSAtIHRoZSB1c2VyIG1pZ2h0IGhhdmUgc3BlY2lmaWVkIGEgZGV2aWNlIHRoYXQKLSAgICAgKiB0aGV5IGNhbid0IG9wZW4gKHBlcm1pc3Npb24sIG9yIG1heWJlIGl0IGRvZXNuJ3QgcmVhbGx5IGV4aXN0KS4KLSAgICAgKiBTbyB3ZSBncmFiIGEgcHR5IG1hc3Rlci9zbGF2ZSBwYWlyIGFuZCB1c2UgdGhhdC4KLSAgICAgKi8KLSAgICBpZiAoIWdldF9wdHkoJm1mZCwgJmxvY2FsX2ZkLCBzbGF2ZSwgMCkpIHsKLQlub19wcHBfbXNnID0gIkNvdWxkbid0IGRldGVybWluZSBpZiBQUFAgaXMgc3VwcG9ydGVkIChubyBmcmVlIHB0eXMpIjsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRyeSB0byBwdXQgdGhlIGRldmljZSBpbnRvIHRoZSBQUFAgZGlzY2lwbGluZS4KLSAgICAgKi8KLSAgICBpZiAoaW9jdGwobG9jYWxfZmQsIFRJT0NTRVRELCAmcHBwX2Rpc2MpIDwgMCkgewotCWVycm9yKCJpb2N0bChUSU9DU0VURChQUFApKTogJW0gKGxpbmUgJWQpIiwgX19MSU5FX18pOwotICAgIH0gZWxzZQotCXJldCA9IDE7Ci0KLSAgICBjbG9zZShsb2NhbF9mZCk7Ci0gICAgY2xvc2UobWZkKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBwcHBfYXZhaWxhYmxlIC0gY2hlY2sgd2hldGhlciB0aGUgc3lzdGVtIGhhcyBhbnkgcHBwIGludGVyZmFjZXMKLSAqIChpbiBmYWN0IHdlIGNoZWNrIHdoZXRoZXIgd2UgY2FuIGRvIGFuIGlvY3RsIG9uIHBwcDApLgotICovCi0KLWludCBwcHBfYXZhaWxhYmxlKHZvaWQpCi17Ci0gICAgaW50IHMsIG9rLCBmZDsKLSAgICBzdHJ1Y3QgaWZyZXEgaWZyOwotICAgIGludCAgICBzaXplOwotICAgIGludCAgICBteV92ZXJzaW9uLCBteV9tb2RpZmljYXRpb24sIG15X3BhdGNoOwotICAgIGludCBvc21haiwgb3NtaW4sIG9zcGF0Y2g7Ci0KLSAgICAvKiBnZXQgdGhlIGtlcm5lbCB2ZXJzaW9uIG5vdywgc2luY2Ugd2UgYXJlIGNhbGxlZCBiZWZvcmUgc3lzX2luaXQgKi8KLSAgICB1bmFtZSgmdXRzbmFtZSk7Ci0gICAgb3NtYWogPSBvc21pbiA9IG9zcGF0Y2ggPSAwOwotICAgIHNzY2FuZih1dHNuYW1lLnJlbGVhc2UsICIlZC4lZC4lZCIsICZvc21haiwgJm9zbWluLCAmb3NwYXRjaCk7Ci0gICAga2VybmVsX3ZlcnNpb24gPSBLVkVSU0lPTihvc21haiwgb3NtaW4sIG9zcGF0Y2gpOwotCi0gICAgZmQgPSBvcGVuKCIvZGV2L3BwcCIsIE9fUkRXUik7Ci0gICAgaWYgKGZkID49IDApIHsKLQluZXdfc3R5bGVfZHJpdmVyID0gMTsKLQotCS8qIFhYWCBzaG91bGQgZ2V0IGZyb20gZHJpdmVyICovCi0JZHJpdmVyX3ZlcnNpb24gPSAyOwotCWRyaXZlcl9tb2RpZmljYXRpb24gPSA0OwotCWRyaXZlcl9wYXRjaCA9IDA7Ci0JY2xvc2UoZmQpOwotCXJldHVybiAxOwotICAgIH0KLQotICAgIGlmIChrZXJuZWxfdmVyc2lvbiA+PSBLVkVSU0lPTigyLDMsMTMpKSB7Ci0JZXJyb3IoIkNvdWxkbid0IG9wZW4gdGhlIC9kZXYvcHBwIGRldmljZTogJW0iKTsKLQlpZiAoZXJybm8gPT0gRU5PRU5UKQotCSAgICBub19wcHBfbXNnID0KLQkJIllvdSBuZWVkIHRvIGNyZWF0ZSB0aGUgL2Rldi9wcHAgZGV2aWNlIG5vZGUgYnlcbiIKLQkJImV4ZWN1dGluZyB0aGUgZm9sbG93aW5nIGNvbW1hbmQgYXMgcm9vdDpcbiIKLQkJIglta25vZCAvZGV2L3BwcCBjIDEwOCAwXG4iOwotCWVsc2UgaWYgKGVycm5vID09IEVOT0RFViB8fCBlcnJubyA9PSBFTlhJTykKLQkgICAgbm9fcHBwX21zZyA9Ci0JCSJQbGVhc2UgbG9hZCB0aGUgcHBwX2dlbmVyaWMga2VybmVsIG1vZHVsZS5cbiI7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogd2UgYXJlIHJ1bm5pbmcgb24gYSByZWFsbHkgcmVhbGx5IG9sZCBrZXJuZWwgKi8KLSAgICBub19wcHBfbXNnID0KLQkiVGhpcyBzeXN0ZW0gbGFja3Mga2VybmVsIHN1cHBvcnQgZm9yIFBQUC4gIFRoaXMgY291bGQgYmUgYmVjYXVzZVxuIgotCSJ0aGUgUFBQIGtlcm5lbCBtb2R1bGUgY291bGQgbm90IGJlIGxvYWRlZCwgb3IgYmVjYXVzZSBQUFAgd2FzIG5vdFxuIgotCSJpbmNsdWRlZCBpbiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24uICBJZiBQUFAgd2FzIGluY2x1ZGVkIGFzIGFcbiIKLQkibW9kdWxlLCB0cnkgYC9zYmluL21vZHByb2JlIC12IHBwcCcuICBJZiB0aGF0IGZhaWxzLCBjaGVjayB0aGF0XG4iCi0JInBwcC5vIGV4aXN0cyBpbiAvbGliL21vZHVsZXMvYHVuYW1lIC1yYC9uZXQuXG4iCi0JIlNlZSBSRUFETUUubGludXggZmlsZSBpbiB0aGUgcHBwIGRpc3RyaWJ1dGlvbiBmb3IgbW9yZSBkZXRhaWxzLlxuIjsKLQotLyoKLSAqIE9wZW4gYSBzb2NrZXQgZm9yIGRvaW5nIHRoZSBpb2N0bCBvcGVyYXRpb25zLgotICovCi0gICAgcyA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKLSAgICBpZiAocyA8IDApCi0JcmV0dXJuIDA7Ci0KLSAgICBzdHJsY3B5IChpZnIuaWZyX25hbWUsICJwcHAwIiwgc2l6ZW9mIChpZnIuaWZyX25hbWUpKTsKLSAgICBvayA9IGlvY3RsKHMsIFNJT0NHSUZGTEFHUywgKGNhZGRyX3QpICZpZnIpID49IDA7Ci0vKgotICogSWYgdGhlIGRldmljZSBkaWQgbm90IGV4aXN0IHRoZW4gYXR0ZW1wdCB0byBjcmVhdGUgb25lIGJ5IHB1dHRpbmcgdGhlCi0gKiBjdXJyZW50IHR0eSBpbnRvIHRoZSBQUFAgZGlzY2lwbGluZS4gSWYgdGhpcyB3b3JrcyB0aGVuIG9idGFpbiB0aGUKLSAqIGZsYWdzIGZvciB0aGUgZGV2aWNlIGFnYWluLgotICovCi0gICAgaWYgKCFvaykgewotCWlmIChwcHBfcmVnaXN0ZXJlZCgpKSB7Ci0JICAgIHN0cmxjcHkgKGlmci5pZnJfbmFtZSwgInBwcDAiLCBzaXplb2YgKGlmci5pZnJfbmFtZSkpOwotCSAgICBvayA9IGlvY3RsKHMsIFNJT0NHSUZGTEFHUywgKGNhZGRyX3QpICZpZnIpID49IDA7Ci0JfQotICAgIH0KLS8qCi0gKiBFbnN1cmUgdGhhdCB0aGUgaGFyZHdhcmUgYWRkcmVzcyBpcyBmb3IgUFBQIGFuZCBub3Qgc29tZXRoaW5nIGVsc2UKLSAqLwotICAgIGlmIChvaykKLQlvayA9IGlvY3RsIChzLCBTSU9DR0lGSFdBRERSLCAoY2FkZHJfdCkgJmlmcikgPj0gMDsKLQotICAgIGlmIChvayAmJiAoKGlmci5pZnJfaHdhZGRyLnNhX2ZhbWlseSAmIH4weEZGKSAhPSBBUlBIUkRfUFBQKSkKLQlvayA9IDA7Ci0KLS8qCi0gKiAgVGhpcyBpcyB0aGUgUFBQIGRldmljZS4gVmFsaWRhdGUgdGhlIHZlcnNpb24gb2YgdGhlIGRyaXZlciBhdCB0aGlzCi0gKiAgcG9pbnQgdG8gZW5zdXJlIHRoYXQgdGhpcyBwcm9ncmFtIHdpbGwgd29yayB3aXRoIHRoZSBkcml2ZXIuCi0gKi8KLSAgICBpZiAob2spIHsKLQljaGFyICAgYWJCdWZmZXIgWzEwMjRdOwotCi0JaWZyLmlmcl9kYXRhID0gYWJCdWZmZXI7Ci0Jc2l6ZSA9IGlvY3RsIChzLCBTSU9DR1BQUFZFUiwgKGNhZGRyX3QpICZpZnIpOwotCWlmIChzaXplIDwgMCkgewotCSAgICBlcnJvcigiQ291bGRuJ3QgcmVhZCBkcml2ZXIgdmVyc2lvbjogJW0iKTsKLQkgICAgb2sgPSAwOwotCSAgICBub19wcHBfbXNnID0gIlNvcnJ5LCBjb3VsZG4ndCB2ZXJpZnkga2VybmVsIGRyaXZlciB2ZXJzaW9uXG4iOwotCi0JfSBlbHNlIHsKLQkgICAgZGVjb2RlX3ZlcnNpb24oYWJCdWZmZXIsCi0JCQkgICAmZHJpdmVyX3ZlcnNpb24sCi0JCQkgICAmZHJpdmVyX21vZGlmaWNhdGlvbiwKLQkJCSAgICZkcml2ZXJfcGF0Y2gpOwotLyoKLSAqIFZhbGlkYXRlIHRoZSB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgYWdhaW5zdCB0aGUgdmVyc2lvbiB0aGF0IHdlIHVzZWQuCi0gKi8KLQkgICAgZGVjb2RlX3ZlcnNpb24oVkVSU0lPTiwKLQkJCSAgICZteV92ZXJzaW9uLAotCQkJICAgJm15X21vZGlmaWNhdGlvbiwKLQkJCSAgICZteV9wYXRjaCk7Ci0KLQkgICAgLyogVGhlIHZlcnNpb24gbnVtYmVycyBtdXN0IG1hdGNoICovCi0JICAgIGlmIChkcml2ZXJfdmVyc2lvbiAhPSBteV92ZXJzaW9uKQotCQlvayA9IDA7Ci0KLQkgICAgLyogVGhlIG1vZGlmaWNhdGlvbiBsZXZlbHMgbXVzdCBiZSBsZWdhbCAqLwotCSAgICBpZiAoZHJpdmVyX21vZGlmaWNhdGlvbiA8IDMpIHsKLQkJaWYgKGRyaXZlcl9tb2RpZmljYXRpb24gPj0gMikgewotCQkgICAgLyogd2UgY2FuIGNvcGUgd2l0aCAyLjIuMCBhbmQgYWJvdmUgKi8KLQkJICAgIGRyaXZlcl9pc19vbGQgPSAxOwotCQl9IGVsc2UgewotCQkgICAgb2sgPSAwOwotCQl9Ci0JICAgIH0KLQotCSAgICBjbG9zZSAocyk7Ci0JICAgIGlmICghb2spIHsKLQkJc2xwcmludGYocm91dGVfYnVmZmVyLCBzaXplb2Yocm91dGVfYnVmZmVyKSwKLQkJCSAiU29ycnkgLSBQUFAgZHJpdmVyIHZlcnNpb24gJWQuJWQuJWQgaXMgb3V0IG9mIGRhdGVcbiIsCi0JCQkgZHJpdmVyX3ZlcnNpb24sIGRyaXZlcl9tb2RpZmljYXRpb24sIGRyaXZlcl9wYXRjaCk7Ci0KLQkJbm9fcHBwX21zZyA9IHJvdXRlX2J1ZmZlcjsKLQkgICAgfQotCX0KLSAgICB9Ci0gICAgcmV0dXJuIG9rOwotfQotCi0jaWYgZGVmaW5lZChfX0FORFJPSURfXykKLXZvaWQgbG9nd3RtcCAoY29uc3QgY2hhciAqbGluZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqaG9zdCkge30KLSNlbGlmICFkZWZpbmVkKEhBVkVfTE9HV1RNUCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFVwZGF0ZSB0aGUgd3RtcCBmaWxlIHdpdGggdGhlIGFwcHJvcHJpYXRlIHVzZXIgbmFtZSBhbmQgdHR5IGRldmljZS4KLSAqLwotCi12b2lkIGxvZ3d0bXAgKGNvbnN0IGNoYXIgKmxpbmUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmhvc3QpCi17Ci0gICAgc3RydWN0IHV0bXAgdXQsICp1dHA7Ci0gICAgcGlkX3QgIG15cGlkID0gZ2V0cGlkKCk7Ci0jaWYgX19HTElCQ19fIDwgMgotICAgIGludCAgICB3dG1wOwotI2VuZGlmCi0KLS8qCi0gKiBVcGRhdGUgdGhlIHNpZ25vbiBkYXRhYmFzZSBmb3IgdXNlcnMuCi0gKiBDaHJpc3RvcGggTGFtZXRlcjogQ29waWVkIGZyb20gcG9laWdsLTEuMzYgSmFuIDMsIDE5OTYKLSAqLwotICAgIHV0bXBuYW1lKF9QQVRIX1VUTVApOwotICAgIHNldHV0ZW50KCk7Ci0gICAgd2hpbGUgKCh1dHAgPSBnZXR1dGVudCgpKSAmJiAodXRwLT51dF9waWQgIT0gbXlwaWQpKQotCS8qIG5vdGhpbmcgKi87Ci0KLSAgICBpZiAodXRwKQotCW1lbWNweSgmdXQsIHV0cCwgc2l6ZW9mKHV0KSk7Ci0gICAgZWxzZQotCS8qIHNvbWUgZ2V0dHlzL3RlbG5ldGRzIGRvbid0IGluaXRpYWxpemUgdXRtcC4uLiAqLwotCW1lbXNldCgmdXQsIDAsIHNpemVvZih1dCkpOwotCi0gICAgaWYgKHV0LnV0X2lkWzBdID09IDApCi0Jc3RybmNweSh1dC51dF9pZCwgbGluZSArIDMsIHNpemVvZih1dC51dF9pZCkpOwotCi0gICAgc3RybmNweSh1dC51dF91c2VyLCBuYW1lLCBzaXplb2YodXQudXRfdXNlcikpOwotICAgIHN0cm5jcHkodXQudXRfbGluZSwgbGluZSwgc2l6ZW9mKHV0LnV0X2xpbmUpKTsKLQotICAgIHRpbWUoJnV0LnV0X3RpbWUpOwotCi0gICAgdXQudXRfdHlwZSA9IFVTRVJfUFJPQ0VTUzsKLSAgICB1dC51dF9waWQgID0gbXlwaWQ7Ci0KLSAgICAvKiBJbnNlcnQgdGhlIGhvc3QgbmFtZSBpZiBvbmUgaXMgc3VwcGxpZWQgKi8KLSAgICBpZiAoKmhvc3QpCi0Jc3RybmNweSAodXQudXRfaG9zdCwgaG9zdCwgc2l6ZW9mKHV0LnV0X2hvc3QpKTsKLQotICAgIC8qIEluc2VydCB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIHN5c3RlbSBpZiBJUCBpcyBlbmFibGVkICovCi0gICAgaWYgKGlwY3BfcHJvdGVudC5lbmFibGVkX2ZsYWcgJiYgaXBjcF9oaXNvcHRpb25zWzBdLm5lZ19hZGRyKQotCW1lbWNweSgmdXQudXRfYWRkciwgKGNoYXIgKikgJmlwY3BfaGlzb3B0aW9uc1swXS5oaXNhZGRyLAotCQkgc2l6ZW9mKHV0LnV0X2FkZHIpKTsKLQotICAgIC8qIENMOiBNYWtlcyBzdXJlIHRoYXQgdGhlIGxvZ291dCB3b3JrcyAqLwotICAgIGlmICgqaG9zdCA9PSAwICYmICpuYW1lPT0wKQotCXV0LnV0X2hvc3RbMF09MDsKLQotICAgIHB1dHV0bGluZSgmdXQpOwotICAgIGVuZHV0ZW50KCk7Ci0vKgotICogVXBkYXRlIHRoZSB3dG1wIGZpbGUuCi0gKi8KLSNpZiBfX0dMSUJDX18gPj0gMgotICAgIHVwZHd0bXAoX1BBVEhfV1RNUCwgJnV0KTsKLSNlbHNlCi0gICAgd3RtcCA9IG9wZW4oX1BBVEhfV1RNUCwgT19BUFBFTkR8T19XUk9OTFkpOwotICAgIGlmICh3dG1wID49IDApIHsKLQlmbG9jayh3dG1wLCBMT0NLX0VYKTsKLQotCWlmICh3cml0ZSAod3RtcCwgKGNoYXIgKikmdXQsIHNpemVvZih1dCkpICE9IHNpemVvZih1dCkpCi0JICAgIHdhcm4oImVycm9yIHdyaXRpbmcgJXM6ICVtIiwgX1BBVEhfV1RNUCk7Ci0KLQlmbG9jayh3dG1wLCBMT0NLX1VOKTsKLQotCWNsb3NlICh3dG1wKTsKLSAgICB9Ci0jZW5kaWYKLX0KLSNlbmRpZiAvKiBIQVZFX0xPR1dUTVAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogc2lmdmpjb21wIC0gY29uZmlnIHRjcCBoZWFkZXIgY29tcHJlc3Npb24KLSAqLwotCi1pbnQgc2lmdmpjb21wIChpbnQgdSwgaW50IHZqY29tcCwgaW50IGNpZGNvbXAsIGludCBtYXhjaWQpCi17Ci0JdV9pbnQgeDsKLQotCWlmICh2amNvbXApIHsKLQkJaWYgKGlvY3RsKHBwcF9kZXZfZmQsIFBQUElPQ1NNQVhDSUQsIChjYWRkcl90KSAmbWF4Y2lkKSA8IDApIHsKLQkJCWVycm9yKCJDb3VsZG4ndCBzZXQgdXAgVENQIGhlYWRlciBjb21wcmVzc2lvbjogJW0iKTsKLQkJCXZqY29tcCA9IDA7Ci0JCX0KLQl9Ci0KLQl4ID0gKHZqY29tcD8gU0NfQ09NUF9UQ1A6IDApIHwgKGNpZGNvbXA/IDA6IFNDX05PX1RDUF9DQ0lEKTsKLQltb2RpZnlfZmxhZ3MocHBwX2Rldl9mZCwgU0NfQ09NUF9UQ1B8U0NfTk9fVENQX0NDSUQsIHgpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIHNpZnVwIC0gQ29uZmlnIHRoZSBpbnRlcmZhY2UgdXAgYW5kIGVuYWJsZSBJUCBwYWNrZXRzIHRvIHBhc3MuCi0gKi8KLQotaW50IHNpZnVwKGludCB1KQotewotICAgIGludCByZXQ7Ci0KLSAgICBpZiAoKHJldCA9IHNldGlmc3RhdGUodSwgMSkpKQotCWlmX2lzX3VwKys7Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBzaWZkb3duIC0gRGlzYWJsZSB0aGUgaW5kaWNhdGVkIHByb3RvY29sIGFuZCBjb25maWcgdGhlIGludGVyZmFjZQotICoJICAgICBkb3duIGlmIHRoZXJlIGFyZSBubyByZW1haW5pbmcgcHJvdG9jb2xzLgotICovCi0KLWludCBzaWZkb3duIChpbnQgdSkKLXsKLSAgICBpZiAoaWZfaXNfdXAgJiYgLS1pZl9pc191cCA+IDApCi0JcmV0dXJuIDE7Ci0KLSNpZmRlZiBJTkVUNgotICAgIGlmIChpZjZfaXNfdXApCi0JcmV0dXJuIDE7Ci0jZW5kaWYgLyogSU5FVDYgKi8KLQotICAgIHJldHVybiBzZXRpZnN0YXRlKHUsIDApOwotfQotCi0jaWZkZWYgSU5FVDYKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIHNpZjZ1cCAtIENvbmZpZyB0aGUgaW50ZXJmYWNlIHVwIGZvciBJUHY2Ci0gKi8KLQotaW50IHNpZjZ1cChpbnQgdSkKLXsKLSAgICBpbnQgcmV0OwotCi0gICAgaWYgKChyZXQgPSBzZXRpZnN0YXRlKHUsIDEpKSkKLQlpZjZfaXNfdXAgPSAxOwotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogc2lmNmRvd24gLSBEaXNhYmxlIHRoZSBJUHY2Q1AgcHJvdG9jb2wgYW5kIGNvbmZpZyB0aGUgaW50ZXJmYWNlCi0gKgkgICAgICBkb3duIGlmIHRoZXJlIGFyZSBubyByZW1haW5pbmcgcHJvdG9jb2xzLgotICovCi0KLWludCBzaWY2ZG93biAoaW50IHUpCi17Ci0gICAgaWY2X2lzX3VwID0gMDsKLQotICAgIGlmIChpZl9pc191cCkKLQlyZXR1cm4gMTsKLQotICAgIHJldHVybiBzZXRpZnN0YXRlKHUsIDApOwotfQotI2VuZGlmIC8qIElORVQ2ICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIHNldGlmc3RhdGUgLSBDb25maWcgdGhlIGludGVyZmFjZSB1cCBvciBkb3duCi0gKi8KLQotc3RhdGljIGludCBzZXRpZnN0YXRlIChpbnQgdSwgaW50IHN0YXRlKQotewotICAgIHN0cnVjdCBpZnJlcSBpZnI7Ci0KLSAgICBtZW1zZXQgKCZpZnIsICdcMCcsIHNpemVvZiAoaWZyKSk7Ci0gICAgc3RybGNweShpZnIuaWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mIChpZnIuaWZyX25hbWUpKTsKLSAgICBpZiAoaW9jdGwoc29ja19mZCwgU0lPQ0dJRkZMQUdTLCAoY2FkZHJfdCkgJmlmcikgPCAwKSB7Ci0JaWYgKCEgb2tfZXJyb3IgKGVycm5vKSkKLQkgICAgZXJyb3IoImlvY3RsIChTSU9DR0lGRkxBR1MpOiAlbSAobGluZSAlZCkiLCBfX0xJTkVfXyk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKHN0YXRlKQotCWlmci5pZnJfZmxhZ3MgfD0gSUZGX1VQOwotICAgIGVsc2UKLQlpZnIuaWZyX2ZsYWdzICY9IH5JRkZfVVA7Ci0gICAgaWZyLmlmcl9mbGFncyB8PSBJRkZfUE9JTlRPUE9JTlQ7Ci0gICAgaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NTSUZGTEFHUywgKGNhZGRyX3QpICZpZnIpIDwgMCkgewotCWlmICghIG9rX2Vycm9yIChlcnJubykpCi0JICAgIGVycm9yKCJpb2N0bChTSU9DU0lGRkxBR1MpOiAlbSAobGluZSAlZCkiLCBfX0xJTkVfXyk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAxOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBzaWZhZGRyIC0gQ29uZmlnIHRoZSBpbnRlcmZhY2UgSVAgYWRkcmVzc2VzIGFuZCBuZXRtYXNrLgotICovCi0KLWludCBzaWZhZGRyIChpbnQgdW5pdCwgdV9pbnQzMl90IG91cl9hZHIsIHVfaW50MzJfdCBoaXNfYWRyLAotCSAgICAgdV9pbnQzMl90IG5ldF9tYXNrKQotewotICAgIHN0cnVjdCBpZnJlcSAgIGlmcjsKLSAgICBzdHJ1Y3QgcnRlbnRyeSBydDsKLQotICAgIG1lbXNldCAoJmlmciwgJ1wwJywgc2l6ZW9mIChpZnIpKTsKLSAgICBtZW1zZXQgKCZydCwgICdcMCcsIHNpemVvZiAocnQpKTsKLQotICAgIFNFVF9TQV9GQU1JTFkgKGlmci5pZnJfYWRkciwgICAgQUZfSU5FVCk7Ci0gICAgU0VUX1NBX0ZBTUlMWSAoaWZyLmlmcl9kc3RhZGRyLCBBRl9JTkVUKTsKLSAgICBTRVRfU0FfRkFNSUxZIChpZnIuaWZyX25ldG1hc2ssIEFGX0lORVQpOwotCi0gICAgc3RybGNweSAoaWZyLmlmcl9uYW1lLCBpZm5hbWUsIHNpemVvZiAoaWZyLmlmcl9uYW1lKSk7Ci0vKgotICogIFNldCBvdXIgSVAgYWRkcmVzcwotICovCi0gICAgU0lOX0FERFIoaWZyLmlmcl9hZGRyKSA9IG91cl9hZHI7Ci0gICAgaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NTSUZBRERSLCAoY2FkZHJfdCkgJmlmcikgPCAwKSB7Ci0JaWYgKGVycm5vICE9IEVFWElTVCkgewotCSAgICBpZiAoISBva19lcnJvciAoZXJybm8pKQotCQllcnJvcigiaW9jdGwoU0lPQ1NJRkFERFIpOiAlbSAobGluZSAlZCkiLCBfX0xJTkVfXyk7Ci0JfQotCWVsc2UgewotCSAgICB3YXJuKCJpb2N0bChTSU9DU0lGQUREUik6IEFkZHJlc3MgYWxyZWFkeSBleGlzdHMiKTsKLQl9Ci0JcmV0dXJuICgwKTsKLSAgICB9Ci0vKgotICogIFNldCB0aGUgZ2F0ZXdheSBhZGRyZXNzCi0gKi8KLSAgICBpZiAoaGlzX2FkciAhPSAwKSB7Ci0JU0lOX0FERFIoaWZyLmlmcl9kc3RhZGRyKSA9IGhpc19hZHI7Ci0JaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NTSUZEU1RBRERSLCAoY2FkZHJfdCkgJmlmcikgPCAwKSB7Ci0JICAgIGlmICghIG9rX2Vycm9yIChlcnJubykpCi0JCWVycm9yKCJpb2N0bChTSU9DU0lGRFNUQUREUik6ICVtIChsaW5lICVkKSIsIF9fTElORV9fKTsKLQkgICAgcmV0dXJuICgwKTsKLQl9Ci0gICAgfQotLyoKLSAqICBTZXQgdGhlIG5ldG1hc2suCi0gKiAgRm9yIHJlY2VudCBrZXJuZWxzLCBmb3JjZSB0aGUgbmV0bWFzayB0byAyNTUuMjU1LjI1NS4yNTUuCi0gKi8KLSAgICBpZiAoa2VybmVsX3ZlcnNpb24gPj0gS1ZFUlNJT04oMiwxLDE2KSkKLQluZXRfbWFzayA9IH4wTDsKLSAgICBpZiAobmV0X21hc2sgIT0gMCkgewotCVNJTl9BRERSKGlmci5pZnJfbmV0bWFzaykgPSBuZXRfbWFzazsKLQlpZiAoaW9jdGwoc29ja19mZCwgU0lPQ1NJRk5FVE1BU0ssIChjYWRkcl90KSAmaWZyKSA8IDApIHsKLQkgICAgaWYgKCEgb2tfZXJyb3IgKGVycm5vKSkKLQkJZXJyb3IoImlvY3RsKFNJT0NTSUZORVRNQVNLKTogJW0gKGxpbmUgJWQpIiwgX19MSU5FX18pOwotCSAgICByZXR1cm4gKDApOwotCX0KLSAgICB9Ci0vKgotICogIEFkZCB0aGUgZGV2aWNlIHJvdXRlCi0gKi8KLSAgICBpZiAoa2VybmVsX3ZlcnNpb24gPCBLVkVSU0lPTigyLDEsMTYpKSB7Ci0JU0VUX1NBX0ZBTUlMWSAocnQucnRfZHN0LCAgICAgQUZfSU5FVCk7Ci0JU0VUX1NBX0ZBTUlMWSAocnQucnRfZ2F0ZXdheSwgQUZfSU5FVCk7Ci0JcnQucnRfZGV2ID0gaWZuYW1lOwotCi0JU0lOX0FERFIocnQucnRfZ2F0ZXdheSkgPSAwTDsKLQlTSU5fQUREUihydC5ydF9kc3QpICAgICA9IGhpc19hZHI7Ci0JcnQucnRfZmxhZ3MgPSBSVEZfVVAgfCBSVEZfSE9TVDsKLQotCWlmIChrZXJuZWxfdmVyc2lvbiA+IEtWRVJTSU9OKDIsMSwwKSkgewotCSAgICBTRVRfU0FfRkFNSUxZIChydC5ydF9nZW5tYXNrLCBBRl9JTkVUKTsKLQkgICAgU0lOX0FERFIocnQucnRfZ2VubWFzaykgPSAtMUw7Ci0JfQotCi0JaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NBRERSVCwgJnJ0KSA8IDApIHsKLQkgICAgaWYgKCEgb2tfZXJyb3IgKGVycm5vKSkKLQkJZXJyb3IoImlvY3RsKFNJT0NBRERSVCkgZGV2aWNlIHJvdXRlOiAlbSAobGluZSAlZCkiLCBfX0xJTkVfXyk7Ci0JICAgIHJldHVybiAoMCk7Ci0JfQotICAgIH0KLQotICAgIC8qIHNldCBpcF9keW5hZGRyIGluIGRlbWFuZCBtb2RlIGlmIGFkZHJlc3MgY2hhbmdlcyAqLwotICAgIGlmIChkZW1hbmQgJiYgdHVuZV9rZXJuZWwgJiYgIWR5bmFkZHJfc2V0Ci0JJiYgb3VyX29sZF9hZGRyICYmIG91cl9vbGRfYWRkciAhPSBvdXJfYWRyKSB7Ci0JLyogc2V0IGlwX2R5bmFkZHIgaWYgcG9zc2libGUgKi8KLQljaGFyICpwYXRoOwotCWludCBmZDsKLQotCXBhdGggPSBwYXRoX3RvX3Byb2NmcygiL3N5cy9uZXQvaXB2NC9pcF9keW5hZGRyIik7Ci0JaWYgKHBhdGggIT0gMCAmJiAoZmQgPSBvcGVuKHBhdGgsIE9fV1JPTkxZKSkgPj0gMCkgewotCSAgICBpZiAod3JpdGUoZmQsICIxIiwgMSkgIT0gMSkKLQkJZXJyb3IoIkNvdWxkbid0IGVuYWJsZSBkeW5hbWljIElQIGFkZHJlc3Npbmc6ICVtIik7Ci0JICAgIGNsb3NlKGZkKTsKLQl9Ci0JZHluYWRkcl9zZXQgPSAxOwkvKiBvbmx5IDEgYXR0ZW1wdCAqLwotICAgIH0KLSAgICBvdXJfb2xkX2FkZHIgPSAwOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIGNpZmFkZHIgLSBDbGVhciB0aGUgaW50ZXJmYWNlIElQIGFkZHJlc3NlcywgYW5kIGRlbGV0ZSByb3V0ZXMKLSAqIHRocm91Z2ggdGhlIGludGVyZmFjZSBpZiBwb3NzaWJsZS4KLSAqLwotCi1pbnQgY2lmYWRkciAoaW50IHVuaXQsIHVfaW50MzJfdCBvdXJfYWRyLCB1X2ludDMyX3QgaGlzX2FkcikKLXsKLSAgICBzdHJ1Y3QgaWZyZXEgaWZyOwotCi0gICAgaWYgKGtlcm5lbF92ZXJzaW9uIDwgS1ZFUlNJT04oMiwxLDE2KSkgewotLyoKLSAqICBEZWxldGUgdGhlIHJvdXRlIHRocm91Z2ggdGhlIGRldmljZQotICovCi0Jc3RydWN0IHJ0ZW50cnkgcnQ7Ci0JbWVtc2V0ICgmcnQsICdcMCcsIHNpemVvZiAocnQpKTsKLQotCVNFVF9TQV9GQU1JTFkgKHJ0LnJ0X2RzdCwgICAgIEFGX0lORVQpOwotCVNFVF9TQV9GQU1JTFkgKHJ0LnJ0X2dhdGV3YXksIEFGX0lORVQpOwotCXJ0LnJ0X2RldiA9IGlmbmFtZTsKLQotCVNJTl9BRERSKHJ0LnJ0X2dhdGV3YXkpID0gMDsKLQlTSU5fQUREUihydC5ydF9kc3QpICAgICA9IGhpc19hZHI7Ci0JcnQucnRfZmxhZ3MgPSBSVEZfVVAgfCBSVEZfSE9TVDsKLQotCWlmIChrZXJuZWxfdmVyc2lvbiA+IEtWRVJTSU9OKDIsMSwwKSkgewotCSAgICBTRVRfU0FfRkFNSUxZIChydC5ydF9nZW5tYXNrLCBBRl9JTkVUKTsKLQkgICAgU0lOX0FERFIocnQucnRfZ2VubWFzaykgPSAtMUw7Ci0JfQotCi0JaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NERUxSVCwgJnJ0KSA8IDAgJiYgZXJybm8gIT0gRVNSQ0gpIHsKLQkgICAgaWYgKHN0aWxsX3BwcCgpICYmICEgb2tfZXJyb3IgKGVycm5vKSkKLQkJZXJyb3IoImlvY3RsKFNJT0NERUxSVCkgZGV2aWNlIHJvdXRlOiAlbSAobGluZSAlZCkiLCBfX0xJTkVfXyk7Ci0JICAgIHJldHVybiAoMCk7Ci0JfQotICAgIH0KLQotICAgIC8qIFRoaXMgd2F5IGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgYW4gSVBYLW9ubHkgb3IgSVB2Ni1vbmx5IGludGVyZmFjZSAqLwotICAgIG1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7Ci0gICAgU0VUX1NBX0ZBTUlMWShpZnIuaWZyX2FkZHIsIEFGX0lORVQpOwotICAgIHN0cmxjcHkoaWZyLmlmcl9uYW1lLCBpZm5hbWUsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKLQotICAgIGlmIChpb2N0bChzb2NrX2ZkLCBTSU9DU0lGQUREUiwgKGNhZGRyX3QpICZpZnIpIDwgMCkgewotCWlmICghIG9rX2Vycm9yIChlcnJubykpIHsKLQkgICAgZXJyb3IoImlvY3RsKFNJT0NTSUZBRERSKTogJW0gKGxpbmUgJWQpIiwgX19MSU5FX18pOwotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgfQotCi0gICAgb3VyX29sZF9hZGRyID0gb3VyX2FkcjsKLQotICAgIHJldHVybiAxOwotfQotCi0jaWZkZWYgSU5FVDYKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIHNpZjZhZGRyIC0gQ29uZmlnIHRoZSBpbnRlcmZhY2Ugd2l0aCBhbiBJUHY2IGxpbmstbG9jYWwgYWRkcmVzcwotICovCi1pbnQgc2lmNmFkZHIgKGludCB1bml0LCBldWk2NF90IG91cl9ldWk2NCwgZXVpNjRfdCBoaXNfZXVpNjQpCi17Ci0gICAgc3RydWN0IGluNl9pZnJlcSBpZnI2OwotICAgIHN0cnVjdCBpZnJlcSBpZnI7Ci0gICAgc3RydWN0IGluNl9ydG1zZyBydDY7Ci0KLSAgICBpZiAoc29jazZfZmQgPCAwKSB7Ci0JZXJybm8gPSAtc29jazZfZmQ7Ci0JZXJyb3IoIklQdjYgc29ja2V0IGNyZWF0aW9uIGZhaWxlZDogJW0iKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgbWVtc2V0KCZpZnIsIDAsIHNpemVvZiAoaWZyKSk7Ci0gICAgc3RybGNweShpZnIuaWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOwotICAgIGlmIChpb2N0bChzb2NrNl9mZCwgU0lPQ0dJRklOREVYLCAoY2FkZHJfdCkgJmlmcikgPCAwKSB7Ci0JZXJyb3IoInNpZjZhZGRyOiBpb2N0bChTSU9DR0lGSU5ERVgpOiAlbSAobGluZSAlZCkiLCBfX0xJTkVfXyk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogTG9jYWwgaW50ZXJmYWNlICovCi0gICAgbWVtc2V0KCZpZnI2LCAwLCBzaXplb2YoaWZyNikpOwotICAgIElONl9MTEFERFJfRlJPTV9FVUk2NChpZnI2LmlmcjZfYWRkciwgb3VyX2V1aTY0KTsKLSAgICBpZnI2LmlmcjZfaWZpbmRleCA9IGlmci5pZnJfaWZpbmRleDsKLSAgICBpZnI2LmlmcjZfcHJlZml4bGVuID0gMTA7Ci0KLSAgICBpZiAoaW9jdGwoc29jazZfZmQsIFNJT0NTSUZBRERSLCAmaWZyNikgPCAwKSB7Ci0JZXJyb3IoInNpZjZhZGRyOiBpb2N0bChTSU9DU0lGQUREUik6ICVtIChsaW5lICVkKSIsIF9fTElORV9fKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBSb3V0ZSB0byByZW1vdGUgaG9zdCAqLwotICAgIG1lbXNldCgmcnQ2LCAwLCBzaXplb2YocnQ2KSk7Ci0gICAgSU42X0xMQUREUl9GUk9NX0VVSTY0KHJ0Ni5ydG1zZ19kc3QsIGhpc19ldWk2NCk7Ci0gICAgcnQ2LnJ0bXNnX2ZsYWdzID0gUlRGX1VQOwotICAgIHJ0Ni5ydG1zZ19kc3RfbGVuID0gMTA7Ci0gICAgcnQ2LnJ0bXNnX2lmaW5kZXggPSBpZnIuaWZyX2lmaW5kZXg7Ci0gICAgcnQ2LnJ0bXNnX21ldHJpYyA9IDE7Ci0KLSAgICBpZiAoaW9jdGwoc29jazZfZmQsIFNJT0NBRERSVCwgJnJ0NikgPCAwKSB7Ci0JZXJyb3IoInNpZjZhZGRyOiBpb2N0bChTSU9DQUREUlQpOiAlbSAobGluZSAlZCkiLCBfX0xJTkVfXyk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogY2lmNmFkZHIgLSBSZW1vdmUgSVB2NiBhZGRyZXNzIGZyb20gaW50ZXJmYWNlCi0gKi8KLWludCBjaWY2YWRkciAoaW50IHVuaXQsIGV1aTY0X3Qgb3VyX2V1aTY0LCBldWk2NF90IGhpc19ldWk2NCkKLXsKLSAgICBzdHJ1Y3QgaWZyZXEgaWZyOwotICAgIHN0cnVjdCBpbjZfaWZyZXEgaWZyNjsKLQotICAgIGlmIChzb2NrNl9mZCA8IDApIHsKLQllcnJubyA9IC1zb2NrNl9mZDsKLQllcnJvcigiSVB2NiBzb2NrZXQgY3JlYXRpb24gZmFpbGVkOiAlbSIpOwotCXJldHVybiAwOwotICAgIH0KLSAgICBtZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOwotICAgIHN0cmxjcHkoaWZyLmlmcl9uYW1lLCBpZm5hbWUsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKLSAgICBpZiAoaW9jdGwoc29jazZfZmQsIFNJT0NHSUZJTkRFWCwgKGNhZGRyX3QpICZpZnIpIDwgMCkgewotCWVycm9yKCJjaWY2YWRkcjogaW9jdGwoU0lPQ0dJRklOREVYKTogJW0gKGxpbmUgJWQpIiwgX19MSU5FX18pOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIG1lbXNldCgmaWZyNiwgMCwgc2l6ZW9mKGlmcjYpKTsKLSAgICBJTjZfTExBRERSX0ZST01fRVVJNjQoaWZyNi5pZnI2X2FkZHIsIG91cl9ldWk2NCk7Ci0gICAgaWZyNi5pZnI2X2lmaW5kZXggPSBpZnIuaWZyX2lmaW5kZXg7Ci0gICAgaWZyNi5pZnI2X3ByZWZpeGxlbiA9IDEwOwotCi0gICAgaWYgKGlvY3RsKHNvY2s2X2ZkLCBTSU9DRElGQUREUiwgJmlmcjYpIDwgMCkgewotCWlmIChlcnJubyAhPSBFQUREUk5PVEFWQUlMKSB7Ci0JICAgIGlmICghIG9rX2Vycm9yIChlcnJubykpCi0JCWVycm9yKCJjaWY2YWRkcjogaW9jdGwoU0lPQ0RJRkFERFIpOiAlbSAobGluZSAlZCkiLCBfX0xJTkVfXyk7Ci0JfQotCWVsc2UgewotCSAgICB3YXJuKCJjaWY2YWRkcjogaW9jdGwoU0lPQ0RJRkFERFIpOiBObyBzdWNoIGFkZHJlc3MiKTsKLQl9Ci0JcmV0dXJuICgwKTsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci0jZW5kaWYgLyogSU5FVDYgKi8KLQotLyoKLSAqIGdldF9wdHkgLSBnZXQgYSBwdHkgbWFzdGVyL3NsYXZlIHBhaXIgYW5kIGNob3duIHRoZSBzbGF2ZSBzaWRlCi0gKiB0byB0aGUgdWlkIGdpdmVuLiAgQXNzdW1lcyBzbGF2ZV9uYW1lIHBvaW50cyB0byA+PSAxNiBieXRlcyBvZiBzcGFjZS4KLSAqLwotaW50Ci1nZXRfcHR5KG1hc3Rlcl9mZHAsIHNsYXZlX2ZkcCwgc2xhdmVfbmFtZSwgdWlkKQotICAgIGludCAqbWFzdGVyX2ZkcDsKLSAgICBpbnQgKnNsYXZlX2ZkcDsKLSAgICBjaGFyICpzbGF2ZV9uYW1lOwotICAgIGludCB1aWQ7Ci17Ci0gICAgaW50IGksIG1mZCwgc2ZkID0gLTE7Ci0gICAgY2hhciBwdHlfbmFtZVsxNl07Ci0gICAgc3RydWN0IHRlcm1pb3MgdGlvczsKLQotI2lmZGVmIFRJT0NHUFROCi0gICAgLyoKLSAgICAgKiBUcnkgdGhlIHVuaXg5OCB3YXkgZmlyc3QuCi0gICAgICovCi0gICAgbWZkID0gb3BlbigiL2Rldi9wdG14IiwgT19SRFdSKTsKLSAgICBpZiAobWZkID49IDApIHsKLQlpbnQgcHRuOwotCWlmIChpb2N0bChtZmQsIFRJT0NHUFROLCAmcHRuKSA+PSAwKSB7Ci0JICAgIHNscHJpbnRmKHB0eV9uYW1lLCBzaXplb2YocHR5X25hbWUpLCAiL2Rldi9wdHMvJWQiLCBwdG4pOwotCSAgICBjaG1vZChwdHlfbmFtZSwgU19JUlVTUiB8IFNfSVdVU1IpOwotI2lmZGVmIFRJT0NTUFRMQ0sKLQkgICAgcHRuID0gMDsKLQkgICAgaWYgKGlvY3RsKG1mZCwgVElPQ1NQVExDSywgJnB0bikgPCAwKQotCQl3YXJuKCJDb3VsZG4ndCB1bmxvY2sgcHR5IHNsYXZlICVzOiAlbSIsIHB0eV9uYW1lKTsKLSNlbmRpZgotCSAgICBpZiAoKHNmZCA9IG9wZW4ocHR5X25hbWUsIE9fUkRXUiB8IE9fTk9DVFRZKSkgPCAwKQotCQl3YXJuKCJDb3VsZG4ndCBvcGVuIHB0eSBzbGF2ZSAlczogJW0iLCBwdHlfbmFtZSk7Ci0JfQotICAgIH0KLSNlbmRpZiAvKiBUSU9DR1BUTiAqLwotCi0gICAgaWYgKHNmZCA8IDApIHsKLQkvKiB0aGUgb2xkIHdheSAtIHNjYW4gdGhyb3VnaCB0aGUgcHR5IG5hbWUgc3BhY2UgKi8KLQlmb3IgKGkgPSAwOyBpIDwgNjQ7ICsraSkgewotCSAgICBzbHByaW50ZihwdHlfbmFtZSwgc2l6ZW9mKHB0eV9uYW1lKSwgIi9kZXYvcHR5JWMleCIsCi0JCSAgICAgJ3AnICsgaSAvIDE2LCBpICUgMTYpOwotCSAgICBtZmQgPSBvcGVuKHB0eV9uYW1lLCBPX1JEV1IsIDApOwotCSAgICBpZiAobWZkID49IDApIHsKLQkJcHR5X25hbWVbNV0gPSAndCc7Ci0JCXNmZCA9IG9wZW4ocHR5X25hbWUsIE9fUkRXUiB8IE9fTk9DVFRZLCAwKTsKLQkJaWYgKHNmZCA+PSAwKSB7Ci0JCSAgICBmY2hvd24oc2ZkLCB1aWQsIC0xKTsKLQkJICAgIGZjaG1vZChzZmQsIFNfSVJVU1IgfCBTX0lXVVNSKTsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCWNsb3NlKG1mZCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgaWYgKHNmZCA8IDApCi0JcmV0dXJuIDA7Ci0KLSAgICBzdHJsY3B5KHNsYXZlX25hbWUsIHB0eV9uYW1lLCAxNik7Ci0gICAgKm1hc3Rlcl9mZHAgPSBtZmQ7Ci0gICAgKnNsYXZlX2ZkcCA9IHNmZDsKLSAgICBpZiAodGNnZXRhdHRyKHNmZCwgJnRpb3MpID09IDApIHsKLQl0aW9zLmNfY2ZsYWcgJj0gfihDU0laRSB8IENTVE9QQiB8IFBBUkVOQik7Ci0JdGlvcy5jX2NmbGFnIHw9IENTOCB8IENSRUFEIHwgQ0xPQ0FMOwotCXRpb3MuY19pZmxhZyAgPSBJR05QQVI7Ci0JdGlvcy5jX29mbGFnICA9IDA7Ci0JdGlvcy5jX2xmbGFnICA9IDA7Ci0JaWYgKHRjc2V0YXR0cihzZmQsIFRDU0FGTFVTSCwgJnRpb3MpIDwgMCkKLQkgICAgd2FybigiY291bGRuJ3Qgc2V0IGF0dHJpYnV0ZXMgb24gcHR5OiAlbSIpOwotICAgIH0gZWxzZQotCXdhcm4oImNvdWxkbid0IGdldCBhdHRyaWJ1dGVzIG9uIHB0eTogJW0iKTsKLQotICAgIHJldHVybiAxOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBvcGVuX2xvb3BiYWNrIC0gb3BlbiB0aGUgZGV2aWNlIHdlIHVzZSBmb3IgZ2V0dGluZyBwYWNrZXRzCi0gKiBpbiBkZW1hbmQgbW9kZS4gIFVuZGVyIExpbnV4LCB3ZSB1c2UgYSBwdHkgbWFzdGVyL3NsYXZlIHBhaXIuCi0gKi8KLWludAotb3Blbl9wcHBfbG9vcGJhY2sodm9pZCkKLXsKLSAgICBpbnQgZmxhZ3M7Ci0KLSAgICBsb29wZWQgPSAxOwotICAgIGlmIChuZXdfc3R5bGVfZHJpdmVyKSB7Ci0JLyogYWxsb2NhdGUgb3Vyc2VsdmVzIGEgcHBwIHVuaXQgKi8KLQlpZiAobWFrZV9wcHBfdW5pdCgpIDwgMCkKLQkgICAgZGllKDEpOwotCW1vZGlmeV9mbGFncyhwcHBfZGV2X2ZkLCAwLCBTQ19MT09QX1RSQUZGSUMpOwotCXNldF9rZGVidWdmbGFnKGtkZWJ1Z2ZsYWcpOwotCXBwcF9mZCA9IC0xOwotCXJldHVybiBwcHBfZGV2X2ZkOwotICAgIH0KLQotICAgIGlmICghZ2V0X3B0eSgmbWFzdGVyX2ZkLCAmc2xhdmVfZmQsIGxvb3BfbmFtZSwgMCkpCi0JZmF0YWwoIk5vIGZyZWUgcHR5IGZvciBsb29wYmFjayIpOwotCi0gICAgc2V0X3BwcF9mZChzbGF2ZV9mZCk7Ci0KLSAgICBmbGFncyA9IGZjbnRsKG1hc3Rlcl9mZCwgRl9HRVRGTCk7Ci0gICAgaWYgKGZsYWdzID09IC0xIHx8Ci0JZmNudGwobWFzdGVyX2ZkLCBGX1NFVEZMLCBmbGFncyB8IE9fTk9OQkxPQ0spID09IC0xKQotCXdhcm4oImNvdWxkbid0IHNldCBtYXN0ZXIgbG9vcGJhY2sgdG8gbm9uYmxvY2s6ICVtIik7Ci0KLSAgICBmbGFncyA9IGZjbnRsKHBwcF9mZCwgRl9HRVRGTCk7Ci0gICAgaWYgKGZsYWdzID09IC0xIHx8Ci0JZmNudGwocHBwX2ZkLCBGX1NFVEZMLCBmbGFncyB8IE9fTk9OQkxPQ0spID09IC0xKQotCXdhcm4oImNvdWxkbid0IHNldCBzbGF2ZSBsb29wYmFjayB0byBub25ibG9jazogJW0iKTsKLQotICAgIGlmIChpb2N0bChwcHBfZmQsIFRJT0NTRVRELCAmcHBwX2Rpc2MpIDwgMCkKLQlmYXRhbCgiaW9jdGwoVElPQ1NFVEQpOiAlbSAobGluZSAlZCkiLCBfX0xJTkVfXyk7Ci0vKgotICogRmluZCBvdXQgd2hpY2ggaW50ZXJmYWNlIHdlIHdlcmUgZ2l2ZW4uCi0gKi8KLSAgICBpZiAoaW9jdGwocHBwX2ZkLCBQUFBJT0NHVU5JVCwgJmlmdW5pdCkgPCAwKQotCWZhdGFsKCJpb2N0bChQUFBJT0NHVU5JVCk6ICVtIChsaW5lICVkKSIsIF9fTElORV9fKTsKLS8qCi0gKiBFbmFibGUgZGVidWcgaW4gdGhlIGRyaXZlciBpZiByZXF1ZXN0ZWQuCi0gKi8KLSAgICBzZXRfa2RlYnVnZmxhZyAoa2RlYnVnZmxhZyk7Ci0KLSAgICByZXR1cm4gbWFzdGVyX2ZkOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBzaWZucG1vZGUgLSBTZXQgdGhlIG1vZGUgZm9yIGhhbmRsaW5nIHBhY2tldHMgZm9yIGEgZ2l2ZW4gTlAuCi0gKi8KLQotaW50Ci1zaWZucG1vZGUodSwgcHJvdG8sIG1vZGUpCi0gICAgaW50IHU7Ci0gICAgaW50IHByb3RvOwotICAgIGVudW0gTlBtb2RlIG1vZGU7Ci17Ci0gICAgc3RydWN0IG5waW9jdGwgbnBpOwotCi0gICAgbnBpLnByb3RvY29sID0gcHJvdG87Ci0gICAgbnBpLm1vZGUgICAgID0gbW9kZTsKLSAgICBpZiAoaW9jdGwocHBwX2Rldl9mZCwgUFBQSU9DU05QTU9ERSwgKGNhZGRyX3QpICZucGkpIDwgMCkgewotCWlmICghIG9rX2Vycm9yIChlcnJubykpCi0JICAgIGVycm9yKCJpb2N0bChQUFBJT0NTTlBNT0RFLCAlZCwgJWQpOiAlbSIsIHByb3RvLCBtb2RlKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLQwKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIHNpcHhmYWRkciAtIENvbmZpZyB0aGUgaW50ZXJmYWNlIElQWCBuZXR3b3JrbnVtYmVyCi0gKi8KLQotaW50IHNpcHhmYWRkciAoaW50IHVuaXQsIHVuc2lnbmVkIGxvbmcgaW50IG5ldHdvcmssIHVuc2lnbmVkIGNoYXIgKiBub2RlICkKLXsKLSAgICBpbnQgICAgcmVzdWx0ID0gMTsKLQotI2lmZGVmIElQWF9DSEFOR0UKLSAgICBpbnQgICAgc2tmZDsKLSAgICBzdHJ1Y3QgaWZyZXEgICAgICAgICBpZnI7Ci0gICAgc3RydWN0IHNvY2thZGRyX2lweCAqc2lweCA9IChzdHJ1Y3Qgc29ja2FkZHJfaXB4ICopICZpZnIuaWZyX2FkZHI7Ci0KLSAgICBza2ZkID0gc29ja2V0IChBRl9JUFgsIFNPQ0tfREdSQU0sIDApOwotICAgIGlmIChza2ZkIDwgMCkgewotCWlmICghIG9rX2Vycm9yIChlcnJubykpCi0JICAgIGRiZ2xvZygic29ja2V0KEFGX0lQWCk6ICVtIChsaW5lICVkKSIsIF9fTElORV9fKTsKLQlyZXN1bHQgPSAwOwotICAgIH0KLSAgICBlbHNlIHsKLQltZW1zZXQgKCZpZnIsICdcMCcsIHNpemVvZiAoaWZyKSk7Ci0Jc3RybGNweSAoaWZyLmlmcl9uYW1lLCBpZm5hbWUsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKLQotCW1lbWNweSAoc2lweC0+c2lweF9ub2RlLCBub2RlLCBJUFhfTk9ERV9MRU4pOwotCXNpcHgtPnNpcHhfZmFtaWx5ICA9IEFGX0lQWDsKLQlzaXB4LT5zaXB4X3BvcnQgICAgPSAwOwotCXNpcHgtPnNpcHhfbmV0d29yayA9IGh0b25sIChuZXR3b3JrKTsKLQlzaXB4LT5zaXB4X3R5cGUgICAgPSBJUFhfRlJBTUVfRVRIRVJJSTsKLQlzaXB4LT5zaXB4X2FjdGlvbiAgPSBJUFhfQ1JUSVRGOwotLyoKLSAqICBTZXQgdGhlIElQWCBkZXZpY2UKLSAqLwotCWlmIChpb2N0bChza2ZkLCBTSU9DU0lGQUREUiwgKGNhZGRyX3QpICZpZnIpIDwgMCkgewotCSAgICByZXN1bHQgPSAwOwotCSAgICBpZiAoZXJybm8gIT0gRUVYSVNUKSB7Ci0JCWlmICghIG9rX2Vycm9yIChlcnJubykpCi0JCSAgICBkYmdsb2coImlvY3RsKFNJT0NTSUZBRERSLCBDUlRJVEYpOiAlbSAobGluZSAlZCkiLCBfX0xJTkVfXyk7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCXdhcm4oImlvY3RsKFNJT0NTSUZBRERSLCBDUlRJVEYpOiBBZGRyZXNzIGFscmVhZHkgZXhpc3RzIik7Ci0JICAgIH0KLQl9Ci0JY2xvc2UgKHNrZmQpOwotICAgIH0KLSNlbmRpZgotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIGNpcHhmYWRkciAtIENsZWFyIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIElQWCBuZXR3b3JrLiBUaGUgSVBYIHJvdXRlcwotICoJICAgICAgIGFyZSByZW1vdmVkIGFuZCB0aGUgZGV2aWNlIGlzIG5vIGxvbmdlciBhYmxlIHRvIHBhc3MgSVBYCi0gKgkgICAgICAgZnJhbWVzLgotICovCi0KLWludCBjaXB4ZmFkZHIgKGludCB1bml0KQotewotICAgIGludCAgICByZXN1bHQgPSAxOwotCi0jaWZkZWYgSVBYX0NIQU5HRQotICAgIGludCAgICBza2ZkOwotICAgIHN0cnVjdCBpZnJlcSAgICAgICAgIGlmcjsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaXB4ICpzaXB4ID0gKHN0cnVjdCBzb2NrYWRkcl9pcHggKikgJmlmci5pZnJfYWRkcjsKLQotICAgIHNrZmQgPSBzb2NrZXQgKEFGX0lQWCwgU09DS19ER1JBTSwgMCk7Ci0gICAgaWYgKHNrZmQgPCAwKSB7Ci0JaWYgKCEgb2tfZXJyb3IgKGVycm5vKSkKLQkgICAgZGJnbG9nKCJzb2NrZXQoQUZfSVBYKTogJW0gKGxpbmUgJWQpIiwgX19MSU5FX18pOwotCXJlc3VsdCA9IDA7Ci0gICAgfQotICAgIGVsc2UgewotCW1lbXNldCAoJmlmciwgJ1wwJywgc2l6ZW9mIChpZnIpKTsKLQlzdHJsY3B5IChpZnIuaWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOwotCi0Jc2lweC0+c2lweF90eXBlICAgID0gSVBYX0ZSQU1FX0VUSEVSSUk7Ci0Jc2lweC0+c2lweF9hY3Rpb24gID0gSVBYX0RMVElURjsKLQlzaXB4LT5zaXB4X2ZhbWlseSAgPSBBRl9JUFg7Ci0vKgotICogIFNldCB0aGUgSVBYIGRldmljZQotICovCi0JaWYgKGlvY3RsKHNrZmQsIFNJT0NTSUZBRERSLCAoY2FkZHJfdCkgJmlmcikgPCAwKSB7Ci0JICAgIGlmICghIG9rX2Vycm9yIChlcnJubykpCi0JCWluZm8oImlvY3RsKFNJT0NTSUZBRERSLCBJUFhfRExUSVRGKTogJW0gKGxpbmUgJWQpIiwgX19MSU5FX18pOwotCSAgICByZXN1bHQgPSAwOwotCX0KLQljbG9zZSAoc2tmZCk7Ci0gICAgfQotI2VuZGlmCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLSAqIFVzZSB0aGUgaG9zdG5hbWUgYXMgcGFydCBvZiB0aGUgcmFuZG9tIG51bWJlciBzZWVkLgotICovCi1pbnQKLWdldF9ob3N0X3NlZWQoKQotewotICAgIGludCBoOwotICAgIGNoYXIgKnAgPSBob3N0bmFtZTsKLQotICAgIGggPSA0MDc7Ci0gICAgZm9yIChwID0gaG9zdG5hbWU7ICpwICE9IDA7ICsrcCkKLQloID0gaCAqIDM3ICsgKnA7Ci0gICAgcmV0dXJuIGg7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIHN5c19jaGVja19vcHRpb25zIC0gY2hlY2sgdGhlIG9wdGlvbnMgdGhhdCB0aGUgdXNlciBzcGVjaWZpZWQKLSAqLwotCi1pbnQKLXN5c19jaGVja19vcHRpb25zKHZvaWQpCi17Ci0jaWZkZWYgSVBYX0NIQU5HRQotLyoKLSAqIERpc2FibGUgdGhlIElQWCBwcm90b2NvbCBpZiB0aGUgc3VwcG9ydCBpcyBub3QgcHJlc2VudCBpbiB0aGUga2VybmVsLgotICovCi0gICAgY2hhciAqcGF0aDsKLQotICAgIGlmIChpcHhjcF9wcm90ZW50LmVuYWJsZWRfZmxhZykgewotCXN0cnVjdCBzdGF0IHN0YXRfYnVmOwotCWlmICggICgocGF0aCA9IHBhdGhfdG9fcHJvY2ZzKCIvbmV0L2lweC9pbnRlcmZhY2UiKSkgPT0gTlVMTAotCSAgICAmJiAocGF0aCA9IHBhdGhfdG9fcHJvY2ZzKCIvbmV0L2lweF9pbnRlcmZhY2UiKSkgPT0gTlVMTCkKLQkgICAgfHwgbHN0YXQocGF0aCwgJnN0YXRfYnVmKSA8IDApIHsKLQkgICAgZXJyb3IoIklQWCBzdXBwb3J0IGlzIG5vdCBwcmVzZW50IGluIHRoZSBrZXJuZWxcbiIpOwotCSAgICBpcHhjcF9wcm90ZW50LmVuYWJsZWRfZmxhZyA9IDA7Ci0JfQotICAgIH0KLSNlbmRpZgotICAgIGlmIChkZW1hbmQgJiYgZHJpdmVyX2lzX29sZCkgewotCW9wdGlvbl9lcnJvcigiZGVtYW5kIGRpYWxsaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkga2VybmVsIGRyaXZlciAiCi0JCSAgICAgInZlcnNpb24gJWQuJWQuJWQiLCBkcml2ZXJfdmVyc2lvbiwgZHJpdmVyX21vZGlmaWNhdGlvbiwKLQkJICAgICBkcml2ZXJfcGF0Y2gpOwotCXJldHVybiAwOwotICAgIH0KLSAgICBpZiAobXVsdGlsaW5rICYmICFuZXdfc3R5bGVfZHJpdmVyKSB7Ci0Jd2FybigiV2FybmluZzogbXVsdGlsaW5rIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbCBkcml2ZXIiKTsKLQltdWx0aWxpbmsgPSAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotI2lmZGVmIElORVQ2Ci0vKgotICogZXRoZXJfdG9fZXVpNjQgLSBDb252ZXJ0IDQ4LWJpdCBFdGhlcm5ldCBhZGRyZXNzIGludG8gNjQtYml0IEVVSQotICoKLSAqIGNvbnZlcnQgdGhlIDQ4LWJpdCBNQUMgYWRkcmVzcyBvZiBldGgwIGludG8gRVVJIDY0LiBjYWxsZXIgYWxzbyBhc3N1bWVzCi0gKiB0aGF0IHRoZSBzeXN0ZW0gaGFzIGEgcHJvcGVybHkgY29uZmlndXJlZCBFdGhlcm5ldCBpbnRlcmZhY2UgZm9yIHRoaXMKLSAqIGZ1bmN0aW9uIHRvIHJldHVybiBub24temVyby4KLSAqLwotaW50Ci1ldGhlcl90b19ldWk2NChldWk2NF90ICpwX2V1aTY0KQotewotICAgIHN0cnVjdCBpZnJlcSBpZnI7Ci0gICAgaW50IHNrZmQ7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqcHRyOwotCi0gICAgc2tmZCA9IHNvY2tldChQRl9JTkVUNiwgU09DS19ER1JBTSwgMCk7Ci0gICAgaWYoc2tmZCA9PSAtMSkKLSAgICB7Ci0gICAgICAgIHdhcm4oImNvdWxkIG5vdCBvcGVuIElQdjYgc29ja2V0Iik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHN0cmNweShpZnIuaWZyX25hbWUsICJldGgwIik7Ci0gICAgaWYoaW9jdGwoc2tmZCwgU0lPQ0dJRkhXQUREUiwgJmlmcikgPCAwKQotICAgIHsKLSAgICAgICAgY2xvc2Uoc2tmZCk7Ci0gICAgICAgIHdhcm4oImNvdWxkIG5vdCBvYnRhaW4gaGFyZHdhcmUgYWRkcmVzcyBmb3IgZXRoMCIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgY2xvc2Uoc2tmZCk7Ci0KLSAgICAvKgotICAgICAqIEFuZCBjb252ZXJ0IHRoZSBFVUktNDggaW50byBFVUktNjQsIHBlciBSRkMgMjQ3MiBbc2VjIDQuMV0KLSAgICAgKi8KLSAgICBwdHIgPSAodW5zaWduZWQgY2hhciAqKSBpZnIuaWZyX2h3YWRkci5zYV9kYXRhOwotICAgIHBfZXVpNjQtPmU4WzBdID0gcHRyWzBdIHwgMHgwMjsKLSAgICBwX2V1aTY0LT5lOFsxXSA9IHB0clsxXTsKLSAgICBwX2V1aTY0LT5lOFsyXSA9IHB0clsyXTsKLSAgICBwX2V1aTY0LT5lOFszXSA9IDB4RkY7Ci0gICAgcF9ldWk2NC0+ZThbNF0gPSAweEZFOwotICAgIHBfZXVpNjQtPmU4WzVdID0gcHRyWzNdOwotICAgIHBfZXVpNjQtPmU4WzZdID0gcHRyWzRdOwotICAgIHBfZXVpNjQtPmU4WzddID0gcHRyWzVdOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3BwcGQvc3lzLXNvbGFyaXMuYyBiL3BwcGQvc3lzLXNvbGFyaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNkOTAzMy4uMDAwMDAwMAotLS0gYS9wcHBkL3N5cy1zb2xhcmlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzg1ICswLDAgQEAKLS8qCi0gKiBTeXN0ZW0tZGVwZW5kZW50IHByb2NlZHVyZXMgZm9yIHBwcGQgdW5kZXIgU29sYXJpcyAyLgotICoKLSAqIFBhcnRzIHJlLXdyaXR0ZW4gYnkgQWRpIE1hc3B1dHJhIDxhZGkubWFzcHV0cmFAc3VuLmNvbT4sIGJhc2VkIG9uIAotICogdGhlIG9yaWdpbmFsIHN5cy1zdnI0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqIGRvY3VtZW50YXRpb24gaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcy4gIAotICoKLSAqIFNVTiBNQUtFUyBOTyBSRVBSRVNFTlRBVElPTiBPUiBXQVJSQU5USUVTIEFCT1VUIFRIRSBTVUlUQUJJTElUWSBPRgotICogVEhFIFNPRlRXQVJFLCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECi0gKiBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQQotICogUEFSVElDVUxBUiBQVVJQT1NFLCBPUiBOT04tSU5GUklOR0VNRU5ULiAgU1VOIFNIQUxMIE5PVCBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgREFNQUdFUyBTVUZGRVJFRCBCWSBMSUNFTlNFRSBBUyBBIFJFU1VMVCBPRiBVU0lORywgTU9ESUZZSU5HIE9SCi0gKiBESVNUUklCVVRJTkcgVEhJUyBTT0ZUV0FSRSBPUiBJVFMgREVSSVZBVElWRVMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMjAwMiBQYXVsIE1hY2tlcnJhcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFRoZSBuYW1lKHMpIG9mIHRoZSBhdXRob3JzIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiAzLiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFBhdWwgTWFja2VycmFzCi0gKiAgICAgPHBhdWx1c0BzYW1iYS5vcmc+Ii4KLSAqCi0gKiBUSEUgQVVUSE9SUyBPRiBUSElTIFNPRlRXQVJFIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi0gKiBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLSAqIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLSAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLSAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICoKLSAqIERlcml2ZWQgZnJvbSBtYWluLmMgYW5kIHBwcGQuaCwgd2hpY2ggYXJlOgotICoKLSAqIENvcHlyaWdodCAoYykgMTk4NC0yMDAwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBuYW1lICJDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHBlcm1pc3Npb24gb3IgYW55IGxlZ2FsCi0gKiAgICBkZXRhaWxzLCBwbGVhc2UgY29udGFjdAotICogICAgICBPZmZpY2Ugb2YgVGVjaG5vbG9neSBUcmFuc2ZlcgotICogICAgICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQotICogICAgICA1MDAwIEZvcmJlcyBBdmVudWUKLSAqICAgICAgUGl0dHNidXJnaCwgUEEgIDE1MjEzLTM4OTAKLSAqICAgICAgKDQxMikgMjY4LTQzODcsIGZheDogKDQxMikgMjY4LTczOTUKLSAqICAgICAgdGVjaC10cmFuc2ZlckBhbmRyZXcuY211LmVkdQotICoKLSAqIDQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQ29tcHV0aW5nIFNlcnZpY2VzCi0gKiAgICAgYXQgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkgKGh0dHA6Ly93d3cuY211LmVkdS9jb21wdXRpbmcvKS4iCi0gKgotICogQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi0gKiBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLSAqIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLSAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKLSAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNkZWZpbmUgUkNTSUQJIiRJZDogc3lzLXNvbGFyaXMuYyx2IDEuMTYgMjAwOC8wMS8zMCAxNDoyNjo1MyBjYXJsc29uaiBFeHAgJCIKLQotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8dGVybWlvcy5oPgotI2lmbmRlZiBDUlRTQ1RTCi0jaW5jbHVkZSA8c3lzL3Rlcm1pb3guaD4KLSNlbmRpZgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHV0bXB4Lmg+Ci0jaW5jbHVkZSA8c3Ryb3B0cy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9pb2Njb20uaD4KLSNpbmNsdWRlIDxzeXMvc3RyZWFtLmg+Ci0jaW5jbHVkZSA8c3lzL3N0cm9wdHMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tpby5oPgotI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KLSNpbmNsdWRlIDxzeXMvc3lzdGVtaW5mby5oPgotI2luY2x1ZGUgPHN5cy9kbHBpLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvbWtkZXYuaD4KLSNpbmNsdWRlIDxuZXQvaWYuaD4KLSNpbmNsdWRlIDxuZXQvaWZfYXJwLmg+Ci0jaW5jbHVkZSA8bmV0L3JvdXRlLmg+Ci0jaW5jbHVkZSA8bmV0L3BwcF9kZWZzLmg+Ci0jaW5jbHVkZSA8bmV0L3BwcGlvLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2lmZGVmIFNPTDIKLSNpbmNsdWRlIDxzeXMvdGloZHIuaD4KLSNpbmNsdWRlIDxzeXMvdGl1c2VyLmg+Ci0jaW5jbHVkZSA8aW5ldC9jb21tb24uaD4KLSNpbmNsdWRlIDxpbmV0L21pYjIuaD4KLSNpbmNsdWRlIDxzeXMvZXRoZXJuZXQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAicHBwZC5oIgotI2luY2x1ZGUgImZzbS5oIgotI2luY2x1ZGUgImxjcC5oIgotI2luY2x1ZGUgImlwY3AuaCIKLSNpbmNsdWRlICJjY3AuaCIKLQotI2lmICFkZWZpbmVkKFBQUF9EUlZfTkFNRSkKLSNkZWZpbmUgUFBQX0RSVl9OQU1FCSJwcHAiCi0jZW5kaWYgLyogIWRlZmluZWQoUFBQX0RSVl9OQU1FKSAqLwotCi0jaWYgIWRlZmluZWQoUFBQX0RFVl9OQU1FKQotI2RlZmluZSBQUFBfREVWX05BTUUJIi9kZXYvIiBQUFBfRFJWX05BTUUKLSNlbmRpZiAvKiAhZGVmaW5lZChQUFBfREVWX05BTUUpICovCi0KLSNpZiAhZGVmaW5lZChBSERMQ19NT0RfTkFNRSkKLSNkZWZpbmUgQUhETENfTU9EX05BTUUJInBwcF9haGRsIgotI2VuZGlmIC8qICFkZWZpbmVkKEFIRExDX01PRF9OQU1FKSAqLwotCi0jaWYgIWRlZmluZWQoQ09NUF9NT0RfTkFNRSkKLSNkZWZpbmUgQ09NUF9NT0RfTkFNRQkicHBwX2NvbXAiCi0jZW5kaWYgLyogIWRlZmluZWQoQ09NUF9NT0RfTkFNRSkgKi8KLQotI2lmICFkZWZpbmVkKElQX0RFVl9OQU1FKQotI2RlZmluZQlJUF9ERVZfTkFNRQkiL2Rldi9pcCIKLSNlbmRpZiAvKiAhZGVmaW5lZChJUF9ERVZfTkFNRSkgKi8KLQotI2lmICFkZWZpbmVkKElQX01PRF9OQU1FKQotI2RlZmluZQlJUF9NT0RfTkFNRQkiaXAiCi0jZW5kaWYgLyogIWRlZmluZWQoSVBfTU9EX05BTUUpICovCi0KLSNpZiAhZGVmaW5lZChVRFBfREVWX05BTUUpICYmIGRlZmluZWQoU09MMikKLSNkZWZpbmUJVURQX0RFVl9OQU1FCSIvZGV2L3VkcCIKLSNlbmRpZiAvKiAhZGVmaW5lZChVRFBfREVWX05BTUUpICYmIGRlZmluZWQoU09MMikgKi8KLQotI2lmICFkZWZpbmVkKFVEUDZfREVWX05BTUUpICYmIGRlZmluZWQoU09MMikKLSNkZWZpbmUJVURQNl9ERVZfTkFNRQkiL2Rldi91ZHA2IgotI2VuZGlmIC8qICFkZWZpbmVkKFVEUDZfREVWX05BTUUpICYmIGRlZmluZWQoU09MMikgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSA9IFJDU0lEOwotCi0jaWYgZGVmaW5lZChTT0wyKQotLyoKLSAqICIvZGV2L3VkcCIgaXMgdXNlZCBhcyBhIG11bHRpcGxleG9yIHRvIFBMSU5LIHRoZSBpbnRlcmZhY2Ugc3RyZWFtCi0gKiB1bmRlci4gSXQgaXMgdXNlZCBpbiBwbGFjZSBvZiAiL2Rldi9pcCIgc2luY2UgU1RSRUFNUyB3aWxsIG5vdCBsZXQKLSAqIGEgZHJpdmVyIGJlIFBMSU5LJ2VkIHVuZGVyIGl0c2VsZiwgYW5kICIvZGV2L2lwIiBpcyB0eXBpY2FsbHkgdGhlCi0gKiBkcml2ZXIgYXQgdGhlIGJvdHRvbSBvZiB0aGUgdHVubmVsaW5nIGludGVyZmFjZXMgc3RyZWFtLgotICovCi1zdGF0aWMgY2hhciAqbXV4X2Rldl9uYW1lID0gVURQX0RFVl9OQU1FOwotI2Vsc2UKLXN0YXRpYyBjaGFyICptdXhfZGV2X25hbWUgPSBJUF9ERVZfTkFNRTsKLSNlbmRpZgotc3RhdGljIGludAlwcHBmZDsKLXN0YXRpYyBpbnQJZmRtdXhpZCA9IC0xOwotc3RhdGljIGludAlpcGZkOwotc3RhdGljIGludAlpcG11eGlkID0gLTE7Ci0KLSNpZiBkZWZpbmVkKElORVQ2KSAmJiBkZWZpbmVkKFNPTDIpCi1zdGF0aWMgaW50CWlwNmZkOwkJLyogSVAgZmlsZSBkZXNjcmlwdG9yICovCi1zdGF0aWMgaW50CWlwNm11eGlkID0gLTE7CS8qIE11bHRpcGxleGVyIGZpbGUgZGVzY3JpcHRvciAqLwotc3RhdGljIGludAlpZjZfaXNfdXAgPSAwOwkvKiBJUHY2IGludGVyZmFjZSBoYXMgYmVlbiBtYXJrZWQgdXAgKi8KLQotI2RlZmluZSBfSU42X0xMWF9GUk9NX0VVSTY0KGwsIHMsIGV1aTY0LCBhcykgZG8gewlcCi0Jcy0+c2luNl9hZGRyLnM2X2FkZHIzMlswXSA9IGh0b25sKGFzKTsgCVwKLQlldWk2NF9jb3B5KGV1aTY0LCBzLT5zaW42X2FkZHIuczZfYWRkcjMyWzJdKTsJXAotCXMtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CQlcCi0JbC5saWZyX2FkZHIuc3NfZmFtaWx5ID0gQUZfSU5FVDY7CVwKLQlsLmxpZnJfYWRkcmxlbiA9IDY0OwkJCVwKLQlsLmxpZnJfYWRkciA9IGxhZGRyOwkJCVwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIElONl9MTEFERFJfRlJPTV9FVUk2NChsLCBzLCBldWk2NCkgIFwKLSAgICBfSU42X0xMWF9GUk9NX0VVSTY0KGwsIHMsIGV1aTY0LCAweGZlODAwMDAwKQotCi0jZGVmaW5lIElONl9MTFRPS0VOX0ZST01fRVVJNjQobCwgcywgZXVpNjQpIFwKLSAgICBfSU42X0xMWF9GUk9NX0VVSTY0KGwsIHMsIGV1aTY0LCAwKQotCi0jZW5kaWYgLyogZGVmaW5lZChJTkVUNikgJiYgZGVmaW5lZChTT0wyKSAqLwotCi0jaWYgZGVmaW5lZChJTkVUNikgJiYgZGVmaW5lZChTT0wyKQotc3RhdGljIGNoYXIJZmlyc3RfZXRoZXJfbmFtZVtMSUZOQU1TSVpdOwkvKiBTb2xhcmlzIDggYW5kIGFib3ZlICovCi0jZWxzZQotc3RhdGljIGNoYXIJZmlyc3RfZXRoZXJfbmFtZVtJRk5BTVNJWl07CS8qIEJlZm9yZSBTb2xhcmlzIDggKi8KLSNkZWZpbmUgTUFYSUZTCQkyNTYJCQkvKiBNYXggIyBvZiBpbnRlcmZhY2VzICovCi0jZW5kaWYgLyogZGVmaW5lZChJTkVUNikgJiYgZGVmaW5lZChTT0wyKSAqLwotCi1zdGF0aWMgaW50CXJlc3RvcmVfdGVybTsKLXN0YXRpYyBzdHJ1Y3QgdGVybWlvcyBpbml0dGVybWlvczsKLSNpZm5kZWYgQ1JUU0NUUwotc3RhdGljIHN0cnVjdCB0ZXJtaW94IGluaXR0ZXJtaW94Owotc3RhdGljIGludAl0ZXJtaW94X29rOwotI2VuZGlmCi1zdGF0aWMgc3RydWN0IHdpbnNpemUgd3NpbmZvOwkvKiBJbml0aWFsIHdpbmRvdyBzaXplIGluZm8gKi8KLXN0YXRpYyBwaWRfdAl0dHlfc2lkOwkvKiBvcmlnaW5hbCBzZXNzaW9uIElEIGZvciB0ZXJtaW5hbCAqLwotCi1leHRlcm4gdV9jaGFyCWlucGFja2V0X2J1ZltdOwkvKiBib3Jyb3dlZCBmcm9tIG1haW4uYyAqLwotCi0jZGVmaW5lIE1BWF9QT0xMRkRTCTMyCi1zdGF0aWMgc3RydWN0IHBvbGxmZCBwb2xsZmRzW01BWF9QT0xMRkRTXTsKLXN0YXRpYyBpbnQgbl9wb2xsZmRzOwotCi1zdGF0aWMgaW50CWxpbmtfbXR1LCBsaW5rX21ydTsKLQotI2RlZmluZSBOTU9EVUxFUwkzMgotc3RhdGljIGludAl0dHlfbm1vZHVsZXM7Ci1zdGF0aWMgY2hhcgl0dHlfbW9kdWxlc1tOTU9EVUxFU11bRk1OQU1FU1orMV07Ci1zdGF0aWMgaW50CXR0eV9ucHVzaGVkOwotCi1zdGF0aWMgaW50CWlmX2lzX3VwOwkvKiBJbnRlcmZhY2UgaGFzIGJlZW4gbWFya2VkIHVwICovCi1zdGF0aWMgdV9pbnQzMl90IHJlbW90ZV9hZGRyOwkJLyogSVAgYWRkcmVzcyBvZiBwZWVyICovCi1zdGF0aWMgdV9pbnQzMl90IGRlZmF1bHRfcm91dGVfZ2F0ZXdheTsJLyogR2F0ZXdheSBmb3IgZGVmYXVsdCByb3V0ZSBhZGRlZCAqLwotc3RhdGljIHVfaW50MzJfdCBwcm94eV9hcnBfYWRkcjsJLyogQWRkciBmb3IgcHJveHkgYXJwIGVudHJ5IGFkZGVkICovCi0KLS8qIFByb3RvdHlwZXMgZm9yIHByb2NlZHVyZXMgbG9jYWwgdG8gdGhpcyBmaWxlLiAqLwotc3RhdGljIGludCB0cmFuc2xhdGVfc3BlZWQgX19QKChpbnQpKTsKLXN0YXRpYyBpbnQgYmF1ZF9yYXRlX29mIF9fUCgoaW50KSk7Ci1zdGF0aWMgaW50IGdldF9ldGhlcl9hZGRyIF9fUCgodV9pbnQzMl90LCBzdHJ1Y3Qgc29ja2FkZHIgKikpOwotc3RhdGljIGludCBnZXRfaHdfYWRkciBfX1AoKGNoYXIgKiwgdV9pbnQzMl90LCBzdHJ1Y3Qgc29ja2FkZHIgKikpOwotc3RhdGljIGludCBnZXRfaHdfYWRkcl9kbHBpIF9fUCgoY2hhciAqLCBzdHJ1Y3Qgc29ja2FkZHIgKikpOwotc3RhdGljIGludCBkbHBpX2F0dGFjaCBfX1AoKGludCwgaW50KSk7Ci1zdGF0aWMgaW50IGRscGlfaW5mb19yZXEgX19QKChpbnQpKTsKLXN0YXRpYyBpbnQgZGxwaV9nZXRfcmVwbHkgX19QKChpbnQsIHVuaW9uIERMX3ByaW1pdGl2ZXMgKiwgaW50LCBpbnQpKTsKLXN0YXRpYyBpbnQgc3RyaW9jdGwgX19QKChpbnQsIGludCwgdm9pZCAqLCBpbnQsIGludCkpOwotCi0jaWZkZWYgU09MMgotLyoKLSAqIHNpZnBwYSAtIFNldHMgaW50ZXJmYWNlIHBwYQotICoKLSAqIHdpdGhvdXQgc2V0dGluZyB0aGUgcHBhLCBpcCBtb2R1bGUgd2lsbCByZXR1cm4gRUlOVkFMIHVwb24gc2V0dGluZyB0aGUKLSAqIGludGVyZmFjZSBVUCAoU0lPQ1N4SUZGTEFHUykuIFRoaXMgaXMgYmVjYXVzZSBpcCBtb2R1bGUgaW4gMi44IGV4cGVjdHMKLSAqIHR3byBETFBJX0lORk9fUkVRIHRvIGJlIHNlbnQgZG93biB0byB0aGUgZHJpdmVyIChiZWxvdyBpcCkgYmVmb3JlCi0gKiBJRkZfVVAgY2FuIGJlIHNldC4gUGx1bWJpbmcgdGhlIGRldmljZSBjYXVzZXMgb25lIERMUElfSU5GT19SRVEgdG8KLSAqIGJlIHNlbnQgZG93biwgYW5kIHRoZSBzZWNvbmQgRExQSV9JTkZPX1JFUSBpcyBzZW50IHVwb24gcmVjZWl2aW5nCi0gKiBJRl9VTklUU0VMIChvbGQpIG9yIFNJT0NTTElGTkFNRSAobmV3KSBpb2N0bHMuIFN1Y2ggc2V0dGluZyBvZiB0aGUgcHBhCi0gKiBpcyByZXF1aXJlZCBiZWNhdXNlIHRoZSBwcHAgRExQSSBwcm92aWRlciBhZHZlcnRpc2VzIGl0c2VsZiBhcwotICogYSBETFBJIHN0eWxlIDIgdHlwZSwgd2hpY2ggcmVxdWlyZXMgYSBwb2ludCBvZiBhdHRhY2htZW50IHRvIGJlCi0gKiBzcGVjaWZpZWQuIFRoZSBvbmx5IHdheSB0aGUgdXNlciBjYW4gc3BlY2lmeSBhIHBvaW50IG9mIGF0dGFjaG1lbnQKLSAqIGlzIHZpYSBTSU9DU0xJRk5BTUUgb3IgSUZfVU5JVFNFTC4KLSAqCi0gKiBTdWNoIGNoYW5nZXMgaW4gdGhlIGJlaGF2aW9yIG9mIGlwIG1vZHVsZSB3YXMgbWFkZSB0byBtZWV0IG5ldyBvcgotICogZXZvbHZpbmcgc3RhbmRhcmRzIHJlcXVpcmVtZW50cy4KLSAqCi0gKi8KLXN0YXRpYyBpbnQKLXNpZnBwYShmZCwgcHBhKQotICAgIGludCBmZDsKLSAgICBpbnQgcHBhOwotewotICAgIHJldHVybiAoaW50KWlvY3RsKGZkLCBJRl9VTklUU0VMLCAoY2hhciAqKSZwcGEpOwotfQotI2VuZGlmIC8qIFNPTDIgKi8KLQotI2lmIGRlZmluZWQoU09MMikgJiYgZGVmaW5lZChJTkVUNikKLS8qCi0gKiBnZXRfZmlyc3RfZXRoZXJuZXQgLSByZXR1cm5zIHRoZSBmaXJzdCBFdGhlcm5ldCBpbnRlcmZhY2UgbmFtZSBmb3VuZCBpbiAKLSAqIHRoZSBzeXN0ZW0sIG9yIE5VTEwgaWYgbm9uZSBpcyBmb3VuZAotICoKLSAqIE5PVEU6IFRoaXMgaXMgdGhlIGxpZnJlcSB2ZXJzaW9uIChTb2xhcmlzIDggYW5kIGFib3ZlKQotICovCi1jaGFyICoKLWdldF9maXJzdF9ldGhlcm5ldCgpCi17Ci0gICAgc3RydWN0IGxpZm51bSBsaWZuOwotICAgIHN0cnVjdCBsaWZjb25mIGxpZmM7Ci0gICAgc3RydWN0IGxpZnJlcSAqcGxpZnJlcTsKLSAgICBzdHJ1Y3QgbGlmcmVxIGxpZnI7Ci0gICAgaW50CWZkLCBudW1faWZzLCBpLCBmb3VuZDsKLSAgICB1aW50X3QgZmwsIHJlcV9zaXplOwotICAgIGNoYXIgKnJlcTsKLQotICAgIGZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOwotICAgIGlmIChmZCA8IDApIHsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEZpbmQgb3V0IGhvdyBtYW55IGludGVyZmFjZXMgYXJlIHJ1bm5pbmcKLSAgICAgKi8KLSAgICBsaWZuLmxpZm5fZmFtaWx5ID0gQUZfVU5TUEVDOwotICAgIGxpZm4ubGlmbl9mbGFncyA9IExJRkNfTk9YTUlUOwotICAgIGlmIChpb2N0bChmZCwgU0lPQ0dMSUZOVU0sICZsaWZuKSA8IDApIHsKLQljbG9zZShmZCk7Ci0JZXJyb3IoImNvdWxkIG5vdCBkZXRlcm1pbmUgbnVtYmVyIG9mIGludGVyZmFjZXM6ICVtIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgbnVtX2lmcyA9IGxpZm4ubGlmbl9jb3VudDsKLSAgICByZXFfc2l6ZSA9IG51bV9pZnMgKiBzaXplb2Yoc3RydWN0IGxpZnJlcSk7Ci0gICAgcmVxID0gbWFsbG9jKHJlcV9zaXplKTsKLSAgICBpZiAocmVxID09IE5VTEwpIHsKLQljbG9zZShmZCk7Ci0JZXJyb3IoIm91dCBvZiBtZW1vcnkiKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEdldCBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBpbmZvIGZvciBhbGwgaW50ZXJmYWNlcwotICAgICAqLwotICAgIGxpZmMubGlmY19mYW1pbHkgPSBBRl9VTlNQRUM7Ci0gICAgbGlmYy5saWZjX2ZsYWdzID0gTElGQ19OT1hNSVQ7Ci0gICAgbGlmYy5saWZjX2xlbiA9IHJlcV9zaXplOwotICAgIGxpZmMubGlmY19idWYgPSByZXE7Ci0gICAgaWYgKGlvY3RsKGZkLCBTSU9DR0xJRkNPTkYsICZsaWZjKSA8IDApIHsKLQljbG9zZShmZCk7Ci0JZnJlZShyZXEpOwotCWVycm9yKCJTSU9DR0xJRkNPTkY6ICVtIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBBbmQgdHJhdmVyc2UgZWFjaCBpbnRlcmZhY2UgdG8gbG9vayBzcGVjaWZpY2FsbHkgZm9yIHRoZSBmaXJzdAotICAgICAqIG9jY3VyZW5jZSBvZiBhbiBFdGhlcm5ldCBpbnRlcmZhY2Ugd2hpY2ggaGFzIGJlZW4gbWFya2VkIHVwCi0gICAgICovCi0gICAgcGxpZnJlcSA9IGxpZmMubGlmY19yZXE7Ci0gICAgZm91bmQgPSAwOwotICAgIGZvciAoaSA9IGxpZmMubGlmY19sZW4gLyBzaXplb2Yoc3RydWN0IGxpZnJlcSk7IGkgPiAwOyBpLS0sIHBsaWZyZXErKykgewotCi0JaWYgKHN0cmNocihwbGlmcmVxLT5saWZyX25hbWUsICc6JykgIT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLQltZW1zZXQoJmxpZnIsIDAsIHNpemVvZihsaWZyKSk7Ci0Jc3RybmNweShsaWZyLmxpZnJfbmFtZSwgcGxpZnJlcS0+bGlmcl9uYW1lLCBzaXplb2YobGlmci5saWZyX25hbWUpKTsKLQlpZiAoaW9jdGwoZmQsIFNJT0NHTElGRkxBR1MsICZsaWZyKSA8IDApIHsKLQkgICAgY2xvc2UoZmQpOwotCSAgICBmcmVlKHJlcSk7Ci0JICAgIGVycm9yKCJTSU9DR0xJRkZMQUdTOiAlbSIpOwotCSAgICByZXR1cm4gMDsKLQl9Ci0JZmwgPSBsaWZyLmxpZnJfZmxhZ3M7Ci0KLQlpZiAoKGZsICYgKElGRl9VUHxJRkZfQlJPQURDQVNUfElGRl9QT0lOVE9QT0lOVHxJRkZfTE9PUEJBQ0t8SUZGX05PQVJQKSkKLQkJIT0gKElGRl9VUCB8IElGRl9CUk9BRENBU1QpKQotCSAgICBjb250aW51ZTsKLQotCWZvdW5kID0gMTsKLQlicmVhazsKLSAgICB9Ci0gICAgZnJlZShyZXEpOwotICAgIGNsb3NlKGZkKTsKLQotICAgIGlmIChmb3VuZCkgewotCXN0cm5jcHkoZmlyc3RfZXRoZXJfbmFtZSwgbGlmci5saWZyX25hbWUsIHNpemVvZihmaXJzdF9ldGhlcl9uYW1lKSk7Ci0JcmV0dXJuIChjaGFyICopZmlyc3RfZXRoZXJfbmFtZTsKLSAgICB9IGVsc2UKLQlyZXR1cm4gTlVMTDsKLX0KLSNlbHNlCi0vKgotICogZ2V0X2ZpcnN0X2V0aGVybmV0IC0gcmV0dXJucyB0aGUgZmlyc3QgRXRoZXJuZXQgaW50ZXJmYWNlIG5hbWUgZm91bmQgaW4gCi0gKiB0aGUgc3lzdGVtLCBvciBOVUxMIGlmIG5vbmUgaXMgZm91bmQKLSAqCi0gKiBOT1RFOiBUaGlzIGlzIHRoZSBpZnJlcSB2ZXJzaW9uIChiZWZvcmUgU29sYXJpcyA4KS4gCi0gKi8KLWNoYXIgKgotZ2V0X2ZpcnN0X2V0aGVybmV0KCkKLXsKLSAgICBzdHJ1Y3QgaWZjb25mIGlmYzsKLSAgICBzdHJ1Y3QgaWZyZXEgKnBpZnJlcTsKLSAgICBzdHJ1Y3QgaWZyZXEgaWZyOwotICAgIGludAlmZCwgbnVtX2lmcywgaSwgZm91bmQ7Ci0gICAgdWludF90IGZsLCByZXFfc2l6ZTsKLSAgICBjaGFyICpyZXE7Ci0KLSAgICBmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKLSAgICBpZiAoZmQgPCAwKSB7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBGaW5kIG91dCBob3cgbWFueSBpbnRlcmZhY2VzIGFyZSBydW5uaW5nCi0gICAgICovCi0gICAgaWYgKGlvY3RsKGZkLCBTSU9DR0lGTlVNLCAoY2hhciAqKSZudW1faWZzKSA8IDApIHsKLQludW1faWZzID0gTUFYSUZTOwotICAgIH0KLQotICAgIHJlcV9zaXplID0gbnVtX2lmcyAqIHNpemVvZihzdHJ1Y3QgaWZyZXEpOwotICAgIHJlcSA9IG1hbGxvYyhyZXFfc2l6ZSk7Ci0gICAgaWYgKHJlcSA9PSBOVUxMKSB7Ci0JY2xvc2UoZmQpOwotCWVycm9yKCJvdXQgb2YgbWVtb3J5Iik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBHZXQgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gaW5mbyBmb3IgYWxsIGludGVyZmFjZXMKLSAgICAgKi8KLSAgICBpZmMuaWZjX2xlbiA9IHJlcV9zaXplOwotICAgIGlmYy5pZmNfYnVmID0gcmVxOwotICAgIGlmIChpb2N0bChmZCwgU0lPQ0dJRkNPTkYsICZpZmMpIDwgMCkgewotCWNsb3NlKGZkKTsKLQlmcmVlKHJlcSk7Ci0JZXJyb3IoIlNJT0NHSUZDT05GOiAlbSIpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQW5kIHRyYXZlcnNlIGVhY2ggaW50ZXJmYWNlIHRvIGxvb2sgc3BlY2lmaWNhbGx5IGZvciB0aGUgZmlyc3QKLSAgICAgKiBvY2N1cmVuY2Ugb2YgYW4gRXRoZXJuZXQgaW50ZXJmYWNlIHdoaWNoIGhhcyBiZWVuIG1hcmtlZCB1cAotICAgICAqLwotICAgIHBpZnJlcSA9IGlmYy5pZmNfcmVxOwotICAgIGZvdW5kID0gMDsKLSAgICBmb3IgKGkgPSBpZmMuaWZjX2xlbiAvIHNpemVvZihzdHJ1Y3QgaWZyZXEpOyBpID4gMDsgaS0tLCBwaWZyZXErKykgewotCi0JaWYgKHN0cmNocihwaWZyZXEtPmlmcl9uYW1lLCAnOicpICE9IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKLQlzdHJuY3B5KGlmci5pZnJfbmFtZSwgcGlmcmVxLT5pZnJfbmFtZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOwotCWlmIChpb2N0bChmZCwgU0lPQ0dJRkZMQUdTLCAmaWZyKSA8IDApIHsKLQkgICAgY2xvc2UoZmQpOwotCSAgICBmcmVlKHJlcSk7Ci0JICAgIGVycm9yKCJTSU9DR0lGRkxBR1M6ICVtIik7Ci0JICAgIHJldHVybiAwOwotCX0KLQlmbCA9IGlmci5pZnJfZmxhZ3M7Ci0KLQlpZiAoKGZsICYgKElGRl9VUHxJRkZfQlJPQURDQVNUfElGRl9QT0lOVE9QT0lOVHxJRkZfTE9PUEJBQ0t8SUZGX05PQVJQKSkKLQkJIT0gKElGRl9VUCB8IElGRl9CUk9BRENBU1QpKQotCSAgICBjb250aW51ZTsKLQotCWZvdW5kID0gMTsKLQlicmVhazsKLSAgICB9Ci0gICAgZnJlZShyZXEpOwotICAgIGNsb3NlKGZkKTsKLQotICAgIGlmIChmb3VuZCkgewotCXN0cm5jcHkoZmlyc3RfZXRoZXJfbmFtZSwgaWZyLmlmcl9uYW1lLCBzaXplb2YoZmlyc3RfZXRoZXJfbmFtZSkpOwotCXJldHVybiAoY2hhciAqKWZpcnN0X2V0aGVyX25hbWU7Ci0gICAgfSBlbHNlCi0JcmV0dXJuIE5VTEw7Ci19Ci0jZW5kaWYgLyogZGVmaW5lZChTT0wyKSAmJiBkZWZpbmVkKElORVQ2KSAqLwotCi0jaWYgZGVmaW5lZChTT0wyKQotLyoKLSAqIGdldF9pZl9od2FkZHIgLSBnZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3MgZm9yIHRoZSBzcGVjaWZpZWQKLSAqIG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZS4KLSAqLwotaW50Ci1nZXRfaWZfaHdhZGRyKHVfY2hhciAqYWRkciwgY2hhciAqaWZfbmFtZSkKLXsKLSAgICBzdHJ1Y3Qgc29ja2FkZHIgc19ldGhfYWRkcjsKLSAgICBzdHJ1Y3QgZXRoZXJfYWRkciAqZXRoX2FkZHIgPSAoc3RydWN0IGV0aGVyX2FkZHIgKikmc19ldGhfYWRkci5zYV9kYXRhOwotCi0gICAgaWYgKGlmX25hbWUgPT0gTlVMTCkKLQlyZXR1cm4gLTE7Ci0KLSAgICAvKgotICAgICAqIFNlbmQgRExfSU5GT19SRVEgdG8gdGhlIGRyaXZlciB0byBzb2xpY2l0IGl0cyBNQUMgYWRkcmVzcwotICAgICAqLwotICAgIGlmICghZ2V0X2h3X2FkZHJfZGxwaShpZl9uYW1lLCAmc19ldGhfYWRkcikpIHsKLQllcnJvcigiY291bGQgbm90IG9idGFpbiBoYXJkd2FyZSBhZGRyZXNzIGZvciAlcyIsIGlmX25hbWUpOwotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBtZW1jcHkoYWRkciwgZXRoX2FkZHItPmV0aGVyX2FkZHJfb2N0ZXQsIDYpOwotICAgIHJldHVybiAxOwotfQotI2VuZGlmIC8qIFNPTDIgKi8KLQotI2lmIGRlZmluZWQoU09MMikgJiYgZGVmaW5lZChJTkVUNikKLS8qCi0gKiBzbGlmbmFtZSAtIFNldHMgaW50ZXJmYWNlIHBwYSBhbmQgZmxhZ3MKLSAqCi0gKiBpbiBhZGRpdGlvbiB0byB0aGUgY29tbWVudHMgc3RhdGVkIGluIHNpZnBwYSgpLCBJRkZfSVBWNiBiaXQgbXVzdAotICogYmUgc2V0IGluIG9yZGVyIHRvIGRlY2xhcmUgdGhpcyBhcyBhbiBJUHY2IGludGVyZmFjZQotICovCi1zdGF0aWMgaW50Ci1zbGlmbmFtZShmZCwgcHBhKQotICAgIGludCBmZDsKLSAgICBpbnQgcHBhOwotewotICAgIHN0cnVjdCAgbGlmcmVxIGxpZnI7Ci0gICAgaW50CSAgICByZXQ7Ci0KLSAgICBtZW1zZXQoJmxpZnIsIDAsIHNpemVvZihsaWZyKSk7Ci0gICAgcmV0ID0gaW9jdGwoZmQsIFNJT0NHTElGRkxBR1MsICZsaWZyKTsKLSAgICBpZiAocmV0IDwgMCkKLQlnb3RvIHNsaWZuYW1lX2RvbmU7Ci0KLSAgICBsaWZyLmxpZnJfZmxhZ3MgfD0gSUZGX0lQVjY7Ci0gICAgbGlmci5saWZyX2ZsYWdzICY9IH4oSUZGX0JST0FEQ0FTVCB8IElGRl9JUFY0KTsKLSAgICBsaWZyLmxpZnJfcHBhID0gcHBhOwotICAgIHN0cmxjcHkobGlmci5saWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGxpZnIubGlmcl9uYW1lKSk7Ci0KLSAgICByZXQgPSBpb2N0bChmZCwgU0lPQ1NMSUZOQU1FLCAmbGlmcik7Ci0KLXNsaWZuYW1lX2RvbmU6Ci0gICAgcmV0dXJuIHJldDsKLQotCi19Ci0KLQotLyoKLSAqIGV0aGVyX3RvX2V1aTY0IC0gQ29udmVydCA0OC1iaXQgRXRoZXJuZXQgYWRkcmVzcyBpbnRvIDY0LWJpdCBFVUkKLSAqCi0gKiB3YWxrcyB0aGUgbGlzdCBvZiB2YWxpZCBldGhlcm5ldCBpbnRlcmZhY2VzLCBhbmQgY29udmVydCB0aGUgZmlyc3QKLSAqIGZvdW5kIDQ4LWJpdCBNQUMgYWRkcmVzcyBpbnRvIEVVSSA2NC4gY2FsbGVyIGFsc28gYXNzdW1lcyB0aGF0Ci0gKiB0aGUgc3lzdGVtIGhhcyBhIHByb3Blcmx5IGNvbmZpZ3VyZWQgRXRoZXJuZXQgaW50ZXJmYWNlIGZvciB0aGlzCi0gKiBmdW5jdGlvbiB0byByZXR1cm4gbm9uLXplcm8uCi0gKi8KLWludAotZXRoZXJfdG9fZXVpNjQoZXVpNjRfdCAqcF9ldWk2NCkKLXsKLSAgICBzdHJ1Y3Qgc29ja2FkZHIgc19ldGhfYWRkcjsKLSAgICBzdHJ1Y3QgZXRoZXJfYWRkciAqZXRoX2FkZHIgPSAoc3RydWN0IGV0aGVyX2FkZHIgKikmc19ldGhfYWRkci5zYV9kYXRhOwotICAgIGNoYXIgKmlmX25hbWU7Ci0KLSAgICBpZiAoKGlmX25hbWUgPSBnZXRfZmlyc3RfZXRoZXJuZXQoKSkgPT0gTlVMTCkgewotCWVycm9yKCJubyBwZXJzaXN0ZW50IGlkIGNhbiBiZSBmb3VuZCIpOwotCXJldHVybiAwOwotICAgIH0KLSAKLSAgICAvKgotICAgICAqIFNlbmQgRExfSU5GT19SRVEgdG8gdGhlIGRyaXZlciB0byBzb2xpY2l0IGl0cyBNQUMgYWRkcmVzcwotICAgICAqLwotICAgIGlmICghZ2V0X2h3X2FkZHJfZGxwaShpZl9uYW1lLCAmc19ldGhfYWRkcikpIHsKLQllcnJvcigiY291bGQgbm90IG9idGFpbiBoYXJkd2FyZSBhZGRyZXNzIGZvciAlcyIsIGlmX25hbWUpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQW5kIGNvbnZlcnQgdGhlIEVVSS00OCBpbnRvIEVVSS02NCwgcGVyIFJGQyAyNDcyIFtzZWMgNC4xXQotICAgICAqLwotICAgIHBfZXVpNjQtPmU4WzBdID0gKGV0aF9hZGRyLT5ldGhlcl9hZGRyX29jdGV0WzBdICYgMHhGRikgfCAweDAyOwotICAgIHBfZXVpNjQtPmU4WzFdID0gKGV0aF9hZGRyLT5ldGhlcl9hZGRyX29jdGV0WzFdICYgMHhGRik7Ci0gICAgcF9ldWk2NC0+ZThbMl0gPSAoZXRoX2FkZHItPmV0aGVyX2FkZHJfb2N0ZXRbMl0gJiAweEZGKTsKLSAgICBwX2V1aTY0LT5lOFszXSA9IDB4RkY7Ci0gICAgcF9ldWk2NC0+ZThbNF0gPSAweEZFOwotICAgIHBfZXVpNjQtPmU4WzVdID0gKGV0aF9hZGRyLT5ldGhlcl9hZGRyX29jdGV0WzNdICYgMHhGRik7Ci0gICAgcF9ldWk2NC0+ZThbNl0gPSAoZXRoX2FkZHItPmV0aGVyX2FkZHJfb2N0ZXRbNF0gJiAweEZGKTsKLSAgICBwX2V1aTY0LT5lOFs3XSA9IChldGhfYWRkci0+ZXRoZXJfYWRkcl9vY3RldFs1XSAmIDB4RkYpOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0jZW5kaWYgLyogZGVmaW5lZChTT0wyKSAmJiBkZWZpbmVkKElORVQ2KSAqLwotCi0vKgotICogc3lzX2luaXQgLSBTeXN0ZW0tZGVwZW5kZW50IGluaXRpYWxpemF0aW9uLgotICovCi12b2lkCi1zeXNfaW5pdCgpCi17Ci0gICAgaW50IGlmZCwgeDsKLSAgICBzdHJ1Y3QgaWZyZXEgaWZyOwotI2lmIGRlZmluZWQoSU5FVDYpICYmIGRlZmluZWQoU09MMikKLSAgICBpbnQgaTZmZDsKLSAgICBzdHJ1Y3QgbGlmcmVxIGxpZnI7Ci0jZW5kaWYgLyogZGVmaW5lZChJTkVUNikgJiYgZGVmaW5lZChTT0wyKSAqLwotI2lmICFkZWZpbmVkKFNPTDIpCi0gICAgc3RydWN0IHsKLQl1bmlvbiBETF9wcmltaXRpdmVzIHByaW07Ci0JY2hhciBzcGFjZVs2NF07Ci0gICAgfSByZXBseTsKLSNlbmRpZiAvKiAhZGVmaW5lZChTT0wyKSAqLwotCi0gICAgaXBmZCA9IG9wZW4obXV4X2Rldl9uYW1lLCBPX1JEV1IsIDApOwotICAgIGlmIChpcGZkIDwgMCkKLQlmYXRhbCgiQ291bGRuJ3Qgb3BlbiBJUCBkZXZpY2U6ICVtIik7Ci0KLSNpZiBkZWZpbmVkKElORVQ2KSAmJiBkZWZpbmVkKFNPTDIpCi0gICAgaXA2ZmQgPSBvcGVuKFVEUDZfREVWX05BTUUsIE9fUkRXUiwgMCk7Ci0gICAgaWYgKGlwNmZkIDwgMCkKLQlmYXRhbCgiQ291bGRuJ3Qgb3BlbiBJUCBkZXZpY2UgKDIpOiAlbSIpOwotI2VuZGlmIC8qIGRlZmluZWQoSU5FVDYpICYmIGRlZmluZWQoU09MMikgKi8KLQotICAgIGlmIChkZWZhdWx0X2RldmljZSAmJiAhbm90dHkpCi0JdHR5X3NpZCA9IGdldHNpZCgocGlkX3QpMCk7Ci0KLSAgICBwcHBmZCA9IG9wZW4oUFBQX0RFVl9OQU1FLCBPX1JEV1IgfCBPX05PTkJMT0NLLCAwKTsKLSAgICBpZiAocHBwZmQgPCAwKQotCWZhdGFsKCJDYW4ndCBvcGVuICVzOiAlbSIsIFBQUF9ERVZfTkFNRSk7Ci0gICAgaWYgKGtkZWJ1Z2ZsYWcgJiAxKSB7Ci0JeCA9IFBQUERCR19MT0cgKyBQUFBEQkdfRFJJVkVSOwotCXN0cmlvY3RsKHBwcGZkLCBQUFBJT19ERUJVRywgJngsIHNpemVvZihpbnQpLCAwKTsKLSAgICB9Ci0KLSAgICAvKiBBc3NpZ24gYSBuZXcgUFBBIGFuZCBnZXQgaXRzIHVuaXQgbnVtYmVyLiAqLwotICAgIGlmIChzdHJpb2N0bChwcHBmZCwgUFBQSU9fTkVXUFBBLCAmaWZ1bml0LCAwLCBzaXplb2YoaW50KSkgPCAwKQotCWZhdGFsKCJDYW4ndCBjcmVhdGUgbmV3IFBQUCBpbnRlcmZhY2U6ICVtIik7Ci0KLSNpZiBkZWZpbmVkKFNPTDIpCi0gICAgLyoKLSAgICAgKiBTaW5jZSBzeXNfaW5pdCgpIGlzIGNhbGxlZCBwcmlvciB0byBpZm5hbWUgYmVpbmcgc2V0IGluIG1haW4oKSwKLSAgICAgKiB3ZSBuZWVkIHRvIGdldCB0aGUgaWZuYW1lIG5vdywgb3RoZXJ3aXNlIHNsaWZuYW1lKCksIGFuZCBvdGhlcnMsCi0gICAgICogd2lsbCBmYWlsLCBvciBtYXliZSwgSSBzaG91bGQgbW92ZSB0aGVtIHRvIGEgbGF0ZXIgcG9pbnQgPwotICAgICAqIDxhZGkubWFzcHV0cmFAc3VuLmNvbT4KLSAgICAgKi8KLSAgICBzcHJpbnRmKGlmbmFtZSwgUFBQX0RSVl9OQU1FICIlZCIsIGlmdW5pdCk7Ci0jZW5kaWYgLyogZGVmaW5lZChTT0wyKSAqLwotICAgIC8qCi0gICAgICogT3BlbiB0aGUgcHBwIGRldmljZSBhZ2FpbiBhbmQgbGluayBpdCB1bmRlciB0aGUgaXAgbXVsdGlwbGV4b3IuCi0gICAgICogSVAgd2lsbCBhc3NpZ24gYSB1bml0IG51bWJlciB3aGljaCBob3BlZnVsbHkgaXMgdGhlIHNhbWUgYXMgaWZ1bml0LgotICAgICAqIEkgZG9uJ3Qga25vdyBhbnkgd2F5IHRvIGJlIGNlcnRhaW4gdGhleSB3aWxsIGJlIHRoZSBzYW1lLiA6LSgKLSAgICAgKi8KLSAgICBpZmQgPSBvcGVuKFBQUF9ERVZfTkFNRSwgT19SRFdSLCAwKTsKLSAgICBpZiAoaWZkIDwgMCkKLQlmYXRhbCgiQ2FuJ3Qgb3BlbiAlcyAoMik6ICVtIiwgUFBQX0RFVl9OQU1FKTsKLSAgICBpZiAoa2RlYnVnZmxhZyAmIDEpIHsKLQl4ID0gUFBQREJHX0xPRyArIFBQUERCR19EUklWRVI7Ci0Jc3RyaW9jdGwoaWZkLCBQUFBJT19ERUJVRywgJngsIHNpemVvZihpbnQpLCAwKTsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKElORVQ2KSAmJiBkZWZpbmVkKFNPTDIpCi0gICAgaTZmZCA9IG9wZW4oUFBQX0RFVl9OQU1FLCBPX1JEV1IsIDApOwotICAgIGlmIChpNmZkIDwgMCkgewotCWNsb3NlKGlmZCk7Ci0JZmF0YWwoIkNhbid0IG9wZW4gJXMgKDMpOiAlbSIsIFBQUF9ERVZfTkFNRSk7Ci0gICAgfQotICAgIGlmIChrZGVidWdmbGFnICYgMSkgewotCXggPSBQUFBEQkdfTE9HICsgUFBQREJHX0RSSVZFUjsKLQlzdHJpb2N0bChpNmZkLCBQUFBJT19ERUJVRywgJngsIHNpemVvZihpbnQpLCAwKTsKLSAgICB9Ci0jZW5kaWYgLyogZGVmaW5lZChJTkVUNikgJiYgZGVmaW5lZChTT0wyKSAqLwotCi0jaWYgZGVmaW5lZChTT0wyKQotICAgIGlmIChpb2N0bChpZmQsIElfUFVTSCwgSVBfTU9EX05BTUUpIDwgMCkgewotCWNsb3NlKGlmZCk7Ci0jaWYgZGVmaW5lZChJTkVUNikKLQljbG9zZShpNmZkKTsKLSNlbmRpZiAvKiBkZWZpbmVkKElORVQ2KSAqLwotCWZhdGFsKCJDYW4ndCBwdXNoIElQIG1vZHVsZTogJW0iKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEFzc2lnbiBwcGEgYWNjb3JkaW5nIHRvIHRoZSB1bml0IG51bWJlciByZXR1cm5lZCBieSBwcHAgZGV2aWNlCi0gICAgICogYWZ0ZXIgcGx1bWJpbmcgaXMgY29tcGxldGVkIGFib3ZlLgotICAgICAqLwotICAgIGlmIChzaWZwcGEoaWZkLCBpZnVuaXQpIDwgMCkgewotICAgICAgICBjbG9zZSAoaWZkKTsKLSNpZiBkZWZpbmVkKElORVQ2KQotCWNsb3NlKGk2ZmQpOwotI2VuZGlmIC8qIGRlZmluZWQoSU5FVDYpICovCi0gICAgICAgIGZhdGFsKCJDYW4ndCBzZXQgcHBhIGZvciB1bml0ICVkOiAlbSIsIGlmdW5pdCk7Ci0gICAgfQotCi0jaWYgZGVmaW5lZChJTkVUNikKLSAgICAvKgotICAgICAqIEFuIElQdjYgaW50ZXJmYWNlIGlzIGNyZWF0ZWQgYW55d2F5LCBldmVuIHdoZW4gdGhlIHVzZXIgZG9lcyBub3QgCi0gICAgICogZXhwbGljaXRseSBlbmFibGUgaXQuIE5vdGUgdGhhdCB0aGUgaW50ZXJmYWNlIHdpbGwgYmUgbWFya2VkCi0gICAgICogSVB2NiBkdXJpbmcgc2xpZm5hbWUoKS4KLSAgICAgKi8KLSAgICBpZiAoaW9jdGwoaTZmZCwgSV9QVVNILCBJUF9NT0RfTkFNRSkgPCAwKSB7Ci0JY2xvc2UoaWZkKTsKLQljbG9zZShpNmZkKTsKLQlmYXRhbCgiQ2FuJ3QgcHVzaCBJUCBtb2R1bGUgKDIpOiAlbSIpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQXNzaWduIHBwYSBhY2NvcmRpbmcgdG8gdGhlIHVuaXQgbnVtYmVyIHJldHVybmVkIGJ5IHBwcCBkZXZpY2UKLSAgICAgKiBhZnRlciBwbHVtYmluZyBpcyBjb21wbGV0ZWQgYWJvdmUuIEluIGFkZGl0aW9uLCBtYXJrIHRoZSBpbnRlcmZhY2UKLSAgICAgKiBhcyBhbiBJUHY2IGludGVyZmFjZS4KLSAgICAgKi8KLSAgICBpZiAoc2xpZm5hbWUoaTZmZCwgaWZ1bml0KSA8IDApIHsKLQljbG9zZShpZmQpOwotCWNsb3NlKGk2ZmQpOwotCWZhdGFsKCJDYW4ndCBzZXQgaWZuYW1lIGZvciB1bml0ICVkOiAlbSIsIGlmdW5pdCk7Ci0gICAgfQotI2VuZGlmIC8qIGRlZmluZWQoSU5FVDYpICovCi0KLSAgICBpcG11eGlkID0gaW9jdGwoaXBmZCwgSV9QTElOSywgaWZkKTsKLSAgICBjbG9zZShpZmQpOwotICAgIGlmIChpcG11eGlkIDwgMCkgewotI2lmIGRlZmluZWQoSU5FVDYpCi0JY2xvc2UoaTZmZCk7Ci0jZW5kaWYgLyogZGVmaW5lZChJTkVUNikgKi8KLQlmYXRhbCgiQ2FuJ3QgSV9QTElOSyBQUFAgZGV2aWNlIHRvIElQOiAlbSIpOwotICAgIH0KLQotICAgIG1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7Ci0gICAgc3ByaW50ZihpZnIuaWZyX25hbWUsICIlcyIsIGlmbmFtZSk7Ci0gICAgaWZyLmlmcl9pcF9tdXhpZCA9IGlwbXV4aWQ7Ci0KLSAgICAvKgotICAgICAqIEluIFNvbCA4IGFuZCBsYXRlciwgU1RSRUFNUyBkeW5hbWljIG1vZHVsZSBwbHVtYmluZyBmZWF0dXJlIGV4aXN0cy4KLSAgICAgKiBUaGlzIGlzIHNvIHRoYXQgYW4gYXJiaXRyYXJ5IG1vZHVsZSBjYW4gYmUgaW5zZXJ0ZWQsIG9yIGRlbGV0ZWQsIAotICAgICAqIGJldHdlZW4gaXAgbW9kdWxlIGFuZCB0aGUgZGV2aWNlIGRyaXZlciB3aXRob3V0IHRlYXJpbmcgZG93biB0aGUgCi0gICAgICogZXhpc3Rpbmcgc3RyZWFtLiBTdWNoIGZlYXR1cmUgcmVxdWlyZXMgdGhlIG11eCBpZHMsIHdoaWNoIGlzIHNldCAKLSAgICAgKiBieSBTSU9DU0lGTVVYSUQgKG9yIFNJT0NMU0lGTVVYSUQpLgotICAgICAqLwotICAgIGlmIChpb2N0bChpcGZkLCBTSU9DU0lGTVVYSUQsICZpZnIpIDwgMCkgewotCWlvY3RsKGlwZmQsIElfUFVOTElOSywgaXBtdXhpZCk7Ci0jaWYgZGVmaW5lZChJTkVUNikKLQljbG9zZShpNmZkKTsKLSNlbmRpZiAvKiBkZWZpbmVkKElORVQ2KSAqLwotCWZhdGFsKCJTSU9DU0lGTVVYSUQ6ICVtIik7Ci0gICAgfQotCi0jZWxzZSAvKiBlbHNlIGlmICFkZWZpbmVkKFNPTDIpICovCi0KLSAgICBpZiAoZGxwaV9hdHRhY2goaWZkLCBpZnVuaXQpIDwgMCB8fAotCWRscGlfZ2V0X3JlcGx5KGlmZCwgJnJlcGx5LnByaW0sIERMX09LX0FDSywgc2l6ZW9mKHJlcGx5KSkgPCAwKSB7Ci0JY2xvc2UoaWZkKTsKLQlmYXRhbCgiQ2FuJ3QgYXR0YWNoIHRvIHBwcCVkOiAlbSIsIGlmdW5pdCk7Ci0gICAgfQotCi0gICAgaXBtdXhpZCA9IGlvY3RsKGlwZmQsIElfTElOSywgaWZkKTsKLSAgICBjbG9zZShpZmQpOwotICAgIGlmIChpcG11eGlkIDwgMCkKLQlmYXRhbCgiQ2FuJ3QgbGluayBQUFAgZGV2aWNlIHRvIElQOiAlbSIpOwotI2VuZGlmIC8qIGRlZmluZWQoU09MMikgKi8KLQotI2lmIGRlZmluZWQoSU5FVDYpICYmIGRlZmluZWQoU09MMikKLSAgICBpcDZtdXhpZCA9IGlvY3RsKGlwNmZkLCBJX1BMSU5LLCBpNmZkKTsKLSAgICBjbG9zZShpNmZkKTsKLSAgICBpZiAoaXA2bXV4aWQgPCAwKSB7Ci0JaW9jdGwoaXBmZCwgSV9QVU5MSU5LLCBpcG11eGlkKTsKLQlmYXRhbCgiQ2FuJ3QgSV9QTElOSyBQUFAgZGV2aWNlIHRvIElQICgyKTogJW0iKTsKLSAgICB9Ci0KLSAgICBtZW1zZXQoJmxpZnIsIDAsIHNpemVvZihsaWZyKSk7Ci0gICAgc3ByaW50ZihsaWZyLmxpZnJfbmFtZSwgIiVzIiwgaWZuYW1lKTsKLSAgICBsaWZyLmxpZnJfaXBfbXV4aWQgPSBpcDZtdXhpZDsKLQotICAgIC8qCi0gICAgICogTGV0IElQIGtub3cgb2YgdGhlIG11eCBpZCBbc2VlIGNvbW1lbnQgZm9yIFNJT0NTSUZNVVhJRCBhYm92ZV0KLSAgICAgKi8KLSAgICBpZiAoaW9jdGwoaXA2ZmQsIFNJT0NTTElGTVVYSUQsICZsaWZyKSA8IDApIHsKLQlpb2N0bChpcGZkLCBJX1BVTkxJTkssIGlwbXV4aWQpOwotCWlvY3RsKGlwNmZkLCBJX1BVTkxJTkssIGlwNm11eGlkKTsKLQlmYXRhbCgiQ2FuJ3QgbGluayBQUFAgZGV2aWNlIHRvIElQICgyKTogJW0iKTsKLSAgICB9Ci0jZW5kaWYgLyogZGVmaW5lZChJTkVUNikgJiYgZGVmaW5lZChTT0wyKSAqLwotCi0jaWYgIWRlZmluZWQoU09MMikKLSAgICAvKiBTZXQgdGhlIGludGVyZmFjZSBuYW1lIGZvciB0aGUgbGluay4gKi8KLSAgICBzbHByaW50ZihpZnIuaWZyX25hbWUsIHNpemVvZihpZnIuaWZyX25hbWUpLCBQUFBfRFJWX05BTUUgIiVkIiwgaWZ1bml0KTsKLSAgICBpZnIuaWZyX21ldHJpYyA9IGlwbXV4aWQ7Ci0gICAgaWYgKHN0cmlvY3RsKGlwZmQsIFNJT0NTSUZOQU1FLCAoY2hhciAqKSZpZnIsIHNpemVvZiBpZnIsIDApIDwgMCkKLQlmYXRhbCgiQ2FuJ3Qgc2V0IGludGVyZmFjZSBuYW1lICVzOiAlbSIsIGlmci5pZnJfbmFtZSk7Ci0jZW5kaWYgLyogIWRlZmluZWQoU09MMikgKi8KLQotICAgIG5fcG9sbGZkcyA9IDA7Ci19Ci0KLS8qCi0gKiBzeXNfY2xlYW51cCAtIHJlc3RvcmUgYW55IHN5c3RlbSBzdGF0ZSB3ZSBtb2RpZmllZCBiZWZvcmUgZXhpdGluZzoKLSAqIG1hcmsgdGhlIGludGVyZmFjZSBkb3duLCBkZWxldGUgZGVmYXVsdCByb3V0ZSBhbmQvb3IgcHJveHkgYXJwIGVudHJ5LgotICogVGhpcyBzaG91bGQgY2FsbCBkaWUoKSBiZWNhdXNlIGl0J3MgY2FsbGVkIGZyb20gZGllKCkuCi0gKi8KLXZvaWQKLXN5c19jbGVhbnVwKCkKLXsKLSNpZiBkZWZpbmVkKFNPTDIpCi0gICAgc3RydWN0IGlmcmVxIGlmcjsKLSNpZiBkZWZpbmVkKElORVQ2KQotICAgIHN0cnVjdCBsaWZyZXEgbGlmcjsKLSNlbmRpZiAvKiBkZWZpbmVkKElORVQ2KSAqLwotI2VuZGlmIC8qIGRlZmluZWQoU09MMikgKi8KLQotI2lmIGRlZmluZWQoU09MMikgJiYgZGVmaW5lZChJTkVUNikKLSAgICBpZiAoaWY2X2lzX3VwKQotCXNpZjZkb3duKDApOwotI2VuZGlmIC8qIGRlZmluZWQoU09MMikgJiYgZGVmaW5lZChJTkVUNikgKi8KLSAgICBpZiAoaWZfaXNfdXApCi0Jc2lmZG93bigwKTsKLSAgICBpZiAoZGVmYXVsdF9yb3V0ZV9nYXRld2F5KQotCWNpZmRlZmF1bHRyb3V0ZSgwLCBkZWZhdWx0X3JvdXRlX2dhdGV3YXksIGRlZmF1bHRfcm91dGVfZ2F0ZXdheSk7Ci0gICAgaWYgKHByb3h5X2FycF9hZGRyKQotCWNpZnByb3h5YXJwKDAsIHByb3h5X2FycF9hZGRyKTsKLSNpZiBkZWZpbmVkKFNPTDIpCi0gICAgLyoKLSAgICAgKiBNYWtlIHN1cmUgd2UgYXNrIGlwIHdoYXQgdGhlIG11eGlkLCBiZWNhdXNlICdpZmNvbmZpZyBtb2RsaXN0JyB3aWxsCi0gICAgICogdW5saW5rIGFuZCByZS1saW5rIHRoZSBtb2R1bGVzLCBjYXVzaW5nIHRoZSBtdXhpZCB0byBjaGFuZ2UuCi0gICAgICovCi0gICAgbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKLSAgICBzcHJpbnRmKGlmci5pZnJfbmFtZSwgIiVzIiwgaWZuYW1lKTsKLSAgICBpZiAoaW9jdGwoaXBmZCwgU0lPQ0dJRkZMQUdTLCAmaWZyKSA8IDApIHsKLQllcnJvcigiU0lPQ0dJRkZMQUdTOiAlbSIpOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoaW9jdGwoaXBmZCwgU0lPQ0dJRk1VWElELCAmaWZyKSA8IDApIHsKLQllcnJvcigiU0lPQ0dJRk1VWElEOiAlbSIpOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICBpcG11eGlkID0gaWZyLmlmcl9pcF9tdXhpZDsKLSAgICAgCi0gICAgaWYgKGlvY3RsKGlwZmQsIElfUFVOTElOSywgaXBtdXhpZCkgPCAwKSB7Ci0JZXJyb3IoIkNhbid0IElfUFVOTElOSyBQUFAgZnJvbSBJUDogJW0iKTsKLQlyZXR1cm47Ci0gICAgfQotI2lmIGRlZmluZWQoSU5FVDYpCi0gICAgLyoKLSAgICAgKiBNYWtlIHN1cmUgd2UgYXNrIGlwIHdoYXQgdGhlIG11eGlkLCBiZWNhdXNlICdpZmNvbmZpZyBtb2RsaXN0JyB3aWxsCi0gICAgICogdW5saW5rIGFuZCByZS1saW5rIHRoZSBtb2R1bGVzLCBjYXVzaW5nIHRoZSBtdXhpZCB0byBjaGFuZ2UuCi0gICAgICovCi0gICAgbWVtc2V0KCZsaWZyLCAwLCBzaXplb2YobGlmcikpOwotICAgIHNwcmludGYobGlmci5saWZyX25hbWUsICIlcyIsIGlmbmFtZSk7Ci0gICAgaWYgKGlvY3RsKGlwNmZkLCBTSU9DR0xJRkZMQUdTLCAmbGlmcikgPCAwKSB7Ci0JZXJyb3IoIlNJT0NHTElGRkxBR1M6ICVtIik7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChpb2N0bChpcDZmZCwgU0lPQ0dMSUZNVVhJRCwgJmxpZnIpIDwgMCkgewotCWVycm9yKCJTSU9DR0xJRk1VWElEOiAlbSIpOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICBpcDZtdXhpZCA9IGxpZnIubGlmcl9pcF9tdXhpZDsKLQotICAgIGlmIChpb2N0bChpcDZmZCwgSV9QVU5MSU5LLCBpcDZtdXhpZCkgPCAwKSB7Ci0JZXJyb3IoIkNhbid0IElfUFVOTElOSyBQUFAgZnJvbSBJUCAoMik6ICVtIik7Ci0gICAgfQotI2VuZGlmIC8qIGRlZmluZWQoSU5FVDYpICovCi0jZW5kaWYgLyogZGVmaW5lZChTT0wyKSAqLwotfQotCi0vKgotICogc3lzX2Nsb3NlIC0gQ2xlYW4gdXAgaW4gYSBjaGlsZCBwcm9jZXNzIGJlZm9yZSBleGVjaW5nLgotICovCi12b2lkCi1zeXNfY2xvc2UoKQotewotICAgIGNsb3NlKGlwZmQpOwotI2lmIGRlZmluZWQoSU5FVDYpICYmIGRlZmluZWQoU09MMikKLSAgICBjbG9zZShpcDZmZCk7Ci0jZW5kaWYgLyogZGVmaW5lZChJTkVUNikgJiYgZGVmaW5lZChTT0wyKSAqLwotICAgIGlmIChwcHBmZCA+PSAwKQotCWNsb3NlKHBwcGZkKTsKLX0KLQotLyoKLSAqIHN5c19jaGVja19vcHRpb25zIC0gY2hlY2sgdGhlIG9wdGlvbnMgdGhhdCB0aGUgdXNlciBzcGVjaWZpZWQKLSAqLwotaW50Ci1zeXNfY2hlY2tfb3B0aW9ucygpCi17Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLSNpZiAwCi0vKgotICogZGFlbW9uIC0gRGV0YWNoIHVzIGZyb20gY29udHJvbGxpbmcgdGVybWluYWwgc2Vzc2lvbi4KLSAqLwotaW50Ci1kYWVtb24obm9jaGRpciwgbm9jbG9zZSkKLSAgICBpbnQgbm9jaGRpciwgbm9jbG9zZTsKLXsKLSAgICBpbnQgcGlkOwotCi0gICAgaWYgKChwaWQgPSBmb3JrKCkpIDwgMCkKLQlyZXR1cm4gLTE7Ci0gICAgaWYgKHBpZCAhPSAwKQotCWV4aXQoMCk7CQkvKiBwYXJlbnQgZGllcyAqLwotICAgIHNldHNpZCgpOwotICAgIGlmICghbm9jaGRpcikKLQljaGRpcigiLyIpOwotICAgIGlmICghbm9jbG9zZSkgewotCWZjbG9zZShzdGRpbik7CQkvKiBkb24ndCBuZWVkIHN0ZGluLCBzdGRvdXQsIHN0ZGVyciAqLwotCWZjbG9zZShzdGRvdXQpOwotCWZjbG9zZShzdGRlcnIpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCi0vKgotICogcHBwX2F2YWlsYWJsZSAtIGNoZWNrIHdoZXRoZXIgdGhlIHN5c3RlbSBoYXMgYW55IHBwcCBpbnRlcmZhY2VzCi0gKi8KLWludAotcHBwX2F2YWlsYWJsZSgpCi17Ci0gICAgc3RydWN0IHN0YXQgYnVmOwotCi0gICAgcmV0dXJuIHN0YXQoUFBQX0RFVl9OQU1FLCAmYnVmKSA+PSAwOwotfQotCi0vKgotICogYW55X2NvbXByZXNzaW9ucyAtIHNlZSBpZiBjb21wcmVzc2lvbiBpcyBlbmFibGVkIG9yIG5vdAotICoKLSAqIEluIHRoZSBTVFJFQU1TIGltcGxlbWVudGF0aW9uIG9mIGtlcm5lbC1wb3J0aW9uIHBwcGQsCi0gKiB0aGUgY29tcCBTVFJFQU1TIG1vZHVsZSBwZXJmb3JtcyB0aGUgQUNGQywgUEZDLCBhcyB3ZWxsCi0gKiBDQ1AgYW5kIFZKIGNvbXByZXNzaW9ucy4gSG93ZXZlciwgaWYgdGhlIHVzZXIgaGFzIGV4cGxpY2l0bHkKLSAqIGRlY2xhcmUgdG8gbm90IGVuYWJsZSB0aGVtIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgdGhlcmUgaXMKLSAqIG5vIHBvaW50IG9mIGhhdmluZyB0aGUgY29tcCBtb2R1bGUgYmUgcHVzaGVkIG9uIHRoZSBzdHJlYW0uCi0gKi8KLXN0YXRpYyBpbnQKLWFueV9jb21wcmVzc2lvbnMoKQotewotICAgIGlmICgoIWxjcF93YW50b3B0aW9uc1swXS5uZWdfYWNjb21wcmVzc2lvbikgJiYKLQkoIWxjcF93YW50b3B0aW9uc1swXS5uZWdfcGNvbXByZXNzaW9uKSAmJgotCSghY2NwX3Byb3RlbnQuZW5hYmxlZF9mbGFnKSAmJgotCSghaXBjcF93YW50b3B0aW9uc1swXS5uZWdfdmopKSB7Ci0JICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotLyoKLSAqIHR0eV9lc3RhYmxpc2hfcHBwIC0gVHVybiB0aGUgc2VyaWFsIHBvcnQgaW50byBhIHBwcCBpbnRlcmZhY2UuCi0gKi8KLWludAotdHR5X2VzdGFibGlzaF9wcHAoZmQpCi0gICAgaW50IGZkOwotewotICAgIGludCBpOwotCi0gICAgLyogUG9wIGFueSBleGlzdGluZyBtb2R1bGVzIG9mZiB0aGUgdHR5IHN0cmVhbS4gKi8KLSAgICBmb3IgKGkgPSAwOzsgKytpKQotCWlmIChpb2N0bChmZCwgSV9MT09LLCB0dHlfbW9kdWxlc1tpXSkgPCAwCi0JICAgIHx8IHN0cmNtcCh0dHlfbW9kdWxlc1tpXSwgInB0ZW0iKSA9PSAwCi0JICAgIHx8IGlvY3RsKGZkLCBJX1BPUCwgMCkgPCAwKQotCSAgICBicmVhazsKLSAgICB0dHlfbm1vZHVsZXMgPSBpOwotCi0gICAgLyogUHVzaCB0aGUgYXN5bmMgaGRsYyBtb2R1bGUgYW5kIHRoZSBjb21wcmVzc29yIG1vZHVsZS4gKi8KLSAgICB0dHlfbnB1c2hlZCA9IDA7Ci0KLSAgICBpZighc3luY19zZXJpYWwpIHsKLSAgICAgICAgaWYgKGlvY3RsKGZkLCBJX1BVU0gsIEFIRExDX01PRF9OQU1FKSA8IDApIHsKLSAgICAgICAgICAgIGVycm9yKCJDb3VsZG4ndCBwdXNoIFBQUCBBc3luYyBIRExDIG1vZHVsZTogJW0iKTsKLQkgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgICsrdHR5X25wdXNoZWQ7Ci0gICAgfQotICAgIGlmIChrZGVidWdmbGFnICYgNCkgewotCWkgPSBQUFBEQkdfTE9HICsgUFBQREJHX0FIRExDOwotCXN0cmlvY3RsKHBwcGZkLCBQUFBJT19ERUJVRywgJmksIHNpemVvZihpbnQpLCAwKTsKLSAgICB9Ci0gICAgLyoKLSAgICAgKiBUaGVyZSdzIG5vIG5lZWQgdG8gcHVzaCBjb21wIG1vZHVsZSBpZiB3ZSBkb24ndCBpbnRlbmQKLSAgICAgKiB0byBjb21wcmVzcyBhbnl0aGluZwotICAgICAqLwotICAgIGlmIChhbnlfY29tcHJlc3Npb25zKCkpIHsgCi0gICAgICAgIGlmIChpb2N0bChmZCwgSV9QVVNILCBDT01QX01PRF9OQU1FKSA8IDApCi0JICAgIGVycm9yKCJDb3VsZG4ndCBwdXNoIFBQUCBjb21wcmVzc2lvbiBtb2R1bGU6ICVtIik7Ci0JZWxzZQotCSAgICArK3R0eV9ucHVzaGVkOwotICAgIH0KLQotICAgIGlmIChrZGVidWdmbGFnICYgMikgewotCWkgPSBQUFBEQkdfTE9HOyAKLQlpZiAoYW55X2NvbXByZXNzaW9ucygpKQotCSAgICBpICs9IFBQUERCR19DT01QOwotCXN0cmlvY3RsKHBwcGZkLCBQUFBJT19ERUJVRywgJmksIHNpemVvZihpbnQpLCAwKTsKLSAgICB9Ci0KLSAgICAvKiBMaW5rIHRoZSBzZXJpYWwgcG9ydCB1bmRlciB0aGUgUFBQIG11bHRpcGxleG9yLiAqLwotICAgIGlmICgoZmRtdXhpZCA9IGlvY3RsKHBwcGZkLCBJX0xJTkssIGZkKSkgPCAwKSB7Ci0JZXJyb3IoIkNhbid0IGxpbmsgdHR5IHRvIFBQUCBtdXg6ICVtIik7Ci0JcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHJldHVybiBwcHBmZDsKLX0KLQotLyoKLSAqIHR0eV9kaXNlc3RhYmxpc2hfcHBwIC0gUmVzdG9yZSB0aGUgc2VyaWFsIHBvcnQgdG8gbm9ybWFsIG9wZXJhdGlvbi4KLSAqIEl0IGF0dGVtcHRzIHRvIHJlY29uc3RydWN0IHRoZSBzdHJlYW0gd2l0aCB0aGUgcHJldmlvdXNseSBwb3BwZWQKLSAqIG1vZHVsZXMuICBUaGlzIHNob3VsZG4ndCBjYWxsIGRpZSgpIGJlY2F1c2UgaXQncyBjYWxsZWQgZnJvbSBkaWUoKS4KLSAqLwotdm9pZAotdHR5X2Rpc2VzdGFibGlzaF9wcHAoZmQpCi0gICAgaW50IGZkOwotewotICAgIGludCBpOwotCi0gICAgaWYgKGZkbXV4aWQgPj0gMCkgewotCWlmIChpb2N0bChwcHBmZCwgSV9VTkxJTkssIGZkbXV4aWQpIDwgMCkgewotCSAgICBpZiAoIWh1bmd1cCkKLQkJZXJyb3IoIkNhbid0IHVubGluayB0dHkgZnJvbSBQUFAgbXV4OiAlbSIpOwotCX0KLQlmZG11eGlkID0gLTE7Ci0KLQlpZiAoIWh1bmd1cCkgewotCSAgICB3aGlsZSAodHR5X25wdXNoZWQgPiAwICYmIGlvY3RsKGZkLCBJX1BPUCwgMCkgPj0gMCkKLQkJLS10dHlfbnB1c2hlZDsKLQkgICAgZm9yIChpID0gdHR5X25tb2R1bGVzIC0gMTsgaSA+PSAwOyAtLWkpCi0JCWlmIChpb2N0bChmZCwgSV9QVVNILCB0dHlfbW9kdWxlc1tpXSkgPCAwKQotCQkgICAgZXJyb3IoIkNvdWxkbid0IHJlc3RvcmUgdHR5IG1vZHVsZSAlczogJW0iLAotCQkJICAgdHR5X21vZHVsZXNbaV0pOwotCX0KLQlpZiAoaHVuZ3VwICYmIGRlZmF1bHRfZGV2aWNlICYmIHR0eV9zaWQgPiAwKSB7Ci0JICAgIC8qCi0JICAgICAqIElmIHdlIGhhdmUgcmVjZWl2ZWQgYSBoYW5ndXAsIHdlIG5lZWQgdG8gc2VuZCBhIFNJR0hVUAotCSAgICAgKiB0byB0aGUgdGVybWluYWwncyBjb250cm9sbGluZyBwcm9jZXNzLiAgVGhlIHJlYXNvbiBpcwotCSAgICAgKiB0aGF0IHRoZSBvcmlnaW5hbCBzdHJlYW0gaGVhZCBmb3IgdGhlIHRlcm1pbmFsIGhhc24ndAotCSAgICAgKiBzZWVuIHRoZSBNX0hBTkdVUCBtZXNzYWdlIChpdCB3ZW50IHVwIHRocm91Z2ggdGhlIHBwcAotCSAgICAgKiBkcml2ZXIgdG8gdGhlIHN0cmVhbSBoZWFkIGZvciBvdXIgZmQgdG8gL2Rldi9wcHApLgotCSAgICAgKi8KLQkgICAga2lsbCh0dHlfc2lkLCBTSUdIVVApOwotCX0KLSAgICB9Ci19Ci0KLS8qCi0gKiBDaGVjayB3aGV0aGVyIHRoZSBsaW5rIHNlZW1zIG5vdCB0byBiZSA4LWJpdCBjbGVhbi4KLSAqLwotdm9pZAotY2xlYW5fY2hlY2soKQotewotICAgIGludCB4OwotICAgIGNoYXIgKnM7Ci0KLSAgICBpZiAoc3RyaW9jdGwocHBwZmQsIFBQUElPX0dDTEVBTiwgJngsIDAsIHNpemVvZih4KSkgPCAwKQotCXJldHVybjsKLSAgICBzID0gTlVMTDsKLSAgICBzd2l0Y2ggKH54KSB7Ci0gICAgY2FzZSBSQ1ZfQjdfMDoKLQlzID0gImJpdCA3IHNldCB0byAxIjsKLQlicmVhazsKLSAgICBjYXNlIFJDVl9CN18xOgotCXMgPSAiYml0IDcgc2V0IHRvIDAiOwotCWJyZWFrOwotICAgIGNhc2UgUkNWX0VWTlA6Ci0JcyA9ICJvZGQgcGFyaXR5IjsKLQlicmVhazsKLSAgICBjYXNlIFJDVl9PRERQOgotCXMgPSAiZXZlbiBwYXJpdHkiOwotCWJyZWFrOwotICAgIH0KLSAgICBpZiAocyAhPSBOVUxMKSB7Ci0Jd2FybigiU2VyaWFsIGxpbmsgaXMgbm90IDgtYml0IGNsZWFuOiIpOwotCXdhcm4oIkFsbCByZWNlaXZlZCBjaGFyYWN0ZXJzIGhhZCAlcyIsIHMpOwotICAgIH0KLX0KLQotLyoKLSAqIExpc3Qgb2YgdmFsaWQgc3BlZWRzLgotICovCi1zdHJ1Y3Qgc3BlZWQgewotICAgIGludCBzcGVlZF9pbnQsIHNwZWVkX3ZhbDsKLX0gc3BlZWRzW10gPSB7Ci0jaWZkZWYgQjUwCi0gICAgeyA1MCwgQjUwIH0sCi0jZW5kaWYKLSNpZmRlZiBCNzUKLSAgICB7IDc1LCBCNzUgfSwKLSNlbmRpZgotI2lmZGVmIEIxMTAKLSAgICB7IDExMCwgQjExMCB9LAotI2VuZGlmCi0jaWZkZWYgQjEzNAotICAgIHsgMTM0LCBCMTM0IH0sCi0jZW5kaWYKLSNpZmRlZiBCMTUwCi0gICAgeyAxNTAsIEIxNTAgfSwKLSNlbmRpZgotI2lmZGVmIEIyMDAKLSAgICB7IDIwMCwgQjIwMCB9LAotI2VuZGlmCi0jaWZkZWYgQjMwMAotICAgIHsgMzAwLCBCMzAwIH0sCi0jZW5kaWYKLSNpZmRlZiBCNjAwCi0gICAgeyA2MDAsIEI2MDAgfSwKLSNlbmRpZgotI2lmZGVmIEIxMjAwCi0gICAgeyAxMjAwLCBCMTIwMCB9LAotI2VuZGlmCi0jaWZkZWYgQjE4MDAKLSAgICB7IDE4MDAsIEIxODAwIH0sCi0jZW5kaWYKLSNpZmRlZiBCMjAwMAotICAgIHsgMjAwMCwgQjIwMDAgfSwKLSNlbmRpZgotI2lmZGVmIEIyNDAwCi0gICAgeyAyNDAwLCBCMjQwMCB9LAotI2VuZGlmCi0jaWZkZWYgQjM2MDAKLSAgICB7IDM2MDAsIEIzNjAwIH0sCi0jZW5kaWYKLSNpZmRlZiBCNDgwMAotICAgIHsgNDgwMCwgQjQ4MDAgfSwKLSNlbmRpZgotI2lmZGVmIEI3MjAwCi0gICAgeyA3MjAwLCBCNzIwMCB9LAotI2VuZGlmCi0jaWZkZWYgQjk2MDAKLSAgICB7IDk2MDAsIEI5NjAwIH0sCi0jZW5kaWYKLSNpZmRlZiBCMTkyMDAKLSAgICB7IDE5MjAwLCBCMTkyMDAgfSwKLSNlbmRpZgotI2lmZGVmIEIzODQwMAotICAgIHsgMzg0MDAsIEIzODQwMCB9LAotI2VuZGlmCi0jaWZkZWYgRVhUQQotICAgIHsgMTkyMDAsIEVYVEEgfSwKLSNlbmRpZgotI2lmZGVmIEVYVEIKLSAgICB7IDM4NDAwLCBFWFRCIH0sCi0jZW5kaWYKLSNpZmRlZiBCNTc2MDAKLSAgICB7IDU3NjAwLCBCNTc2MDAgfSwKLSNlbmRpZgotI2lmZGVmIEI3NjgwMAotICAgIHsgNzY4MDAsIEI3NjgwMCB9LAotI2VuZGlmCi0jaWZkZWYgQjExNTIwMAotICAgIHsgMTE1MjAwLCBCMTE1MjAwIH0sCi0jZW5kaWYKLSNpZmRlZiBCMTUzNjAwCi0gICAgeyAxNTM2MDAsIEIxNTM2MDAgfSwKLSNlbmRpZgotI2lmZGVmIEIyMzA0MDAKLSAgICB7IDIzMDQwMCwgQjIzMDQwMCB9LAotI2VuZGlmCi0jaWZkZWYgQjMwNzIwMAotICAgIHsgMzA3MjAwLCBCMzA3MjAwIH0sCi0jZW5kaWYKLSNpZmRlZiBCNDYwODAwCi0gICAgeyA0NjA4MDAsIEI0NjA4MDAgfSwKLSNlbmRpZgotICAgIHsgMCwgMCB9Ci19OwotCi0vKgotICogVHJhbnNsYXRlIGZyb20gYml0cy9zZWNvbmQgdG8gYSBzcGVlZF90LgotICovCi1zdGF0aWMgaW50Ci10cmFuc2xhdGVfc3BlZWQoYnBzKQotICAgIGludCBicHM7Ci17Ci0gICAgc3RydWN0IHNwZWVkICpzcGVlZHA7Ci0KLSAgICBpZiAoYnBzID09IDApCi0JcmV0dXJuIDA7Ci0gICAgZm9yIChzcGVlZHAgPSBzcGVlZHM7IHNwZWVkcC0+c3BlZWRfaW50OyBzcGVlZHArKykKLQlpZiAoYnBzID09IHNwZWVkcC0+c3BlZWRfaW50KQotCSAgICByZXR1cm4gc3BlZWRwLT5zcGVlZF92YWw7Ci0gICAgd2Fybigic3BlZWQgJWQgbm90IHN1cHBvcnRlZCIsIGJwcyk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBUcmFuc2xhdGUgZnJvbSBhIHNwZWVkX3QgdG8gYml0cy9zZWNvbmQuCi0gKi8KLXN0YXRpYyBpbnQKLWJhdWRfcmF0ZV9vZihzcGVlZCkKLSAgICBpbnQgc3BlZWQ7Ci17Ci0gICAgc3RydWN0IHNwZWVkICpzcGVlZHA7Ci0KLSAgICBpZiAoc3BlZWQgPT0gMCkKLQlyZXR1cm4gMDsKLSAgICBmb3IgKHNwZWVkcCA9IHNwZWVkczsgc3BlZWRwLT5zcGVlZF9pbnQ7IHNwZWVkcCsrKQotCWlmIChzcGVlZCA9PSBzcGVlZHAtPnNwZWVkX3ZhbCkKLQkgICAgcmV0dXJuIHNwZWVkcC0+c3BlZWRfaW50OwotICAgIHJldHVybiAwOwotfQotCi0vKgotICogc2V0X3VwX3R0eTogU2V0IHVwIHRoZSBzZXJpYWwgcG9ydCBvbiBgZmQnIGZvciA4IGJpdHMsIG5vIHBhcml0eSwKLSAqIGF0IHRoZSByZXF1ZXN0ZWQgc3BlZWQsIGV0Yy4gIElmIGBsb2NhbCcgaXMgdHJ1ZSwgc2V0IENMT0NBTAotICogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBtb2RlbSBvcHRpb24gd2FzIHNwZWNpZmllZC4KLSAqLwotdm9pZAotc2V0X3VwX3R0eShmZCwgbG9jYWwpCi0gICAgaW50IGZkLCBsb2NhbDsKLXsKLSAgICBpbnQgc3BlZWQ7Ci0gICAgc3RydWN0IHRlcm1pb3MgdGlvczsKLSNpZiAhZGVmaW5lZCAoQ1JUU0NUUykKLSAgICBzdHJ1Y3QgdGVybWlveCB0aW94OwotI2VuZGlmCi0KLSAgICBpZiAoIXN5bmNfc2VyaWFsICYmIHRjZ2V0YXR0cihmZCwgJnRpb3MpIDwgMCkKLQlmYXRhbCgidGNnZXRhdHRyOiAlbSIpOwotCi0jaWZuZGVmIENSVFNDVFMKLSAgICB0ZXJtaW94X29rID0gMTsKLSAgICBpZiAoIXN5bmNfc2VyaWFsICYmIGlvY3RsIChmZCwgVENHRVRYLCAmdGlveCkgPCAwKSB7Ci0JdGVybWlveF9vayA9IDA7Ci0JaWYgKGVycm5vICE9IEVOT1RUWSkKLQkgICAgZXJyb3IoIlRDR0VUWDogJW0iKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGlmICghcmVzdG9yZV90ZXJtKSB7Ci0JaW5pdHRlcm1pb3MgPSB0aW9zOwotI2lmbmRlZiBDUlRTQ1RTCi0JaW5pdHRlcm1pb3ggPSB0aW94OwotI2VuZGlmCi0JaWYgKCFzeW5jX3NlcmlhbCkKLQkgICAgaW9jdGwoZmQsIFRJT0NHV0lOU1osICZ3c2luZm8pOwotICAgIH0KLQotICAgIHRpb3MuY19jZmxhZyAmPSB+KENTSVpFIHwgQ1NUT1BCIHwgUEFSRU5CIHwgQ0xPQ0FMKTsKLSNpZmRlZiBDUlRTQ1RTCi0gICAgaWYgKGNydHNjdHMgPiAwKQotCXRpb3MuY19jZmxhZyB8PSBDUlRTQ1RTOwotICAgIGVsc2UgaWYgKGNydHNjdHMgPCAwKQotCXRpb3MuY19jZmxhZyAmPSB+Q1JUU0NUUzsKLSNlbHNlCi0gICAgaWYgKGNydHNjdHMgIT0gMCAmJiAhdGVybWlveF9vaykgewotCWVycm9yKCJDYW4ndCBzZXQgUlRTL0NUUyBmbG93IGNvbnRyb2wiKTsKLSAgICB9IGVsc2UgaWYgKGNydHNjdHMgPiAwKSB7Ci0JdGlveC54X2hmbGFnIHw9IFJUU1hPRkZ8Q1RTWE9OOwotICAgIH0gZWxzZSBpZiAoY3J0c2N0cyA8IDApIHsKLQl0aW94LnhfaGZsYWcgJj0gfihSVFNYT0ZGfENUU1hPTik7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpZiAoc3RvcF9iaXRzID49IDIpCi0JdGlvcy5jX2NmbGFnIHw9IENTVE9QQjsKLQotICAgIHRpb3MuY19jZmxhZyB8PSBDUzggfCBDUkVBRCB8IEhVUENMOwotICAgIGlmIChsb2NhbCB8fCAhbW9kZW0pCi0JdGlvcy5jX2NmbGFnIHw9IENMT0NBTDsKLSAgICB0aW9zLmNfaWZsYWcgPSBJR05CUksgfCBJR05QQVI7Ci0gICAgdGlvcy5jX29mbGFnID0gMDsKLSAgICB0aW9zLmNfbGZsYWcgPSAwOwotICAgIHRpb3MuY19jY1tWTUlOXSA9IDE7Ci0gICAgdGlvcy5jX2NjW1ZUSU1FXSA9IDA7Ci0KLSAgICBpZiAoY3J0c2N0cyA9PSAtMikgewotCXRpb3MuY19pZmxhZyB8PSBJWE9OIHwgSVhPRkY7Ci0JdGlvcy5jX2NjW1ZTVE9QXSA9IDB4MTM7CS8qIERDMyA9IFhPRkYgPSBeUyAqLwotCXRpb3MuY19jY1tWU1RBUlRdID0gMHgxMTsJLyogREMxID0gWE9OICA9IF5RICovCi0gICAgfQotCi0gICAgc3BlZWQgPSB0cmFuc2xhdGVfc3BlZWQoaW5zcGVlZCk7Ci0gICAgaWYgKHNwZWVkKSB7Ci0JY2ZzZXRvc3BlZWQoJnRpb3MsIHNwZWVkKTsKLQljZnNldGlzcGVlZCgmdGlvcywgc3BlZWQpOwotICAgIH0gZWxzZSB7Ci0Jc3BlZWQgPSBjZmdldG9zcGVlZCgmdGlvcyk7Ci0JLyoKLQkgKiBXZSBjYW4ndCBwcm9jZWVkIGlmIHRoZSBzZXJpYWwgcG9ydCBzcGVlZCBpcyAwLAotCSAqIHNpbmNlIHRoYXQgaW1wbGllcyB0aGF0IHRoZSBzZXJpYWwgcG9ydCBpcyBkaXNhYmxlZC4KLQkgKi8KLQlpZiAoKHNwZWVkID09IEIwKSAmJiAhc3luY19zZXJpYWwpCi0JICAgIGZhdGFsKCJCYXVkIHJhdGUgZm9yICVzIGlzIDA7IG5lZWQgZXhwbGljaXQgYmF1ZCByYXRlIiwgZGV2bmFtKTsKLSAgICB9Ci0KLSAgICBpZiAoIXN5bmNfc2VyaWFsICYmIHRjc2V0YXR0cihmZCwgVENTQUZMVVNILCAmdGlvcykgPCAwKQotCWZhdGFsKCJ0Y3NldGF0dHI6ICVtIik7Ci0KLSNpZm5kZWYgQ1JUU0NUUwotICAgIGlmICghc3luY19zZXJpYWwgJiYgdGVybWlveF9vayAmJiBpb2N0bCAoZmQsIFRDU0VUWEYsICZ0aW94KSA8IDApewotCWVycm9yKCJUQ1NFVFhGOiAlbSIpOwotICAgIH0KLSNlbmRpZgotCi0gICAgYmF1ZF9yYXRlID0gaW5zcGVlZCA9IGJhdWRfcmF0ZV9vZihzcGVlZCk7Ci0gICAgaWYgKCFzeW5jX3NlcmlhbCkKLQlyZXN0b3JlX3Rlcm0gPSAxOwotfQotCi0vKgotICogcmVzdG9yZV90dHkgLSByZXN0b3JlIHRoZSB0ZXJtaW5hbCB0byB0aGUgc2F2ZWQgc2V0dGluZ3MuCi0gKi8KLXZvaWQKLXJlc3RvcmVfdHR5KGZkKQotICAgIGludCBmZDsKLXsKLSAgICBpZiAocmVzdG9yZV90ZXJtKSB7Ci0JaWYgKCFkZWZhdWx0X2RldmljZSkgewotCSAgICAvKgotCSAgICAgKiBUdXJuIG9mZiBlY2hvaW5nLCBiZWNhdXNlIG90aGVyd2lzZSB3ZSBjYW4gZ2V0IGludG8KLQkgICAgICogYSBsb29wIHdpdGggdGhlIHR0eSBhbmQgdGhlIG1vZGVtIGVjaG9pbmcgdG8gZWFjaCBvdGhlci4KLQkgICAgICogV2UgcHJlc3VtZSB3ZSBhcmUgdGhlIHNvbGUgdXNlciBvZiB0aGlzIHR0eSBkZXZpY2UsIHNvCi0JICAgICAqIHdoZW4gd2UgY2xvc2UgaXQsIGl0IHdpbGwgcmV2ZXJ0IHRvIGl0cyBkZWZhdWx0cyBhbnl3YXkuCi0JICAgICAqLwotCSAgICBpbml0dGVybWlvcy5jX2xmbGFnICY9IH4oRUNITyB8IEVDSE9OTCk7Ci0JfQotCWlmICghc3luY19zZXJpYWwgJiYgdGNzZXRhdHRyKGZkLCBUQ1NBRkxVU0gsICZpbml0dGVybWlvcykgPCAwKQotCSAgICBpZiAoIWh1bmd1cCAmJiBlcnJubyAhPSBFTlhJTykKLQkJd2FybigidGNzZXRhdHRyOiAlbSIpOwotI2lmbmRlZiBDUlRTQ1RTCi0JaWYgKCFzeW5jX3NlcmlhbCAmJiBpb2N0bCAoZmQsIFRDU0VUWEYsICZpbml0dGVybWlveCkgPCAwKXsKLQkgICAgaWYgKCFodW5ndXAgJiYgZXJybm8gIT0gRU5YSU8pCi0JCWVycm9yKCJUQ1NFVFhGOiAlbSIpOwotCX0KLSNlbmRpZgotCWlmICghc3luY19zZXJpYWwpCi0JICAgIGlvY3RsKGZkLCBUSU9DU1dJTlNaLCAmd3NpbmZvKTsKLQlyZXN0b3JlX3Rlcm0gPSAwOwotICAgIH0KLX0KLQotLyoKLSAqIHNldGR0ciAtIGNvbnRyb2wgdGhlIERUUiBsaW5lIG9uIHRoZSBzZXJpYWwgcG9ydC4KLSAqIFRoaXMgaXMgY2FsbGVkIGZyb20gZGllKCksIHNvIGl0IHNob3VsZG4ndCBjYWxsIGRpZSgpLgotICovCi12b2lkCi1zZXRkdHIoZmQsIG9uKQotaW50IGZkLCBvbjsKLXsKLSAgICBpbnQgbW9kZW1iaXRzID0gVElPQ01fRFRSOwotCi0gICAgaW9jdGwoZmQsIChvbj8gVElPQ01CSVM6IFRJT0NNQklDKSwgJm1vZGVtYml0cyk7Ci19Ci0KLS8qCi0gKiBvcGVuX2xvb3BiYWNrIC0gb3BlbiB0aGUgZGV2aWNlIHdlIHVzZSBmb3IgZ2V0dGluZyBwYWNrZXRzCi0gKiBpbiBkZW1hbmQgbW9kZS4gIFVuZGVyIFNvbGFyaXMgMiwgd2UgdXNlIG91ciBleGlzdGluZyBmZAotICogdG8gdGhlIHBwcCBkcml2ZXIuCi0gKi8KLWludAotb3Blbl9wcHBfbG9vcGJhY2soKQotewotICAgIHJldHVybiBwcHBmZDsKLX0KLQotLyoKLSAqIG91dHB1dCAtIE91dHB1dCBQUFAgcGFja2V0LgotICovCi12b2lkCi1vdXRwdXQodW5pdCwgcCwgbGVuKQotICAgIGludCB1bml0OwotICAgIHVfY2hhciAqcDsKLSAgICBpbnQgbGVuOwotewotICAgIHN0cnVjdCBzdHJidWYgZGF0YTsKLSAgICBpbnQgcmV0cmllczsKLSAgICBzdHJ1Y3QgcG9sbGZkIHBmZDsKLQotICAgIGR1bXBfcGFja2V0KCJzZW50IiwgcCwgbGVuKTsKLSAgICBpZiAoc25vb3Bfc2VuZF9ob29rKSBzbm9vcF9zZW5kX2hvb2socCwgbGVuKTsKLQotICAgIGRhdGEubGVuID0gbGVuOwotICAgIGRhdGEuYnVmID0gKGNhZGRyX3QpIHA7Ci0gICAgcmV0cmllcyA9IDQ7Ci0gICAgd2hpbGUgKHB1dG1zZyhwcHBmZCwgTlVMTCwgJmRhdGEsIDApIDwgMCkgewotCWlmICgtLXJldHJpZXMgPCAwIHx8IChlcnJubyAhPSBFV09VTERCTE9DSyAmJiBlcnJubyAhPSBFQUdBSU4pKSB7Ci0JICAgIGlmIChlcnJubyAhPSBFTlhJTykKLQkJZXJyb3IoIkNvdWxkbid0IHNlbmQgcGFja2V0OiAlbSIpOwotCSAgICBicmVhazsKLQl9Ci0JcGZkLmZkID0gcHBwZmQ7Ci0JcGZkLmV2ZW50cyA9IFBPTExPVVQ7Ci0JcG9sbCgmcGZkLCAxLCAyNTApOwkvKiB3YWl0IGZvciB1cCB0byAwLjI1IHNlY29uZHMgKi8KLSAgICB9Ci19Ci0KLQotLyoKLSAqIHdhaXRfaW5wdXQgLSB3YWl0IHVudGlsIHRoZXJlIGlzIGRhdGEgYXZhaWxhYmxlLAotICogZm9yIHRoZSBsZW5ndGggb2YgdGltZSBzcGVjaWZpZWQgYnkgKnRpbW8gKGluZGVmaW5pdGUKLSAqIGlmIHRpbW8gaXMgTlVMTCkuCi0gKi8KLXZvaWQKLXdhaXRfaW5wdXQodGltbykKLSAgICBzdHJ1Y3QgdGltZXZhbCAqdGltbzsKLXsKLSAgICBpbnQgdDsKLQotICAgIHQgPSB0aW1vID09IE5VTEw/IC0xOiB0aW1vLT50dl9zZWMgKiAxMDAwICsgdGltby0+dHZfdXNlYyAvIDEwMDA7Ci0gICAgaWYgKHBvbGwocG9sbGZkcywgbl9wb2xsZmRzLCB0KSA8IDAgJiYgZXJybm8gIT0gRUlOVFIpCi0JZmF0YWwoInBvbGw6ICVtIik7Ci19Ci0KLS8qCi0gKiBhZGRfZmQgLSBhZGQgYW4gZmQgdG8gdGhlIHNldCB0aGF0IHdhaXRfaW5wdXQgd2FpdHMgZm9yLgotICovCi12b2lkIGFkZF9mZChmZCkKLSAgICBpbnQgZmQ7Ci17Ci0gICAgaW50IG47Ci0KLSAgICBmb3IgKG4gPSAwOyBuIDwgbl9wb2xsZmRzOyArK24pCi0JaWYgKHBvbGxmZHNbbl0uZmQgPT0gZmQpCi0JICAgIHJldHVybjsKLSAgICBpZiAobl9wb2xsZmRzIDwgTUFYX1BPTExGRFMpIHsKLQlwb2xsZmRzW25fcG9sbGZkc10uZmQgPSBmZDsKLQlwb2xsZmRzW25fcG9sbGZkc10uZXZlbnRzID0gUE9MTElOIHwgUE9MTFBSSSB8IFBPTExIVVA7Ci0JKytuX3BvbGxmZHM7Ci0gICAgfSBlbHNlCi0JZXJyb3IoIlRvbyBtYW55IGlucHV0cyEiKTsKLX0KLQotLyoKLSAqIHJlbW92ZV9mZCAtIHJlbW92ZSBhbiBmZCBmcm9tIHRoZSBzZXQgdGhhdCB3YWl0X2lucHV0IHdhaXRzIGZvci4KLSAqLwotdm9pZCByZW1vdmVfZmQoZmQpCi0gICAgaW50IGZkOwotewotICAgIGludCBuOwotCi0gICAgZm9yIChuID0gMDsgbiA8IG5fcG9sbGZkczsgKytuKSB7Ci0JaWYgKHBvbGxmZHNbbl0uZmQgPT0gZmQpIHsKLQkgICAgd2hpbGUgKCsrbiA8IG5fcG9sbGZkcykKLQkJcG9sbGZkc1tuLTFdID0gcG9sbGZkc1tuXTsKLQkgICAgLS1uX3BvbGxmZHM7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLSNpZiAwCi0vKgotICogd2FpdF9sb29wX291dHB1dCAtIHdhaXQgdW50aWwgdGhlcmUgaXMgZGF0YSBhdmFpbGFibGUgb24gdGhlCi0gKiBsb29wYmFjaywgZm9yIHRoZSBsZW5ndGggb2YgdGltZSBzcGVjaWZpZWQgYnkgKnRpbW8gKGluZGVmaW5pdGUKLSAqIGlmIHRpbW8gaXMgTlVMTCkuCi0gKi8KLXZvaWQKLXdhaXRfbG9vcF9vdXRwdXQodGltbykKLSAgICBzdHJ1Y3QgdGltZXZhbCAqdGltbzsKLXsKLSAgICB3YWl0X2lucHV0KHRpbW8pOwotfQotCi0vKgotICogd2FpdF90aW1lIC0gd2FpdCBmb3IgYSBnaXZlbiBsZW5ndGggb2YgdGltZSBvciB1bnRpbCBhCi0gKiBzaWduYWwgaXMgcmVjZWl2ZWQuCi0gKi8KLXZvaWQKLXdhaXRfdGltZSh0aW1vKQotICAgIHN0cnVjdCB0aW1ldmFsICp0aW1vOwotewotICAgIGludCBuOwotCi0gICAgbiA9IHNlbGVjdCgwLCBOVUxMLCBOVUxMLCBOVUxMLCB0aW1vKTsKLSAgICBpZiAobiA8IDAgJiYgZXJybm8gIT0gRUlOVFIpCi0JZmF0YWwoInNlbGVjdDogJW0iKTsKLX0KLSNlbmRpZgotCi0KLS8qCi0gKiByZWFkX3BhY2tldCAtIGdldCBhIFBQUCBwYWNrZXQgZnJvbSB0aGUgc2VyaWFsIGRldmljZS4KLSAqLwotaW50Ci1yZWFkX3BhY2tldChidWYpCi0gICAgdV9jaGFyICpidWY7Ci17Ci0gICAgc3RydWN0IHN0cmJ1ZiBjdHJsLCBkYXRhOwotICAgIGludCBmbGFncywgbGVuOwotICAgIHVuc2lnbmVkIGNoYXIgY3RybGJ1ZltzaXplb2YodW5pb24gRExfcHJpbWl0aXZlcykgKyA2NF07Ci0KLSAgICBmb3IgKDs7KSB7Ci0JZGF0YS5tYXhsZW4gPSBQUFBfTVJVICsgUFBQX0hEUkxFTjsKLQlkYXRhLmJ1ZiA9IChjYWRkcl90KSBidWY7Ci0JY3RybC5tYXhsZW4gPSBzaXplb2YoY3RybGJ1Zik7Ci0JY3RybC5idWYgPSAoY2FkZHJfdCkgY3RybGJ1ZjsKLQlmbGFncyA9IDA7Ci0JbGVuID0gZ2V0bXNnKHBwcGZkLCAmY3RybCwgJmRhdGEsICZmbGFncyk7Ci0JaWYgKGxlbiA8IDApIHsKLQkgICAgaWYgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFSU5UUikKLQkJcmV0dXJuIC0xOwotCSAgICBmYXRhbCgiRXJyb3IgcmVhZGluZyBwYWNrZXQ6ICVtIik7Ci0JfQotCi0JaWYgKGN0cmwubGVuIDw9IDApCi0JICAgIHJldHVybiBkYXRhLmxlbjsKLQotCS8qCi0JICogR290IGEgTV9QUk9UTyBvciBNX1BDUFJPVE8gbWVzc2FnZS4gIEludGVycHJldCBpdAotCSAqIGFzIGEgRExQSSBwcmltaXRpdmU/PwotCSAqLwotCWlmIChkZWJ1ZykKLQkgICAgZGJnbG9nKCJnb3QgZGxwaSBwcmltIDB4JXgsIGxlbj0lZCIsCi0JCSAgICgodW5pb24gRExfcHJpbWl0aXZlcyAqKWN0cmxidWYpLT5kbF9wcmltaXRpdmUsIGN0cmwubGVuKTsKLQotICAgIH0KLX0KLQotLyoKLSAqIGdldF9sb29wX291dHB1dCAtIGdldCBvdXRnb2luZyBwYWNrZXRzIGZyb20gdGhlIHBwcCBkZXZpY2UsCi0gKiBhbmQgZGV0ZWN0IHdoZW4gd2Ugd2FudCB0byBicmluZyB0aGUgcmVhbCBsaW5rIHVwLgotICogUmV0dXJuIHZhbHVlIGlzIDEgaWYgd2UgbmVlZCB0byBicmluZyB1cCB0aGUgbGluaywgMCBvdGhlcndpc2UuCi0gKi8KLWludAotZ2V0X2xvb3Bfb3V0cHV0KCkKLXsKLSAgICBpbnQgbGVuOwotICAgIGludCBydiA9IDA7Ci0KLSAgICB3aGlsZSAoKGxlbiA9IHJlYWRfcGFja2V0KGlucGFja2V0X2J1ZikpID4gMCkgewotCWlmIChsb29wX2ZyYW1lKGlucGFja2V0X2J1ZiwgbGVuKSkKLQkgICAgcnYgPSAxOwotICAgIH0KLSAgICByZXR1cm4gcnY7Ci19Ci0KLS8qCi0gKiBuZXRpZl9zZXRfbXR1IC0gc2V0IHRoZSBNVFUgb24gdGhlIFBQUCBuZXR3b3JrIGludGVyZmFjZS4KLSAqLwotdm9pZAotbmV0aWZfc2V0X210dSh1bml0LCBtdHUpCi0gICAgaW50IHVuaXQsIG10dTsKLXsKLSAgICBzdHJ1Y3QgaWZyZXEgaWZyOwotI2lmIGRlZmluZWQoSU5FVDYpICYmIGRlZmluZWQoU09MMikKLSAgICBzdHJ1Y3QgbGlmcmVxIGxpZnI7Ci0gICAgaW50CWZkOwotI2VuZGlmIC8qIGRlZmluZWQoSU5FVDYpICYmIGRlZmluZWQoU09MMikgKi8KLQotICAgIG1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7Ci0gICAgc3RybGNweShpZnIuaWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOwotICAgIGlmci5pZnJfbWV0cmljID0gbGlua19tdHU7Ci0gICAgaWYgKGlvY3RsKGlwZmQsIFNJT0NTSUZNVFUsICZpZnIpIDwgMCkgewotCWVycm9yKCJDb3VsZG4ndCBzZXQgSVAgTVRVICglcyk6ICVtIiwgaWZyLmlmcl9uYW1lKTsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKElORVQ2KSAmJiBkZWZpbmVkKFNPTDIpIAotICAgIGZkID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKTsKLSAgICBpZiAoZmQgPCAwKQotCWVycm9yKCJDb3VsZG4ndCBvcGVuIElQdjYgc29ja2V0OiAlbSIpOwotCi0gICAgbWVtc2V0KCZsaWZyLCAwLCBzaXplb2YobGlmcikpOwotICAgIHN0cmxjcHkobGlmci5saWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGxpZnIubGlmcl9uYW1lKSk7Ci0gICAgbGlmci5saWZyX210dSA9IGxpbmtfbXR1OwotICAgIGlmIChpb2N0bChmZCwgU0lPQ1NMSUZNVFUsICZsaWZyKSA8IDApIHsKLQljbG9zZShmZCk7Ci0JZXJyb3IoIkNvdWxkbid0IHNldCBJUHY2IE1UVSAoJXMpOiAlbSIsIGlmci5pZnJfbmFtZSk7Ci0gICAgfQotICAgIGNsb3NlKGZkKTsKLSNlbmRpZiAvKiBkZWZpbmVkKElORVQ2KSAmJiBkZWZpbmVkKFNPTDIpICovCi19Ci0KLS8qCi0gKiB0dHlfc2VuZF9jb25maWcgLSBjb25maWd1cmUgdGhlIHRyYW5zbWl0IGNoYXJhY3RlcmlzdGljcyBvZgotICogdGhlIHBwcCBpbnRlcmZhY2UuCi0gKi8KLXZvaWQKLXR0eV9zZW5kX2NvbmZpZyhtdHUsIGFzeW5jbWFwLCBwY29tcCwgYWNjb21wKQotICAgIGludCBtdHU7Ci0gICAgdV9pbnQzMl90IGFzeW5jbWFwOwotICAgIGludCBwY29tcCwgYWNjb21wOwotewotICAgIGludCBjZlsyXTsKLQotICAgIGxpbmtfbXR1ID0gbXR1OwotICAgIGlmIChzdHJpb2N0bChwcHBmZCwgUFBQSU9fTVRVLCAmbXR1LCBzaXplb2YobXR1KSwgMCkgPCAwKSB7Ci0JaWYgKGh1bmd1cCAmJiBlcnJubyA9PSBFTlhJTykgewotCSAgICArK2Vycm9yX2NvdW50OwotCSAgICByZXR1cm47Ci0JfQotCWVycm9yKCJDb3VsZG4ndCBzZXQgTVRVOiAlbSIpOwotICAgIH0KLSAgICBpZiAoZmRtdXhpZCA+PSAwKSB7Ci0JaWYgKCFzeW5jX3NlcmlhbCkgewotCSAgICBpZiAoc3RyaW9jdGwocHBwZmQsIFBQUElPX1hBQ0NNLCAmYXN5bmNtYXAsIHNpemVvZihhc3luY21hcCksIDApIDwgMCkKLQkJZXJyb3IoIkNvdWxkbid0IHNldCB0cmFuc21pdCBBQ0NNOiAlbSIpOwotCX0KLQljZlswXSA9IChwY29tcD8gQ09NUF9QUk9UOiAwKSArIChhY2NvbXA/IENPTVBfQUM6IDApOwotCWNmWzFdID0gQ09NUF9QUk9UIHwgQ09NUF9BQzsKLQlpZiAoYW55X2NvbXByZXNzaW9ucygpICYmCi0JICAgIHN0cmlvY3RsKHBwcGZkLCBQUFBJT19DRkxBR1MsIGNmLCBzaXplb2YoY2YpLCBzaXplb2YoaW50KSkgPCAwKQotCSAgICBlcnJvcigiQ291bGRuJ3Qgc2V0IHByb3QvQUMgY29tcHJlc3Npb246ICVtIik7Ci0gICAgfQotfQotCi0vKgotICogdHR5X3NldF94YWNjbSAtIHNldCB0aGUgZXh0ZW5kZWQgdHJhbnNtaXQgQUNDTSBmb3IgdGhlIGludGVyZmFjZS4KLSAqLwotdm9pZAotdHR5X3NldF94YWNjbShhY2NtKQotICAgIGV4dF9hY2NtIGFjY207Ci17Ci0gICAgaWYgKHN5bmNfc2VyaWFsKQotCXJldHVybjsKLQotICAgIGlmIChmZG11eGlkID49IDAKLQkmJiBzdHJpb2N0bChwcHBmZCwgUFBQSU9fWEFDQ00sIGFjY20sIHNpemVvZihleHRfYWNjbSksIDApIDwgMCkgewotCWlmICghaHVuZ3VwIHx8IGVycm5vICE9IEVOWElPKQotCSAgICB3YXJuKCJDb3VsZG4ndCBzZXQgZXh0ZW5kZWQgQUNDTTogJW0iKTsKLSAgICB9Ci19Ci0KLS8qCi0gKiB0dHlfcmVjdl9jb25maWcgLSBjb25maWd1cmUgdGhlIHJlY2VpdmUtc2lkZSBjaGFyYWN0ZXJpc3RpY3Mgb2YKLSAqIHRoZSBwcHAgaW50ZXJmYWNlLgotICovCi12b2lkCi10dHlfcmVjdl9jb25maWcobXJ1LCBhc3luY21hcCwgcGNvbXAsIGFjY29tcCkKLSAgICBpbnQgbXJ1OwotICAgIHVfaW50MzJfdCBhc3luY21hcDsKLSAgICBpbnQgcGNvbXAsIGFjY29tcDsKLXsKLSAgICBpbnQgY2ZbMl07Ci0KLSAgICBsaW5rX21ydSA9IG1ydTsKLSAgICBpZiAoc3RyaW9jdGwocHBwZmQsIFBQUElPX01SVSwgJm1ydSwgc2l6ZW9mKG1ydSksIDApIDwgMCkgewotCWlmIChodW5ndXAgJiYgZXJybm8gPT0gRU5YSU8pIHsKLQkgICAgKytlcnJvcl9jb3VudDsKLQkgICAgcmV0dXJuOwotCX0KLQllcnJvcigiQ291bGRuJ3Qgc2V0IE1SVTogJW0iKTsKLSAgICB9Ci0gICAgaWYgKGZkbXV4aWQgPj0gMCkgewotCWlmICghc3luY19zZXJpYWwpIHsKLQkgICAgaWYgKHN0cmlvY3RsKHBwcGZkLCBQUFBJT19SQUNDTSwgJmFzeW5jbWFwLCBzaXplb2YoYXN5bmNtYXApLCAwKSA8IDApCi0JCWVycm9yKCJDb3VsZG4ndCBzZXQgcmVjZWl2ZSBBQ0NNOiAlbSIpOwotCX0KLQljZlswXSA9IChwY29tcD8gREVDT01QX1BST1Q6IDApICsgKGFjY29tcD8gREVDT01QX0FDOiAwKTsKLQljZlsxXSA9IERFQ09NUF9QUk9UIHwgREVDT01QX0FDOwotCWlmIChhbnlfY29tcHJlc3Npb25zKCkgJiYKLQkgICAgc3RyaW9jdGwocHBwZmQsIFBQUElPX0NGTEFHUywgY2YsIHNpemVvZihjZiksIHNpemVvZihpbnQpKSA8IDApCi0JICAgIGVycm9yKCJDb3VsZG4ndCBzZXQgcHJvdC9BQyBkZWNvbXByZXNzaW9uOiAlbSIpOwotICAgIH0KLX0KLQotLyoKLSAqIGNjcF90ZXN0IC0gYXNrIGtlcm5lbCB3aGV0aGVyIGEgZ2l2ZW4gY29tcHJlc3Npb24gbWV0aG9kCi0gKiBpcyBhY2NlcHRhYmxlIGZvciB1c2UuCi0gKi8KLWludAotY2NwX3Rlc3QodW5pdCwgb3B0X3B0ciwgb3B0X2xlbiwgZm9yX3RyYW5zbWl0KQotICAgIGludCB1bml0LCBvcHRfbGVuLCBmb3JfdHJhbnNtaXQ7Ci0gICAgdV9jaGFyICpvcHRfcHRyOwotewotICAgIGlmIChzdHJpb2N0bChwcHBmZCwgKGZvcl90cmFuc21pdD8gUFBQSU9fWENPTVA6IFBQUElPX1JDT01QKSwKLQkJIG9wdF9wdHIsIG9wdF9sZW4sIDApID49IDApCi0JcmV0dXJuIDE7Ci0gICAgcmV0dXJuIChlcnJubyA9PSBFTk9TUik/IDA6IC0xOwotfQotCi0vKgotICogY2NwX2ZsYWdzX3NldCAtIGluZm9ybSBrZXJuZWwgYWJvdXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgQ0NQLgotICovCi12b2lkCi1jY3BfZmxhZ3Nfc2V0KHVuaXQsIGlzb3BlbiwgaXN1cCkKLSAgICBpbnQgdW5pdCwgaXNvcGVuLCBpc3VwOwotewotICAgIGludCBjZlsyXTsKLQotICAgIGNmWzBdID0gKGlzb3Blbj8gQ0NQX0lTT1BFTjogMCkgKyAoaXN1cD8gQ0NQX0lTVVA6IDApOwotICAgIGNmWzFdID0gQ0NQX0lTT1BFTiB8IENDUF9JU1VQIHwgQ0NQX0VSUk9SIHwgQ0NQX0ZBVEFMRVJST1I7Ci0gICAgaWYgKHN0cmlvY3RsKHBwcGZkLCBQUFBJT19DRkxBR1MsIGNmLCBzaXplb2YoY2YpLCBzaXplb2YoaW50KSkgPCAwKSB7Ci0JaWYgKCFodW5ndXAgfHwgZXJybm8gIT0gRU5YSU8pCi0JICAgIGVycm9yKCJDb3VsZG4ndCBzZXQga2VybmVsIENDUCBzdGF0ZTogJW0iKTsKLSAgICB9Ci19Ci0KLS8qCi0gKiBnZXRfaWRsZV90aW1lIC0gcmV0dXJuIGhvdyBsb25nIHRoZSBsaW5rIGhhcyBiZWVuIGlkbGUuCi0gKi8KLWludAotZ2V0X2lkbGVfdGltZSh1LCBpcCkKLSAgICBpbnQgdTsKLSAgICBzdHJ1Y3QgcHBwX2lkbGUgKmlwOwotewotICAgIHJldHVybiBzdHJpb2N0bChwcHBmZCwgUFBQSU9fR0lETEUsIGlwLCAwLCBzaXplb2Yoc3RydWN0IHBwcF9pZGxlKSkgPj0gMDsKLX0KLQotLyoKLSAqIGdldF9wcHBfc3RhdHMgLSByZXR1cm4gc3RhdGlzdGljcyBmb3IgdGhlIGxpbmsuCi0gKi8KLWludAotZ2V0X3BwcF9zdGF0cyh1LCBzdGF0cykKLSAgICBpbnQgdTsKLSAgICBzdHJ1Y3QgcHBwZF9zdGF0cyAqc3RhdHM7Ci17Ci0gICAgc3RydWN0IHBwcF9zdGF0cyBzOwotCi0gICAgaWYgKCFzeW5jX3NlcmlhbCAmJiAKLQlzdHJpb2N0bChwcHBmZCwgUFBQSU9fR0VUU1RBVCwgJnMsIDAsIHNpemVvZihzKSkgPCAwKSB7Ci0JZXJyb3IoIkNvdWxkbid0IGdldCBsaW5rIHN0YXRpc3RpY3M6ICVtIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIHN0YXRzLT5ieXRlc19pbiA9IHMucC5wcHBfaWJ5dGVzOwotICAgIHN0YXRzLT5ieXRlc19vdXQgPSBzLnAucHBwX29ieXRlczsKLSAgICBzdGF0cy0+cGt0c19pbiA9IHMucC5wcHBfaXBhY2tldHM7Ci0gICAgc3RhdHMtPnBrdHNfb3V0ID0gcy5wLnBwcF9vcGFja2V0czsKLSAgICByZXR1cm4gMTsKLX0KLQotI2lmIDAKLS8qCi0gKiBzZXRfZmlsdGVycyAtIHRyYW5zZmVyIHRoZSBwYXNzIGFuZCBhY3RpdmUgZmlsdGVycyB0byB0aGUga2VybmVsLgotICovCi1pbnQKLXNldF9maWx0ZXJzKHBhc3MsIGFjdGl2ZSkKLSAgICBzdHJ1Y3QgYnBmX3Byb2dyYW0gKnBhc3MsICphY3RpdmU7Ci17Ci0gICAgaW50IHJldCA9IDE7Ci0KLSAgICBpZiAocGFzcy0+YmZfbGVuID4gMCkgewotCWlmIChzdHJpb2N0bChwcHBmZCwgUFBQSU9fUEFTU0ZJTFQsIHBhc3MsCi0JCSAgICAgc2l6ZW9mKHN0cnVjdCBicGZfcHJvZ3JhbSksIDApIDwgMCkgewotCSAgICBlcnJvcigiQ291bGRuJ3Qgc2V0IHBhc3MtZmlsdGVyIGluIGtlcm5lbDogJW0iKTsKLQkgICAgcmV0ID0gMDsKLQl9Ci0gICAgfQotICAgIGlmIChhY3RpdmUtPmJmX2xlbiA+IDApIHsKLQlpZiAoc3RyaW9jdGwocHBwZmQsIFBQUElPX0FDVElWRUZJTFQsIGFjdGl2ZSwKLQkJICAgICBzaXplb2Yoc3RydWN0IGJwZl9wcm9ncmFtKSwgMCkgPCAwKSB7Ci0JICAgIGVycm9yKCJDb3VsZG4ndCBzZXQgYWN0aXZlLWZpbHRlciBpbiBrZXJuZWw6ICVtIik7Ci0JICAgIHJldCA9IDA7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotI2VuZGlmCi0KLS8qCi0gKiBjY3BfZmF0YWxfZXJyb3IgLSByZXR1cm5zIDEgaWYgZGVjb21wcmVzc2lvbiB3YXMgZGlzYWJsZWQgYXMgYQotICogcmVzdWx0IG9mIGFuIGVycm9yIGRldGVjdGVkIGFmdGVyIGRlY29tcHJlc3Npb24gb2YgYSBwYWNrZXQsCi0gKiAwIG90aGVyd2lzZS4gIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb2YgcGF0ZW50IG5vbnNlbnNlLgotICovCi1pbnQKLWNjcF9mYXRhbF9lcnJvcih1bml0KQotICAgIGludCB1bml0OwotewotICAgIGludCBjZlsyXTsKLQotICAgIGNmWzBdID0gY2ZbMV0gPSAwOwotICAgIGlmIChzdHJpb2N0bChwcHBmZCwgUFBQSU9fQ0ZMQUdTLCBjZiwgc2l6ZW9mKGNmKSwgc2l6ZW9mKGludCkpIDwgMCkgewotCWlmIChlcnJubyAhPSBFTlhJTyAmJiBlcnJubyAhPSBFSU5WQUwpCi0JICAgIGVycm9yKCJDb3VsZG4ndCBnZXQgY29tcHJlc3Npb24gZmxhZ3M6ICVtIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBjZlswXSAmIENDUF9GQVRBTEVSUk9SOwotfQotCi0vKgotICogc2lmdmpjb21wIC0gY29uZmlnIHRjcCBoZWFkZXIgY29tcHJlc3Npb24KLSAqLwotaW50Ci1zaWZ2amNvbXAodSwgdmpjb21wLCB4Y2lkY29tcCwgeG1heGNpZCkKLSAgICBpbnQgdSwgdmpjb21wLCB4Y2lkY29tcCwgeG1heGNpZDsKLXsKLSAgICBpbnQgY2ZbMl07Ci0gICAgY2hhciBtYXhjaWRbMl07Ci0KLSAgICBpZiAodmpjb21wKSB7Ci0JbWF4Y2lkWzBdID0geGNpZGNvbXA7Ci0JbWF4Y2lkWzFdID0gMTU7CQkvKiBYWFggc2hvdWxkIGJlIHJtYXhjaWQgKi8KLQlpZiAoc3RyaW9jdGwocHBwZmQsIFBQUElPX1ZKSU5JVCwgbWF4Y2lkLCBzaXplb2YobWF4Y2lkKSwgMCkgPCAwKSB7Ci0JICAgIGVycm9yKCJDb3VsZG4ndCBpbml0aWFsaXplIFZKIGNvbXByZXNzaW9uOiAlbSIpOwotCX0KLSAgICB9Ci0KLSAgICBjZlswXSA9ICh2amNvbXA/IENPTVBfVkpDICsgREVDT01QX1ZKQzogMCkJLyogWFhYIHRoaXMgaXMgd3JvbmcgKi8KLQkrICh4Y2lkY29tcD8gQ09NUF9WSkNDSUQgKyBERUNPTVBfVkpDQ0lEOiAwKTsKLSAgICBjZlsxXSA9IENPTVBfVkpDICsgREVDT01QX1ZKQyArIENPTVBfVkpDQ0lEICsgREVDT01QX1ZKQ0NJRDsKLSAgICBpZiAoc3RyaW9jdGwocHBwZmQsIFBQUElPX0NGTEFHUywgY2YsIHNpemVvZihjZiksIHNpemVvZihpbnQpKSA8IDApIHsKLQlpZiAodmpjb21wKQotCSAgICBlcnJvcigiQ291bGRuJ3QgZW5hYmxlIFZKIGNvbXByZXNzaW9uOiAlbSIpOwotICAgIH0KLQotICAgIHJldHVybiAxOwotfQotCi0vKgotICogc2lmdXAgLSBDb25maWcgdGhlIGludGVyZmFjZSB1cCBhbmQgZW5hYmxlIElQIHBhY2tldHMgdG8gcGFzcy4KLSAqLwotaW50Ci1zaWZ1cCh1KQotICAgIGludCB1OwotewotICAgIHN0cnVjdCBpZnJlcSBpZnI7Ci0KLSAgICBzdHJsY3B5KGlmci5pZnJfbmFtZSwgaWZuYW1lLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7Ci0gICAgaWYgKGlvY3RsKGlwZmQsIFNJT0NHSUZGTEFHUywgJmlmcikgPCAwKSB7Ci0JZXJyb3IoIkNvdWxkbid0IG1hcmsgaW50ZXJmYWNlIHVwIChnZXQpOiAlbSIpOwotCXJldHVybiAwOwotICAgIH0KLSAgICBpZnIuaWZyX2ZsYWdzIHw9IElGRl9VUDsKLSAgICBpZiAoaW9jdGwoaXBmZCwgU0lPQ1NJRkZMQUdTLCAmaWZyKSA8IDApIHsKLQllcnJvcigiQ291bGRuJ3QgbWFyayBpbnRlcmZhY2UgdXAgKHNldCk6ICVtIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmX2lzX3VwID0gMTsKLSAgICByZXR1cm4gMTsKLX0KLQotLyoKLSAqIHNpZmRvd24gLSBDb25maWcgdGhlIGludGVyZmFjZSBkb3duIGFuZCBkaXNhYmxlIElQLgotICovCi1pbnQKLXNpZmRvd24odSkKLSAgICBpbnQgdTsKLXsKLSAgICBzdHJ1Y3QgaWZyZXEgaWZyOwotCi0gICAgaWYgKGlwbXV4aWQgPCAwKQotCXJldHVybiAxOwotICAgIHN0cmxjcHkoaWZyLmlmcl9uYW1lLCBpZm5hbWUsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKLSAgICBpZiAoaW9jdGwoaXBmZCwgU0lPQ0dJRkZMQUdTLCAmaWZyKSA8IDApIHsKLQllcnJvcigiQ291bGRuJ3QgbWFyayBpbnRlcmZhY2UgZG93biAoZ2V0KTogJW0iKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgaWZyLmlmcl9mbGFncyAmPSB+SUZGX1VQOwotICAgIGlmIChpb2N0bChpcGZkLCBTSU9DU0lGRkxBR1MsICZpZnIpIDwgMCkgewotCWVycm9yKCJDb3VsZG4ndCBtYXJrIGludGVyZmFjZSBkb3duIChzZXQpOiAlbSIpOwotCXJldHVybiAwOwotICAgIH0KLSAgICBpZl9pc191cCA9IDA7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBzaWZucG1vZGUgLSBTZXQgdGhlIG1vZGUgZm9yIGhhbmRsaW5nIHBhY2tldHMgZm9yIGEgZ2l2ZW4gTlAuCi0gKi8KLWludAotc2lmbnBtb2RlKHUsIHByb3RvLCBtb2RlKQotICAgIGludCB1OwotICAgIGludCBwcm90bzsKLSAgICBlbnVtIE5QbW9kZSBtb2RlOwotewotICAgIGludCBucGlbMl07Ci0KLSAgICBucGlbMF0gPSBwcm90bzsKLSAgICBucGlbMV0gPSAoaW50KSBtb2RlOwotICAgIGlmIChzdHJpb2N0bChwcHBmZCwgUFBQSU9fTlBNT0RFLCAmbnBpLCAyICogc2l6ZW9mKGludCksIDApIDwgMCkgewotCWVycm9yKCJpb2N0bChzZXQgTlAgJWQgbW9kZSB0byAlZCk6ICVtIiwgcHJvdG8sIG1vZGUpOwotCXJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotI2lmIGRlZmluZWQoU09MMikgJiYgZGVmaW5lZChJTkVUNikKLS8qCi0gKiBzaWY2dXAgLSBDb25maWcgdGhlIElQdjYgaW50ZXJmYWNlIHVwIGFuZCBlbmFibGUgSVB2NiBwYWNrZXRzIHRvIHBhc3MuCi0gKi8KLWludAotc2lmNnVwKHUpCi0gICAgaW50IHU7Ci17Ci0gICAgc3RydWN0IGxpZnJlcSBsaWZyOwotICAgIGludCBmZDsKLQotICAgIGZkID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKTsKLSAgICBpZiAoZmQgPCAwKSB7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgbWVtc2V0KCZsaWZyLCAwLCBzaXplb2YobGlmcikpOwotICAgIHN0cmxjcHkobGlmci5saWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGxpZnIubGlmcl9uYW1lKSk7Ci0gICAgaWYgKGlvY3RsKGZkLCBTSU9DR0xJRkZMQUdTLCAmbGlmcikgPCAwKSB7Ci0JY2xvc2UoZmQpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIGxpZnIubGlmcl9mbGFncyB8PSBJRkZfVVA7Ci0gICAgc3RybGNweShsaWZyLmxpZnJfbmFtZSwgaWZuYW1lLCBzaXplb2YobGlmci5saWZyX25hbWUpKTsKLSAgICBpZiAoaW9jdGwoZmQsIFNJT0NTTElGRkxBR1MsICZsaWZyKSA8IDApIHsKLQljbG9zZShmZCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWY2X2lzX3VwID0gMTsKLSAgICBjbG9zZShmZCk7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBzaWZkb3duIC0gQ29uZmlnIHRoZSBJUHY2IGludGVyZmFjZSBkb3duIGFuZCBkaXNhYmxlIElQdjYuCi0gKi8KLWludAotc2lmNmRvd24odSkKLSAgICBpbnQgdTsKLXsKLSAgICBzdHJ1Y3QgbGlmcmVxIGxpZnI7Ci0gICAgaW50IGZkOwotCi0gICAgZmQgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfREdSQU0sIDApOwotICAgIGlmIChmZCA8IDApCi0JcmV0dXJuIDA7Ci0KLSAgICBtZW1zZXQoJmxpZnIsIDAsIHNpemVvZihsaWZyKSk7Ci0gICAgc3RybGNweShsaWZyLmxpZnJfbmFtZSwgaWZuYW1lLCBzaXplb2YobGlmci5saWZyX25hbWUpKTsKLSAgICBpZiAoaW9jdGwoZmQsIFNJT0NHTElGRkxBR1MsICZsaWZyKSA8IDApIHsKLQljbG9zZShmZCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgbGlmci5saWZyX2ZsYWdzICY9IH5JRkZfVVA7Ci0gICAgc3RybGNweShsaWZyLmxpZnJfbmFtZSwgaWZuYW1lLCBzaXplb2YobGlmci5saWZyX25hbWUpKTsKLSAgICBpZiAoaW9jdGwoZmQsIFNJT0NHTElGRkxBR1MsICZsaWZyKSA8IDApIHsKLQljbG9zZShmZCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWY2X2lzX3VwID0gMDsKLSAgICBjbG9zZShmZCk7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBzaWY2YWRkciAtIENvbmZpZyB0aGUgaW50ZXJmYWNlIHdpdGggYW4gSVB2NiBsaW5rLWxvY2FsIGFkZHJlc3MKLSAqLwotaW50Ci1zaWY2YWRkcih1LCBvLCBoKQotICAgIGludCB1OwotICAgIGV1aTY0X3QgbywgaDsKLXsKLSAgICBzdHJ1Y3QgbGlmcmVxIGxpZnI7Ci0gICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgbGFkZHI7Ci0gICAgc3RydWN0IHNvY2thZGRyX2luNiAqc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJmxhZGRyOwotICAgIGludCBmZDsKLQotICAgIGZkID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKTsKLSAgICBpZiAoZmQgPCAwKQotCXJldHVybiAwOwotCi0gICAgbWVtc2V0KCZsaWZyLCAwLCBzaXplb2YobGlmcikpOwotICAgIHN0cmxjcHkobGlmci5saWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGxpZnIubGlmcl9uYW1lKSk7Ci0KLSAgICAvKgotICAgICAqIERvIHRoaXMgYmVjYXVzZSAvZGV2L3BwcCByZXNwb25kcyB0byBETF9QSFlTX0FERFJfUkVRIHdpdGgKLSAgICAgKiB6ZXJvIHZhbHVlcywgaGVuY2UgdGhlIGludGVyZmFjZSB0b2tlbiBjYW1lIHRvIGJlIHplcm8gdG9vLAotICAgICAqIGFuZCB3aXRob3V0IHRoaXMsIGluLm5kcGQgd2lsbCBjb21wbGFpbgotICAgICAqLwotICAgIElONl9MTFRPS0VOX0ZST01fRVVJNjQobGlmciwgc2luNiwgbyk7Ci0gICAgaWYgKGlvY3RsKGZkLCBTSU9DU0xJRlRPS0VOLCAmbGlmcikgPCAwKSB7Ci0JY2xvc2UoZmQpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIC8qCi0gICAgICogU2V0IHRoZSBpbnRlcmZhY2UgYWRkcmVzcyBhbmQgZGVzdGluYXRpb24gYWRkcmVzcwotICAgICAqLwotICAgIElONl9MTEFERFJfRlJPTV9FVUk2NChsaWZyLCBzaW42LCBvKTsKLSAgICBpZiAoaW9jdGwoZmQsIFNJT0NTTElGQUREUiwgJmxpZnIpIDwgMCkgewotCWNsb3NlKGZkKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBtZW1zZXQoJmxpZnIsIDAsIHNpemVvZihsaWZyKSk7Ci0gICAgc3RybGNweShsaWZyLmxpZnJfbmFtZSwgaWZuYW1lLCBzaXplb2YobGlmci5saWZyX25hbWUpKTsKLSAgICBJTjZfTExBRERSX0ZST01fRVVJNjQobGlmciwgc2luNiwgaCk7Ci0gICAgaWYgKGlvY3RsKGZkLCBTSU9DU0xJRkRTVEFERFIsICZsaWZyKSA8IDApIHsKLQljbG9zZShmZCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBjaWY2YWRkciAtIFJlbW92ZSB0aGUgSVB2NiBhZGRyZXNzIGZyb20gaW50ZXJmYWNlCi0gKi8KLWludAotY2lmNmFkZHIodSwgbywgaCkKLSAgICBpbnQgdTsKLSAgICBldWk2NF90IG8sIGg7Ci17Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLSNlbmRpZiAvKiBkZWZpbmVkKFNPTDIpICYmIGRlZmluZWQoSU5FVDYpICovCi0KLQotI2RlZmluZSBJTkVUX0FERFIoeCkJKCgoc3RydWN0IHNvY2thZGRyX2luICopICYoeCkpLT5zaW5fYWRkci5zX2FkZHIpCi0KLS8qCi0gKiBzaWZhZGRyIC0gQ29uZmlnIHRoZSBpbnRlcmZhY2UgSVAgYWRkcmVzc2VzIGFuZCBuZXRtYXNrLgotICovCi1pbnQKLXNpZmFkZHIodSwgbywgaCwgbSkKLSAgICBpbnQgdTsKLSAgICB1X2ludDMyX3QgbywgaCwgbTsKLXsKLSAgICBzdHJ1Y3QgaWZyZXEgaWZyOwotICAgIGludCByZXQgPSAxOwotCi0gICAgbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKLSAgICBzdHJsY3B5KGlmci5pZnJfbmFtZSwgaWZuYW1lLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7Ci0gICAgaWZyLmlmcl9hZGRyLnNhX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgSU5FVF9BRERSKGlmci5pZnJfYWRkcikgPSBtOwotICAgIGlmIChpb2N0bChpcGZkLCBTSU9DU0lGTkVUTUFTSywgJmlmcikgPCAwKSB7Ci0JZXJyb3IoIkNvdWxkbid0IHNldCBJUCBuZXRtYXNrOiAlbSIpOwotCXJldCA9IDA7Ci0gICAgfQotICAgIGlmci5pZnJfYWRkci5zYV9mYW1pbHkgPSBBRl9JTkVUOwotICAgIElORVRfQUREUihpZnIuaWZyX2FkZHIpID0gbzsKLSAgICBpZiAoaW9jdGwoaXBmZCwgU0lPQ1NJRkFERFIsICZpZnIpIDwgMCkgewotCWVycm9yKCJDb3VsZG4ndCBzZXQgbG9jYWwgSVAgYWRkcmVzczogJW0iKTsKLQlyZXQgPSAwOwotICAgIH0KLQotICAgIC8qCi0gICAgICogT24gc29tZSBzeXN0ZW1zLCB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgc2V0IHRoZSBwb2ludC10by1wb2ludAotICAgICAqIGZsYWcgYml0IGJlZm9yZSB3ZSBjYW4gc2V0IGEgZGVzdGluYXRpb24gYWRkcmVzcy4KLSAgICAgKi8KLSAgICBpZiAoaW9jdGwoaXBmZCwgU0lPQ0dJRkZMQUdTLCAmaWZyKSA+PSAwCi0JJiYgKGlmci5pZnJfZmxhZ3MgJiBJRkZfUE9JTlRPUE9JTlQpID09IDApIHsKLQlpZnIuaWZyX2ZsYWdzIHw9IElGRl9QT0lOVE9QT0lOVDsKLQlpZiAoaW9jdGwoaXBmZCwgU0lPQ1NJRkZMQUdTLCAmaWZyKSA8IDApIHsKLQkgICAgZXJyb3IoIkNvdWxkbid0IG1hcmsgaW50ZXJmYWNlIHB0LXRvLXB0OiAlbSIpOwotCSAgICByZXQgPSAwOwotCX0KLSAgICB9Ci0gICAgaWZyLmlmcl9kc3RhZGRyLnNhX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgSU5FVF9BRERSKGlmci5pZnJfZHN0YWRkcikgPSBoOwotICAgIGlmIChpb2N0bChpcGZkLCBTSU9DU0lGRFNUQUREUiwgJmlmcikgPCAwKSB7Ci0JZXJyb3IoIkNvdWxkbid0IHNldCByZW1vdGUgSVAgYWRkcmVzczogJW0iKTsKLQlyZXQgPSAwOwotICAgIH0KLQotICAgIHJlbW90ZV9hZGRyID0gaDsKLSAgICByZXR1cm4gcmV0OwotfQotCi0vKgotICogY2lmYWRkciAtIENsZWFyIHRoZSBpbnRlcmZhY2UgSVAgYWRkcmVzc2VzLCBhbmQgZGVsZXRlIHJvdXRlcwotICogdGhyb3VnaCB0aGUgaW50ZXJmYWNlIGlmIHBvc3NpYmxlLgotICovCi1pbnQKLWNpZmFkZHIodSwgbywgaCkKLSAgICBpbnQgdTsKLSAgICB1X2ludDMyX3QgbywgaDsKLXsKLSNpZiBkZWZpbmVkKF9fVVNMQ19fKQkJLyogd2FzOiAjaWYgMCAqLwotICAgIGNpZnJvdXRlKHVuaXQsIG91cmFkZHIsIGhpc2FkZHIpOwotICAgIGlmIChpcG11eGlkID49IDApIHsKLQlub3RpY2UoIlJlbW92aW5nIHBwcCBpbnRlcmZhY2UgdW5pdCIpOwotCWlmIChpb2N0bChpcGZkLCBJX1VOTElOSywgaXBtdXhpZCkgPCAwKSB7Ci0JICAgIGVycm9yKCJDYW4ndCByZW1vdmUgcHBwIGludGVyZmFjZSB1bml0OiAlbSIpOwotCSAgICByZXR1cm4gMDsKLQl9Ci0JaXBtdXhpZCA9IC0xOwotICAgIH0KLSNlbmRpZgotICAgIHJlbW90ZV9hZGRyID0gMDsKLSAgICByZXR1cm4gMTsKLX0KLQotLyoKLSAqIHNpZmRlZmF1bHRyb3V0ZSAtIGFzc2lnbiBhIGRlZmF1bHQgcm91dGUgdGhyb3VnaCB0aGUgYWRkcmVzcyBnaXZlbi4KLSAqLwotaW50Ci1zaWZkZWZhdWx0cm91dGUodSwgbCwgZykKLSAgICBpbnQgdTsKLSAgICB1X2ludDMyX3QgbCwgZzsKLXsKLSAgICBzdHJ1Y3QgcnRlbnRyeSBydDsKLQotI2lmIGRlZmluZWQoX19VU0xDX18pCi0gICAgZyA9IGw7CQkJLyogdXNlIHRoZSBsb2NhbCBhZGRyZXNzIGFzIGdhdGV3YXkgKi8KLSNlbmRpZgotICAgIG1lbXNldCgmcnQsIDAsIHNpemVvZihydCkpOwotICAgIHJ0LnJ0X2RzdC5zYV9mYW1pbHkgPSBBRl9JTkVUOwotICAgIElORVRfQUREUihydC5ydF9kc3QpID0gMDsKLSAgICBydC5ydF9nYXRld2F5LnNhX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgSU5FVF9BRERSKHJ0LnJ0X2dhdGV3YXkpID0gZzsKLSAgICBydC5ydF9mbGFncyA9IFJURl9HQVRFV0FZOwotCi0gICAgaWYgKGlvY3RsKGlwZmQsIFNJT0NBRERSVCwgJnJ0KSA8IDApIHsKLQllcnJvcigiQ2FuJ3QgYWRkIGRlZmF1bHQgcm91dGU6ICVtIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgZGVmYXVsdF9yb3V0ZV9nYXRld2F5ID0gZzsKLSAgICByZXR1cm4gMTsKLX0KLQotLyoKLSAqIGNpZmRlZmF1bHRyb3V0ZSAtIGRlbGV0ZSBhIGRlZmF1bHQgcm91dGUgdGhyb3VnaCB0aGUgYWRkcmVzcyBnaXZlbi4KLSAqLwotaW50Ci1jaWZkZWZhdWx0cm91dGUodSwgbCwgZykKLSAgICBpbnQgdTsKLSAgICB1X2ludDMyX3QgbCwgZzsKLXsKLSAgICBzdHJ1Y3QgcnRlbnRyeSBydDsKLQotI2lmIGRlZmluZWQoX19VU0xDX18pCi0gICAgZyA9IGw7CQkJLyogdXNlIHRoZSBsb2NhbCBhZGRyZXNzIGFzIGdhdGV3YXkgKi8KLSNlbmRpZgotICAgIG1lbXNldCgmcnQsIDAsIHNpemVvZihydCkpOwotICAgIHJ0LnJ0X2RzdC5zYV9mYW1pbHkgPSBBRl9JTkVUOwotICAgIElORVRfQUREUihydC5ydF9kc3QpID0gMDsKLSAgICBydC5ydF9nYXRld2F5LnNhX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgSU5FVF9BRERSKHJ0LnJ0X2dhdGV3YXkpID0gZzsKLSAgICBydC5ydF9mbGFncyA9IFJURl9HQVRFV0FZOwotCi0gICAgaWYgKGlvY3RsKGlwZmQsIFNJT0NERUxSVCwgJnJ0KSA8IDApIHsKLQllcnJvcigiQ2FuJ3QgZGVsZXRlIGRlZmF1bHQgcm91dGU6ICVtIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgZGVmYXVsdF9yb3V0ZV9nYXRld2F5ID0gMDsKLSAgICByZXR1cm4gMTsKLX0KLQotLyoKLSAqIHNpZnByb3h5YXJwIC0gTWFrZSBhIHByb3h5IEFSUCBlbnRyeSBmb3IgdGhlIHBlZXIuCi0gKi8KLWludAotc2lmcHJveHlhcnAodW5pdCwgaGlzYWRkcikKLSAgICBpbnQgdW5pdDsKLSAgICB1X2ludDMyX3QgaGlzYWRkcjsKLXsKLSAgICBzdHJ1Y3QgYXJwcmVxIGFycHJlcTsKLQotICAgIG1lbXNldCgmYXJwcmVxLCAwLCBzaXplb2YoYXJwcmVxKSk7Ci0gICAgaWYgKCFnZXRfZXRoZXJfYWRkcihoaXNhZGRyLCAmYXJwcmVxLmFycF9oYSkpCi0JcmV0dXJuIDA7Ci0KLSAgICBhcnByZXEuYXJwX3BhLnNhX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgSU5FVF9BRERSKGFycHJlcS5hcnBfcGEpID0gaGlzYWRkcjsKLSAgICBhcnByZXEuYXJwX2ZsYWdzID0gQVRGX1BFUk0gfCBBVEZfUFVCTDsKLSAgICBpZiAoaW9jdGwoaXBmZCwgU0lPQ1NBUlAsIChjYWRkcl90KSAmYXJwcmVxKSA8IDApIHsKLQllcnJvcigiQ291bGRuJ3Qgc2V0IHByb3h5IEFSUCBlbnRyeTogJW0iKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwcm94eV9hcnBfYWRkciA9IGhpc2FkZHI7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBjaWZwcm94eWFycCAtIERlbGV0ZSB0aGUgcHJveHkgQVJQIGVudHJ5IGZvciB0aGUgcGVlci4KLSAqLwotaW50Ci1jaWZwcm94eWFycCh1bml0LCBoaXNhZGRyKQotICAgIGludCB1bml0OwotICAgIHVfaW50MzJfdCBoaXNhZGRyOwotewotICAgIHN0cnVjdCBhcnByZXEgYXJwcmVxOwotCi0gICAgbWVtc2V0KCZhcnByZXEsIDAsIHNpemVvZihhcnByZXEpKTsKLSAgICBhcnByZXEuYXJwX3BhLnNhX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgSU5FVF9BRERSKGFycHJlcS5hcnBfcGEpID0gaGlzYWRkcjsKLSAgICBpZiAoaW9jdGwoaXBmZCwgU0lPQ0RBUlAsIChjYWRkcl90KSZhcnByZXEpIDwgMCkgewotCWVycm9yKCJDb3VsZG4ndCBkZWxldGUgcHJveHkgQVJQIGVudHJ5OiAlbSIpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIHByb3h5X2FycF9hZGRyID0gMDsKLSAgICByZXR1cm4gMTsKLX0KLQotLyoKLSAqIGdldF9ldGhlcl9hZGRyIC0gZ2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzIG9mIGFuIGludGVyZmFjZSBvbiB0aGUKLSAqIHRoZSBzYW1lIHN1Ym5ldCBhcyBpcGFkZHIuCi0gKi8KLSNkZWZpbmUgTUFYX0lGUwkJMzIKLQotc3RhdGljIGludAotZ2V0X2V0aGVyX2FkZHIoaXBhZGRyLCBod2FkZHIpCi0gICAgdV9pbnQzMl90IGlwYWRkcjsKLSAgICBzdHJ1Y3Qgc29ja2FkZHIgKmh3YWRkcjsKLXsKLSAgICBzdHJ1Y3QgaWZyZXEgKmlmciwgKmlmZW5kLCBpZnJlcTsKLSAgICBpbnQgbmlmOwotICAgIHN0cnVjdCBpZmNvbmYgaWZjOwotICAgIHVfaW50MzJfdCBpbmEsIG1hc2s7Ci0KLSAgICAvKgotICAgICAqIFNjYW4gdGhyb3VnaCB0aGUgc3lzdGVtJ3MgbmV0d29yayBpbnRlcmZhY2VzLgotICAgICAqLwotI2lmZGVmIFNJT0NHSUZOVU0KLSAgICBpZiAoaW9jdGwoaXBmZCwgU0lPQ0dJRk5VTSwgJm5pZikgPCAwKQotI2VuZGlmCi0JbmlmID0gTUFYX0lGUzsKLSAgICBpZmMuaWZjX2xlbiA9IG5pZiAqIHNpemVvZihzdHJ1Y3QgaWZyZXEpOwotICAgIGlmYy5pZmNfYnVmID0gKGNhZGRyX3QpIG1hbGxvYyhpZmMuaWZjX2xlbik7Ci0gICAgaWYgKGlmYy5pZmNfYnVmID09IDApCi0JcmV0dXJuIDA7Ci0gICAgaWYgKGlvY3RsKGlwZmQsIFNJT0NHSUZDT05GLCAmaWZjKSA8IDApIHsKLQl3YXJuKCJDb3VsZG4ndCBnZXQgc3lzdGVtIGludGVyZmFjZSBsaXN0OiAlbSIpOwotCWZyZWUoaWZjLmlmY19idWYpOwotCXJldHVybiAwOwotICAgIH0KLSAgICBpZmVuZCA9IChzdHJ1Y3QgaWZyZXEgKikgKGlmYy5pZmNfYnVmICsgaWZjLmlmY19sZW4pOwotICAgIGZvciAoaWZyID0gaWZjLmlmY19yZXE7IGlmciA8IGlmZW5kOyArK2lmcikgewotCWlmIChpZnItPmlmcl9hZGRyLnNhX2ZhbWlseSAhPSBBRl9JTkVUKQotCSAgICBjb250aW51ZTsKLQkvKgotCSAqIENoZWNrIHRoYXQgdGhlIGludGVyZmFjZSBpcyB1cCwgYW5kIG5vdCBwb2ludC10by1wb2ludCBvciBsb29wYmFjay4KLQkgKi8KLQlzdHJsY3B5KGlmcmVxLmlmcl9uYW1lLCBpZnItPmlmcl9uYW1lLCBzaXplb2YoaWZyZXEuaWZyX25hbWUpKTsKLQlpZiAoaW9jdGwoaXBmZCwgU0lPQ0dJRkZMQUdTLCAmaWZyZXEpIDwgMCkKLQkgICAgY29udGludWU7Ci0JaWYgKChpZnJlcS5pZnJfZmxhZ3MgJgotCSAgICAgKElGRl9VUHxJRkZfQlJPQURDQVNUfElGRl9QT0lOVE9QT0lOVHxJRkZfTE9PUEJBQ0t8SUZGX05PQVJQKSkKLQkgICAgIT0gKElGRl9VUHxJRkZfQlJPQURDQVNUKSkKLQkgICAgY29udGludWU7Ci0JLyoKLQkgKiBHZXQgaXRzIG5ldG1hc2sgYW5kIGNoZWNrIHRoYXQgaXQncyBvbiB0aGUgcmlnaHQgc3VibmV0LgotCSAqLwotCWlmIChpb2N0bChpcGZkLCBTSU9DR0lGTkVUTUFTSywgJmlmcmVxKSA8IDApCi0JICAgIGNvbnRpbnVlOwotCWluYSA9IElORVRfQUREUihpZnItPmlmcl9hZGRyKTsKLQltYXNrID0gSU5FVF9BRERSKGlmcmVxLmlmcl9hZGRyKTsKLQlpZiAoKGlwYWRkciAmIG1hc2spID09IChpbmEgJiBtYXNrKSkKLQkgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKGlmciA+PSBpZmVuZCkgewotCXdhcm4oIk5vIHN1aXRhYmxlIGludGVyZmFjZSBmb3VuZCBmb3IgcHJveHkgQVJQIik7Ci0JZnJlZShpZmMuaWZjX2J1Zik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaW5mbygiZm91bmQgaW50ZXJmYWNlICVzIGZvciBwcm94eSBBUlAiLCBpZnItPmlmcl9uYW1lKTsKLSAgICBpZiAoIWdldF9od19hZGRyKGlmci0+aWZyX25hbWUsIGluYSwgaHdhZGRyKSkgewotCWVycm9yKCJDb3VsZG4ndCBnZXQgaGFyZHdhcmUgYWRkcmVzcyBmb3IgJXMiLCBpZnItPmlmcl9uYW1lKTsKLQlmcmVlKGlmYy5pZmNfYnVmKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBmcmVlKGlmYy5pZmNfYnVmKTsKLSAgICByZXR1cm4gMTsKLX0KLQotLyoKLSAqIGdldF9od19hZGRyX2RscGkgLSBvYnRhaW4gdGhlIGhhcmR3YXJlIGFkZHJlc3MgdXNpbmcgRExQSQotICovCi1zdGF0aWMgaW50Ci1nZXRfaHdfYWRkcl9kbHBpKG5hbWUsIGh3YWRkcikKLSAgICBjaGFyICpuYW1lOwotICAgIHN0cnVjdCBzb2NrYWRkciAqaHdhZGRyOwotewotICAgIGNoYXIgKnE7Ci0gICAgaW50IHVuaXQsIGlmZmQsIGFkcmxlbjsKLSAgICB1bnNpZ25lZCBjaGFyICphZHJwOwotICAgIGNoYXIgaWZkZXZbMjRdOwotICAgIHN0cnVjdCB7Ci0JdW5pb24gRExfcHJpbWl0aXZlcyBwcmltOwotCWNoYXIgc3BhY2VbNjRdOwotICAgIH0gcmVwbHk7Ci0KLSAgICAvKgotICAgICAqIFdlIGhhdmUgdG8gb3BlbiB0aGUgZGV2aWNlIGFuZCBhc2sgaXQgZm9yIGl0cyBoYXJkd2FyZSBhZGRyZXNzLgotICAgICAqIEZpcnN0IHNwbGl0IGFwYXJ0IHRoZSBkZXZpY2UgbmFtZSBhbmQgdW5pdC4KLSAgICAgKi8KLSAgICBzbHByaW50ZihpZmRldiwgc2l6ZW9mKGlmZGV2KSwgIi9kZXYvJXMiLCBuYW1lKTsKLSAgICBmb3IgKHEgPSBpZmRldiArIHN0cmxlbihpZmRldik7IC0tcSA+PSBpZmRldjsgKQotCWlmICghaXNkaWdpdCgqcSkpCi0JICAgIGJyZWFrOwotICAgIHVuaXQgPSBhdG9pKHErMSk7Ci0gICAgcVsxXSA9IDA7Ci0KLSAgICAvKgotICAgICAqIE9wZW4gdGhlIGRldmljZSBhbmQgZG8gYSBETFBJIGF0dGFjaCBhbmQgcGh5c19hZGRyX3JlcS4KLSAgICAgKi8KLSAgICBpZmZkID0gb3BlbihpZmRldiwgT19SRFdSKTsKLSAgICBpZiAoaWZmZCA8IDApIHsKLQllcnJvcigiQ2FuJ3Qgb3BlbiAlczogJW0iLCBpZmRldik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChkbHBpX2F0dGFjaChpZmZkLCB1bml0KSA8IDAKLQl8fCBkbHBpX2dldF9yZXBseShpZmZkLCAmcmVwbHkucHJpbSwgRExfT0tfQUNLLCBzaXplb2YocmVwbHkpKSA8IDAKLQl8fCBkbHBpX2luZm9fcmVxKGlmZmQpIDwgMAotCXx8IGRscGlfZ2V0X3JlcGx5KGlmZmQsICZyZXBseS5wcmltLCBETF9JTkZPX0FDSywgc2l6ZW9mKHJlcGx5KSkgPCAwKSB7Ci0JY2xvc2UoaWZmZCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgYWRybGVuID0gcmVwbHkucHJpbS5pbmZvX2Fjay5kbF9hZGRyX2xlbmd0aDsKLSAgICBhZHJwID0gKHVuc2lnbmVkIGNoYXIgKikmcmVwbHkgKyByZXBseS5wcmltLmluZm9fYWNrLmRsX2FkZHJfb2Zmc2V0OwotCi0jaWYgRExfQ1VSUkVOVF9WRVJTSU9OID49IDIKLSAgICBpZiAocmVwbHkucHJpbS5pbmZvX2Fjay5kbF9zYXBfbGVuZ3RoIDwgMCkKLQlhZHJsZW4gKz0gcmVwbHkucHJpbS5pbmZvX2Fjay5kbF9zYXBfbGVuZ3RoOwotICAgIGVsc2UKLQlhZHJwICs9IHJlcGx5LnByaW0uaW5mb19hY2suZGxfc2FwX2xlbmd0aDsKLSNlbmRpZgotCi0gICAgaHdhZGRyLT5zYV9mYW1pbHkgPSBBRl9VTlNQRUM7Ci0gICAgbWVtY3B5KGh3YWRkci0+c2FfZGF0YSwgYWRycCwgYWRybGVuKTsKLQotICAgIHJldHVybiAxOwotfQotLyoKLSAqIGdldF9od19hZGRyIC0gb2J0YWluIHRoZSBoYXJkd2FyZSBhZGRyZXNzIGZvciBhIG5hbWVkIGludGVyZmFjZS4KLSAqLwotc3RhdGljIGludAotZ2V0X2h3X2FkZHIobmFtZSwgaW5hLCBod2FkZHIpCi0gICAgY2hhciAqbmFtZTsKLSAgICB1X2ludDMyX3QgaW5hOwotICAgIHN0cnVjdCBzb2NrYWRkciAqaHdhZGRyOwotewotICAgIC8qIE5ldyB3YXkgLSBnZXQgdGhlIGFkZHJlc3MgYnkgZG9pbmcgYW4gYXJwIHJlcXVlc3QuICovCi0gICAgaW50IHM7Ci0gICAgc3RydWN0IGFycHJlcSByZXE7Ci0KLSAgICBzID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOwotICAgIGlmIChzIDwgMCkKLQlyZXR1cm4gMDsKLSAgICBtZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOwotICAgIHJlcS5hcnBfcGEuc2FfZmFtaWx5ID0gQUZfSU5FVDsKLSAgICBJTkVUX0FERFIocmVxLmFycF9wYSkgPSBpbmE7Ci0gICAgaWYgKGlvY3RsKHMsIFNJT0NHQVJQLCAmcmVxKSA8IDApIHsKLQllcnJvcigiQ291bGRuJ3QgZ2V0IEFSUCBlbnRyeSBmb3IgJXM6ICVtIiwgaXBfbnRvYShpbmEpKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgKmh3YWRkciA9IHJlcS5hcnBfaGE7Ci0gICAgaHdhZGRyLT5zYV9mYW1pbHkgPSBBRl9VTlNQRUM7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotZGxwaV9hdHRhY2goZmQsIHBwYSkKLSAgICBpbnQgZmQsIHBwYTsKLXsKLSAgICBkbF9hdHRhY2hfcmVxX3QgcmVxOwotICAgIHN0cnVjdCBzdHJidWYgYnVmOwotCi0gICAgcmVxLmRsX3ByaW1pdGl2ZSA9IERMX0FUVEFDSF9SRVE7Ci0gICAgcmVxLmRsX3BwYSA9IHBwYTsKLSAgICBidWYubGVuID0gc2l6ZW9mKHJlcSk7Ci0gICAgYnVmLmJ1ZiA9ICh2b2lkICopICZyZXE7Ci0gICAgcmV0dXJuIHB1dG1zZyhmZCwgJmJ1ZiwgTlVMTCwgUlNfSElQUkkpOwotfQotCi1zdGF0aWMgaW50Ci1kbHBpX2luZm9fcmVxKGZkKQotICAgIGludCBmZDsKLXsKLSAgICBkbF9pbmZvX3JlcV90IHJlcTsKLSAgICBzdHJ1Y3Qgc3RyYnVmIGJ1ZjsKLQotICAgIHJlcS5kbF9wcmltaXRpdmUgPSBETF9JTkZPX1JFUTsKLSAgICBidWYubGVuID0gc2l6ZW9mKHJlcSk7Ci0gICAgYnVmLmJ1ZiA9ICh2b2lkICopICZyZXE7Ci0gICAgcmV0dXJuIHB1dG1zZyhmZCwgJmJ1ZiwgTlVMTCwgUlNfSElQUkkpOwotfQotCi1zdGF0aWMgaW50Ci1kbHBpX2dldF9yZXBseShmZCwgcmVwbHksIGV4cGVjdGVkX3ByaW0sIG1heGxlbikKLSAgICB1bmlvbiBETF9wcmltaXRpdmVzICpyZXBseTsKLSAgICBpbnQgZmQsIGV4cGVjdGVkX3ByaW0sIG1heGxlbjsKLXsKLSAgICBzdHJ1Y3Qgc3RyYnVmIGJ1ZjsKLSAgICBpbnQgZmxhZ3MsIG47Ci0gICAgc3RydWN0IHBvbGxmZCBwZmQ7Ci0KLSAgICAvKgotICAgICAqIFVzZSBwb2xsIHRvIHdhaXQgZm9yIGEgbWVzc2FnZSB3aXRoIGEgdGltZW91dC4KLSAgICAgKi8KLSAgICBwZmQuZmQgPSBmZDsKLSAgICBwZmQuZXZlbnRzID0gUE9MTElOIHwgUE9MTFBSSTsKLSAgICBkbyB7Ci0JbiA9IHBvbGwoJnBmZCwgMSwgMTAwMCk7Ci0gICAgfSB3aGlsZSAobiA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7Ci0gICAgaWYgKG4gPD0gMCkKLQlyZXR1cm4gLTE7Ci0KLSAgICAvKgotICAgICAqIEdldCB0aGUgcmVwbHkuCi0gICAgICovCi0gICAgYnVmLm1heGxlbiA9IG1heGxlbjsKLSAgICBidWYuYnVmID0gKHZvaWQgKikgcmVwbHk7Ci0gICAgZmxhZ3MgPSAwOwotICAgIGlmIChnZXRtc2coZmQsICZidWYsIE5VTEwsICZmbGFncykgPCAwKQotCXJldHVybiAtMTsKLQotICAgIGlmIChidWYubGVuIDwgc2l6ZW9mKHVsb25nKSkgewotCWlmIChkZWJ1ZykKLQkgICAgZGJnbG9nKCJkbHBpIHJlc3BvbnNlIHNob3J0IChsZW49JWQpXG4iLCBidWYubGVuKTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaWYgKHJlcGx5LT5kbF9wcmltaXRpdmUgPT0gZXhwZWN0ZWRfcHJpbSkKLQlyZXR1cm4gMDsKLQotICAgIGlmIChkZWJ1ZykgewotCWlmIChyZXBseS0+ZGxfcHJpbWl0aXZlID09IERMX0VSUk9SX0FDSykgewotCSAgICBkYmdsb2coImRscGkgZXJyb3IgJWQgKHVuaXggZXJybm8gJWQpIGZvciBwcmltICV4XG4iLAotCQkgICByZXBseS0+ZXJyb3JfYWNrLmRsX2Vycm5vLCByZXBseS0+ZXJyb3JfYWNrLmRsX3VuaXhfZXJybm8sCi0JCSAgIHJlcGx5LT5lcnJvcl9hY2suZGxfZXJyb3JfcHJpbWl0aXZlKTsKLQl9IGVsc2UgewotCSAgICBkYmdsb2coImRscGkgdW5leHBlY3RlZCByZXNwb25zZSBwcmltICV4XG4iLAotCQkgICByZXBseS0+ZGxfcHJpbWl0aXZlKTsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIC0xOwotfQotCi0vKgotICogUmV0dXJuIHVzZXIgc3BlY2lmaWVkIG5ldG1hc2ssIG1vZGlmaWVkIGJ5IGFueSBtYXNrIHdlIG1pZ2h0IGRldGVybWluZQotICogZm9yIGFkZHJlc3MgYGFkZHInIChpbiBuZXR3b3JrIGJ5dGUgb3JkZXIpLgotICogSGVyZSB3ZSBzY2FuIHRocm91Z2ggdGhlIHN5c3RlbSdzIGxpc3Qgb2YgaW50ZXJmYWNlcywgbG9va2luZyBmb3IKLSAqIGFueSBub24tcG9pbnQtdG8tcG9pbnQgaW50ZXJmYWNlcyB3aGljaCBtaWdodCBhcHBlYXIgdG8gYmUgb24gdGhlIHNhbWUKLSAqIG5ldHdvcmsgYXMgYGFkZHInLiAgSWYgd2UgZmluZCBhbnksIHdlIE9SIGluIHRoZWlyIG5ldG1hc2sgdG8gdGhlCi0gKiB1c2VyLXNwZWNpZmllZCBuZXRtYXNrLgotICovCi11X2ludDMyX3QKLUdldE1hc2soYWRkcikKLSAgICB1X2ludDMyX3QgYWRkcjsKLXsKLSAgICB1X2ludDMyX3QgbWFzaywgbm1hc2ssIGluYTsKLSAgICBzdHJ1Y3QgaWZyZXEgKmlmciwgKmlmZW5kLCBpZnJlcTsKLSAgICBpbnQgbmlmOwotICAgIHN0cnVjdCBpZmNvbmYgaWZjOwotCi0gICAgYWRkciA9IG50b2hsKGFkZHIpOwotICAgIGlmIChJTl9DTEFTU0EoYWRkcikpCS8qIGRldGVybWluZSBuZXR3b3JrIG1hc2sgZm9yIGFkZHJlc3MgY2xhc3MgKi8KLQlubWFzayA9IElOX0NMQVNTQV9ORVQ7Ci0gICAgZWxzZSBpZiAoSU5fQ0xBU1NCKGFkZHIpKQotCW5tYXNrID0gSU5fQ0xBU1NCX05FVDsKLSAgICBlbHNlCi0Jbm1hc2sgPSBJTl9DTEFTU0NfTkVUOwotICAgIC8qIGNsYXNzIEQgbmV0cyBhcmUgZGlzYWxsb3dlZCBieSBiYWRfaXBfYWRycyAqLwotICAgIG1hc2sgPSBuZXRtYXNrIHwgaHRvbmwobm1hc2spOwotCi0gICAgLyoKLSAgICAgKiBTY2FuIHRocm91Z2ggdGhlIHN5c3RlbSdzIG5ldHdvcmsgaW50ZXJmYWNlcy4KLSAgICAgKi8KLSNpZmRlZiBTSU9DR0lGTlVNCi0gICAgaWYgKGlvY3RsKGlwZmQsIFNJT0NHSUZOVU0sICZuaWYpIDwgMCkKLSNlbmRpZgotCW5pZiA9IE1BWF9JRlM7Ci0gICAgaWZjLmlmY19sZW4gPSBuaWYgKiBzaXplb2Yoc3RydWN0IGlmcmVxKTsKLSAgICBpZmMuaWZjX2J1ZiA9IChjYWRkcl90KSBtYWxsb2MoaWZjLmlmY19sZW4pOwotICAgIGlmIChpZmMuaWZjX2J1ZiA9PSAwKQotCXJldHVybiBtYXNrOwotICAgIGlmIChpb2N0bChpcGZkLCBTSU9DR0lGQ09ORiwgJmlmYykgPCAwKSB7Ci0Jd2FybigiQ291bGRuJ3QgZ2V0IHN5c3RlbSBpbnRlcmZhY2UgbGlzdDogJW0iKTsKLQlmcmVlKGlmYy5pZmNfYnVmKTsKLQlyZXR1cm4gbWFzazsKLSAgICB9Ci0gICAgaWZlbmQgPSAoc3RydWN0IGlmcmVxICopIChpZmMuaWZjX2J1ZiArIGlmYy5pZmNfbGVuKTsKLSAgICBmb3IgKGlmciA9IGlmYy5pZmNfcmVxOyBpZnIgPCBpZmVuZDsgKytpZnIpIHsKLQkvKgotCSAqIENoZWNrIHRoZSBpbnRlcmZhY2UncyBpbnRlcm5ldCBhZGRyZXNzLgotCSAqLwotCWlmIChpZnItPmlmcl9hZGRyLnNhX2ZhbWlseSAhPSBBRl9JTkVUKQotCSAgICBjb250aW51ZTsKLQlpbmEgPSBJTkVUX0FERFIoaWZyLT5pZnJfYWRkcik7Ci0JaWYgKChudG9obChpbmEpICYgbm1hc2spICE9IChhZGRyICYgbm1hc2spKQotCSAgICBjb250aW51ZTsKLQkvKgotCSAqIENoZWNrIHRoYXQgdGhlIGludGVyZmFjZSBpcyB1cCwgYW5kIG5vdCBwb2ludC10by1wb2ludCBvciBsb29wYmFjay4KLQkgKi8KLQlzdHJsY3B5KGlmcmVxLmlmcl9uYW1lLCBpZnItPmlmcl9uYW1lLCBzaXplb2YoaWZyZXEuaWZyX25hbWUpKTsKLQlpZiAoaW9jdGwoaXBmZCwgU0lPQ0dJRkZMQUdTLCAmaWZyZXEpIDwgMCkKLQkgICAgY29udGludWU7Ci0JaWYgKChpZnJlcS5pZnJfZmxhZ3MgJiAoSUZGX1VQfElGRl9QT0lOVE9QT0lOVHxJRkZfTE9PUEJBQ0spKQotCSAgICAhPSBJRkZfVVApCi0JICAgIGNvbnRpbnVlOwotCS8qCi0JICogR2V0IGl0cyBuZXRtYXNrIGFuZCBPUiBpdCBpbnRvIG91ciBtYXNrLgotCSAqLwotCWlmIChpb2N0bChpcGZkLCBTSU9DR0lGTkVUTUFTSywgJmlmcmVxKSA8IDApCi0JICAgIGNvbnRpbnVlOwotCW1hc2sgfD0gSU5FVF9BRERSKGlmcmVxLmlmcl9hZGRyKTsKLSAgICB9Ci0KLSAgICBmcmVlKGlmYy5pZmNfYnVmKTsKLSAgICByZXR1cm4gbWFzazsKLX0KLQotLyoKLSAqIGxvZ3d0bXAgLSB3cml0ZSBhbiBhY2NvdW50aW5nIHJlY29yZCB0byB0aGUgL3Zhci9hZG0vd3RtcCBmaWxlLgotICovCi12b2lkCi1sb2d3dG1wKGxpbmUsIG5hbWUsIGhvc3QpCi0gICAgY29uc3QgY2hhciAqbGluZSwgKm5hbWUsICpob3N0OwotewotICAgIHN0YXRpYyBzdHJ1Y3QgdXRtcHggdXRtcHg7Ci0KLSAgICBpZiAobmFtZVswXSAhPSAwKSB7Ci0JLyogbG9nZ2luZyBpbiAqLwotCXN0cm5jcHkodXRtcHgudXRfdXNlciwgbmFtZSwgc2l6ZW9mKHV0bXB4LnV0X3VzZXIpKTsKLQlzdHJuY3B5KHV0bXB4LnV0X2xpbmUsIGxpbmUsIHNpemVvZih1dG1weC51dF9saW5lKSk7Ci0Jc3RybmNweSh1dG1weC51dF9ob3N0LCBob3N0LCBzaXplb2YodXRtcHgudXRfaG9zdCkpOwotCWlmICgqaG9zdCAhPSAnXDAnKSB7Ci0JICAgIHV0bXB4LnV0X3N5c2xlbiA9IHN0cmxlbihob3N0KSArIDE7Ci0JICAgIGlmICh1dG1weC51dF9zeXNsZW4gPiBzaXplb2YodXRtcHgudXRfaG9zdCkpCi0JCXV0bXB4LnV0X3N5c2xlbiA9IHNpemVvZih1dG1weC51dF9ob3N0KTsKLQl9Ci0JdXRtcHgudXRfcGlkID0gZ2V0cGlkKCk7Ci0JdXRtcHgudXRfdHlwZSA9IFVTRVJfUFJPQ0VTUzsKLSAgICB9IGVsc2UgewotCXV0bXB4LnV0X3R5cGUgPSBERUFEX1BST0NFU1M7Ci0gICAgfQotICAgIGdldHRpbWVvZmRheSgmdXRtcHgudXRfdHYsIE5VTEwpOwotICAgIHVwZHd0bXB4KCIvdmFyL2FkbS93dG1weCIsICZ1dG1weCk7Ci19Ci0KLS8qCi0gKiBnZXRfaG9zdF9zZWVkIC0gcmV0dXJuIHRoZSBzZXJpYWwgbnVtYmVyIG9mIHRoaXMgbWFjaGluZS4KLSAqLwotaW50Ci1nZXRfaG9zdF9zZWVkKCkKLXsKLSAgICBjaGFyIGJ1ZlszMl07Ci0KLSAgICBpZiAoc3lzaW5mbyhTSV9IV19TRVJJQUwsIGJ1Ziwgc2l6ZW9mKGJ1ZikpIDwgMCkgewotCWVycm9yKCJzeXNpbmZvOiAlbSIpOwotCXJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gKGludCkgc3RydG91bChidWYsIE5VTEwsIDE2KTsKLX0KLQotc3RhdGljIGludAotc3RyaW9jdGwoZmQsIGNtZCwgcHRyLCBpbGVuLCBvbGVuKQotICAgIGludCBmZCwgY21kLCBpbGVuLCBvbGVuOwotICAgIHZvaWQgKnB0cjsKLXsKLSAgICBzdHJ1Y3Qgc3RyaW9jdGwgc3RyOwotCi0gICAgc3RyLmljX2NtZCA9IGNtZDsKLSAgICBzdHIuaWNfdGltb3V0ID0gMDsKLSAgICBzdHIuaWNfbGVuID0gaWxlbjsKLSAgICBzdHIuaWNfZHAgPSBwdHI7Ci0gICAgaWYgKGlvY3RsKGZkLCBJX1NUUiwgJnN0cikgPT0gLTEpCi0JcmV0dXJuIC0xOwotICAgIGlmIChzdHIuaWNfbGVuICE9IG9sZW4pCi0JZGJnbG9nKCJzdHJpb2N0bDogZXhwZWN0ZWQgJWQgYnl0ZXMsIGdvdCAlZCBmb3IgY21kICV4XG4iLAotCSAgICAgICBvbGVuLCBzdHIuaWNfbGVuLCBjbWQpOwotICAgIHJldHVybiAwOwotfQotCi0jaWYgMAotLyoKLSAqIGxvY2sgLSBjcmVhdGUgYSBsb2NrIGZpbGUgZm9yIHRoZSBuYW1lZCBsb2NrIGRldmljZQotICovCi0KLSNkZWZpbmUgTE9DS19QUkVGSVgJIi92YXIvc3Bvb2wvbG9ja3MvTEsuIgotc3RhdGljIGNoYXIgbG9ja19maWxlWzQwXTsJLyogbmFtZSBvZiBsb2NrIGZpbGUgY3JlYXRlZCAqLwotCi1pbnQKLWxvY2soZGV2KQotICAgIGNoYXIgKmRldjsKLXsKLSAgICBpbnQgbiwgZmQsIHBpZDsKLSAgICBzdHJ1Y3Qgc3RhdCBzYnVmOwotICAgIGNoYXIgYXNjaWlfcGlkWzEyXTsKLQotICAgIGlmIChzdGF0KGRldiwgJnNidWYpIDwgMCkgewotCWVycm9yKCJDYW4ndCBnZXQgZGV2aWNlIG51bWJlciBmb3IgJXM6ICVtIiwgZGV2KTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmICgoc2J1Zi5zdF9tb2RlICYgU19JRk1UKSAhPSBTX0lGQ0hSKSB7Ci0JZXJyb3IoIkNhbid0IGxvY2sgJXM6IG5vdCBhIGNoYXJhY3RlciBkZXZpY2UiLCBkZXYpOwotCXJldHVybiAtMTsKLSAgICB9Ci0gICAgc2xwcmludGYobG9ja19maWxlLCBzaXplb2YobG9ja19maWxlKSwgIiVzJTAzZC4lMDNkLiUwM2QiLAotCSAgICAgTE9DS19QUkVGSVgsIG1ham9yKHNidWYuc3RfZGV2KSwKLQkgICAgIG1ham9yKHNidWYuc3RfcmRldiksIG1pbm9yKHNidWYuc3RfcmRldikpOwotCi0gICAgd2hpbGUgKChmZCA9IG9wZW4obG9ja19maWxlLCBPX0VYQ0wgfCBPX0NSRUFUIHwgT19SRFdSLCAwNjQ0KSkgPCAwKSB7Ci0JaWYgKGVycm5vID09IEVFWElTVAotCSAgICAmJiAoZmQgPSBvcGVuKGxvY2tfZmlsZSwgT19SRE9OTFksIDApKSA+PSAwKSB7Ci0JICAgIC8qIFJlYWQgdGhlIGxvY2sgZmlsZSB0byBmaW5kIG91dCB3aG8gaGFzIHRoZSBkZXZpY2UgbG9ja2VkICovCi0JICAgIG4gPSByZWFkKGZkLCBhc2NpaV9waWQsIDExKTsKLQkgICAgaWYgKG4gPD0gMCkgewotCQllcnJvcigiQ2FuJ3QgcmVhZCBwaWQgZnJvbSBsb2NrIGZpbGUgJXMiLCBsb2NrX2ZpbGUpOwotCQljbG9zZShmZCk7Ci0JICAgIH0gZWxzZSB7Ci0JCWFzY2lpX3BpZFtuXSA9IDA7Ci0JCXBpZCA9IGF0b2koYXNjaWlfcGlkKTsKLQkJaWYgKHBpZCA+IDAgJiYga2lsbChwaWQsIDApID09IC0xICYmIGVycm5vID09IEVTUkNIKSB7Ci0JCSAgICAvKiBwaWQgbm8gbG9uZ2VyIGV4aXN0cyAtIHJlbW92ZSB0aGUgbG9jayBmaWxlICovCi0JCSAgICBpZiAodW5saW5rKGxvY2tfZmlsZSkgPT0gMCkgewotCQkJY2xvc2UoZmQpOwotCQkJbm90aWNlKCJSZW1vdmVkIHN0YWxlIGxvY2sgb24gJXMgKHBpZCAlZCkiLAotCQkJICAgICAgIGRldiwgcGlkKTsKLQkJCWNvbnRpbnVlOwotCQkgICAgfSBlbHNlCi0JCQl3YXJuKCJDb3VsZG4ndCByZW1vdmUgc3RhbGUgbG9jayBvbiAlcyIsCi0JCQkgICAgICAgZGV2KTsKLQkJfSBlbHNlCi0JCSAgICBub3RpY2UoIkRldmljZSAlcyBpcyBsb2NrZWQgYnkgcGlkICVkIiwKLQkJCSAgIGRldiwgcGlkKTsKLQkgICAgfQotCSAgICBjbG9zZShmZCk7Ci0JfSBlbHNlCi0JICAgIGVycm9yKCJDYW4ndCBjcmVhdGUgbG9jayBmaWxlICVzOiAlbSIsIGxvY2tfZmlsZSk7Ci0JbG9ja19maWxlWzBdID0gMDsKLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgc2xwcmludGYoYXNjaWlfcGlkLCBzaXplb2YoYXNjaWlfcGlkKSwgIiUxMGRcbiIsIGdldHBpZCgpKTsKLSAgICB3cml0ZShmZCwgYXNjaWlfcGlkLCAxMSk7Ci0KLSAgICBjbG9zZShmZCk7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiB1bmxvY2sgLSByZW1vdmUgb3VyIGxvY2tmaWxlCi0gKi8KLXZvaWQKLXVubG9jaygpCi17Ci0gICAgaWYgKGxvY2tfZmlsZVswXSkgewotCXVubGluayhsb2NrX2ZpbGUpOwotCWxvY2tfZmlsZVswXSA9IDA7Ci0gICAgfQotfQotI2VuZGlmCi0KLS8qCi0gKiBjaWZyb3V0ZSAtIGRlbGV0ZSBhIHJvdXRlIHRocm91Z2ggdGhlIGFkZHJlc3NlcyBnaXZlbi4KLSAqLwotaW50Ci1jaWZyb3V0ZSh1LCBvdXIsIGhpcykKLSAgICBpbnQgdTsKLSAgICB1X2ludDMyX3Qgb3VyLCBoaXM7Ci17Ci0gICAgc3RydWN0IHJ0ZW50cnkgcnQ7Ci0KLSAgICBtZW1zZXQoJnJ0LCAwLCBzaXplb2YocnQpKTsKLSAgICBydC5ydF9kc3Quc2FfZmFtaWx5ID0gQUZfSU5FVDsKLSAgICBJTkVUX0FERFIocnQucnRfZHN0KSA9IGhpczsKLSAgICBydC5ydF9nYXRld2F5LnNhX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgSU5FVF9BRERSKHJ0LnJ0X2dhdGV3YXkpID0gb3VyOwotICAgIHJ0LnJ0X2ZsYWdzID0gUlRGX0hPU1Q7Ci0KLSAgICBpZiAoaW9jdGwoaXBmZCwgU0lPQ0RFTFJULCAmcnQpIDwgMCkgewotCWVycm9yKCJDYW4ndCBkZWxldGUgcm91dGU6ICVtIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBoYXZlX3JvdXRlX3RvIC0gZGV0ZXJtaW5lIGlmIHRoZSBzeXN0ZW0gaGFzIGEgcm91dGUgdG8gdGhlIHNwZWNpZmllZAotICogSVAgYWRkcmVzcy4gIFJldHVybnMgMCBpZiBub3QsIDEgaWYgc28sIC0xIGlmIHdlIGNhbid0IHRlbGwuCi0gKiBgYWRkcicgaXMgaW4gbmV0d29yayBieXRlIG9yZGVyLgotICogRm9yIGRlbWFuZCBtb2RlIHRvIHdvcmsgcHJvcGVybHksIHdlIGhhdmUgdG8gaWdub3JlIHJvdXRlcwotICogdGhyb3VnaCBvdXIgb3duIGludGVyZmFjZS4KLSAqLwotI2lmbmRlZiBUX0NVUlJFTlQJCS8qIG5lZWRlZCBmb3IgU29sYXJpcyAyLjUgKi8KLSNkZWZpbmUgVF9DVVJSRU5UCU1JX1RfQ1VSUkVOVAotI2VuZGlmCi0KLWludAotaGF2ZV9yb3V0ZV90byhhZGRyKQotICAgIHVfaW50MzJfdCBhZGRyOwotewotI2lmZGVmIFNPTDIKLSAgICBpbnQgZmQsIHIsIGZsYWdzLCBpOwotICAgIHN0cnVjdCB7Ci0Jc3RydWN0IFRfb3B0bWdtdF9yZXEgcmVxOwotCXN0cnVjdCBvcHRoZHIgaGRyOwotICAgIH0gcmVxOwotICAgIHVuaW9uIHsKLQlzdHJ1Y3QgVF9vcHRtZ210X2FjayBhY2s7Ci0JdW5zaWduZWQgY2hhciBzcGFjZVs2NF07Ci0gICAgfSBhY2s7Ci0gICAgc3RydWN0IG9wdGhkciAqcmg7Ci0gICAgc3RydWN0IHN0cmJ1ZiBjYnVmLCBkYnVmOwotICAgIGludCBucm91dGVzOwotICAgIG1pYjJfaXBSb3V0ZUVudHJ5X3Qgcm91dGVzWzhdOwotICAgIG1pYjJfaXBSb3V0ZUVudHJ5X3QgKnJwOwotCi0gICAgZmQgPSBvcGVuKG11eF9kZXZfbmFtZSwgT19SRFdSKTsKLSAgICBpZiAoZmQgPCAwKSB7Ci0Jd2FybigiaGF2ZV9yb3V0ZV90bzogY291bGRuJ3Qgb3BlbiAlczogJW0iLCBtdXhfZGV2X25hbWUpOwotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgICByZXEucmVxLlBSSU1fdHlwZSA9IFRfT1BUTUdNVF9SRVE7Ci0gICAgcmVxLnJlcS5PUFRfb2Zmc2V0ID0gKGNoYXIgKikgJnJlcS5oZHIgLSAoY2hhciAqKSAmcmVxOwotICAgIHJlcS5yZXEuT1BUX2xlbmd0aCA9IHNpemVvZihyZXEuaGRyKTsKLSAgICByZXEucmVxLk1HTVRfZmxhZ3MgPSBUX0NVUlJFTlQ7Ci0KLSAgICByZXEuaGRyLmxldmVsID0gTUlCMl9JUDsKLSAgICByZXEuaGRyLm5hbWUgPSAwOwotICAgIHJlcS5oZHIubGVuID0gMDsKLQotICAgIGNidWYuYnVmID0gKGNoYXIgKikgJnJlcTsKLSAgICBjYnVmLmxlbiA9IHNpemVvZihyZXEpOwotCi0gICAgaWYgKHB1dG1zZyhmZCwgJmNidWYsIE5VTEwsIDApID09IC0xKSB7Ci0Jd2FybigiaGF2ZV9yb3V0ZV90bzogcHV0bXNnOiAlbSIpOwotCWNsb3NlKGZkKTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgZm9yICg7OykgewotCWNidWYuYnVmID0gKGNoYXIgKikgJmFjazsKLQljYnVmLm1heGxlbiA9IHNpemVvZihhY2spOwotCWRidWYuYnVmID0gKGNoYXIgKikgcm91dGVzOwotCWRidWYubWF4bGVuID0gc2l6ZW9mKHJvdXRlcyk7Ci0JZmxhZ3MgPSAwOwotCXIgPSBnZXRtc2coZmQsICZjYnVmLCAmZGJ1ZiwgJmZsYWdzKTsKLQlpZiAociA9PSAtMSkgewotCSAgICB3YXJuKCJoYXZlX3JvdXRlX3RvOiBnZXRtc2c6ICVtIik7Ci0JICAgIGNsb3NlKGZkKTsKLQkgICAgcmV0dXJuIC0xOwotCX0KLQotCWlmIChjYnVmLmxlbiA8IHNpemVvZihzdHJ1Y3QgVF9vcHRtZ210X2FjaykKLQkgICAgfHwgYWNrLmFjay5QUklNX3R5cGUgIT0gVF9PUFRNR01UX0FDSwotCSAgICB8fCBhY2suYWNrLk1HTVRfZmxhZ3MgIT0gVF9TVUNDRVNTCi0JICAgIHx8IGFjay5hY2suT1BUX2xlbmd0aCA8IHNpemVvZihzdHJ1Y3Qgb3B0aGRyKSkgewotCSAgICBkYmdsb2coImhhdmVfcm91dGVfdG86IGJhZCBtZXNzYWdlIGxlbj0lZCBwcmltPSVkIiwKLQkJICAgY2J1Zi5sZW4sIGFjay5hY2suUFJJTV90eXBlKTsKLQkgICAgY2xvc2UoZmQpOwotCSAgICByZXR1cm4gLTE7Ci0JfQotCi0JcmggPSAoc3RydWN0IG9wdGhkciAqKSAoKGNoYXIgKikmYWNrICsgYWNrLmFjay5PUFRfb2Zmc2V0KTsKLQlpZiAocmgtPmxldmVsID09IDAgJiYgcmgtPm5hbWUgPT0gMCkKLQkgICAgYnJlYWs7Ci0JaWYgKHJoLT5sZXZlbCAhPSBNSUIyX0lQIHx8IHJoLT5uYW1lICE9IE1JQjJfSVBfMjEpIHsKLQkgICAgd2hpbGUgKHIgPT0gTU9SRURBVEEpCi0JCXIgPSBnZXRtc2coZmQsIE5VTEwsICZkYnVmLCAmZmxhZ3MpOwotCSAgICBjb250aW51ZTsKLQl9Ci0KLQlmb3IgKDs7KSB7Ci0JICAgIG5yb3V0ZXMgPSBkYnVmLmxlbiAvIHNpemVvZihtaWIyX2lwUm91dGVFbnRyeV90KTsKLQkgICAgZm9yIChycCA9IHJvdXRlcywgaSA9IDA7IGkgPCBucm91dGVzOyArK2ksICsrcnApIHsKLQkJaWYgKHJwLT5pcFJvdXRlTWFzayAhPSB+MCkgewotCQkgICAgZGJnbG9nKCJoYXZlX3JvdXRlX3RvOiBkZXN0PSV4IGd3PSV4IG1hc2s9JXhcbiIsCi0JCQkgICBycC0+aXBSb3V0ZURlc3QsIHJwLT5pcFJvdXRlTmV4dEhvcCwKLQkJCSAgIHJwLT5pcFJvdXRlTWFzayk7Ci0JCSAgICBpZiAoKChhZGRyIF4gcnAtPmlwUm91dGVEZXN0KSAmIHJwLT5pcFJvdXRlTWFzaykgPT0gMAotCQkJJiYgcnAtPmlwUm91dGVOZXh0SG9wICE9IHJlbW90ZV9hZGRyKQotCQkJcmV0dXJuIDE7Ci0JCX0KLQkgICAgfQotCSAgICBpZiAociA9PSAwKQotCQlicmVhazsKLQkgICAgciA9IGdldG1zZyhmZCwgTlVMTCwgJmRidWYsICZmbGFncyk7Ci0JfQotICAgIH0KLSAgICBjbG9zZShmZCk7Ci0gICAgcmV0dXJuIDA7Ci0jZWxzZQotICAgIHJldHVybiAtMTsKLSNlbmRpZiAvKiBTT0wyICovCi19Ci0KLS8qCi0gKiBnZXRfcHR5IC0gZ2V0IGEgcHR5IG1hc3Rlci9zbGF2ZSBwYWlyIGFuZCBjaG93biB0aGUgc2xhdmUgc2lkZSB0bwotICogdGhlIHVpZCBnaXZlbi4gIEFzc3VtZXMgc2xhdmVfbmFtZSBwb2ludHMgdG8gTUFYUEFUSExFTiBieXRlcyBvZiBzcGFjZS4KLSAqLwotaW50Ci1nZXRfcHR5KG1hc3Rlcl9mZHAsIHNsYXZlX2ZkcCwgc2xhdmVfbmFtZSwgdWlkKQotICAgIGludCAqbWFzdGVyX2ZkcDsKLSAgICBpbnQgKnNsYXZlX2ZkcDsKLSAgICBjaGFyICpzbGF2ZV9uYW1lOwotICAgIGludCB1aWQ7Ci17Ci0gICAgaW50IG1mZCwgc2ZkOwotICAgIGNoYXIgKnB0eV9uYW1lOwotCi0gICAgbWZkID0gb3BlbigiL2Rldi9wdG14IiwgT19SRFdSKTsKLSAgICBpZiAobWZkIDwgMCkgewotCWVycm9yKCJDb3VsZG4ndCBvcGVuIHB0eSBtYXN0ZXI6ICVtIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHR5X25hbWUgPSBwdHNuYW1lKG1mZCk7Ci0gICAgaWYgKHB0eV9uYW1lID09IE5VTEwpIHsKLQllcnJvcigiQ291bGRuJ3QgZ2V0IG5hbWUgb2YgcHR5IHNsYXZlIik7Ci0JY2xvc2UobWZkKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGNob3duKHB0eV9uYW1lLCB1aWQsIC0xKSA8IDApCi0Jd2FybigiQ291bGRuJ3QgY2hhbmdlIG93bmVyIG9mIHB0eSBzbGF2ZTogJW0iKTsKLSAgICBpZiAoY2htb2QocHR5X25hbWUsIFNfSVJVU1IgfCBTX0lXVVNSKSA8IDApCi0Jd2FybigiQ291bGRuJ3QgY2hhbmdlIHBlcm1pc3Npb25zIG9uIHB0eSBzbGF2ZTogJW0iKTsKLSAgICBpZiAodW5sb2NrcHQobWZkKSA8IDApCi0Jd2FybigiQ291bGRuJ3QgdW5sb2NrIHB0eSBzbGF2ZTogJW0iKTsKLQotICAgIHNmZCA9IG9wZW4ocHR5X25hbWUsIE9fUkRXUik7Ci0gICAgaWYgKHNmZCA8IDApIHsKLQllcnJvcigiQ291bGRuJ3Qgb3BlbiBwdHkgc2xhdmUgJXM6ICVtIiwgcHR5X25hbWUpOwotCWNsb3NlKG1mZCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChpb2N0bChzZmQsIElfUFVTSCwgInB0ZW0iKSA8IDApCi0Jd2FybigiQ291bGRuJ3QgcHVzaCBwdGVtIG1vZHVsZSBvbiBwdHkgc2xhdmU6ICVtIik7Ci0KLSAgICBkYmdsb2coIlVzaW5nICVzIiwgcHR5X25hbWUpOwotICAgIHN0cmxjcHkoc2xhdmVfbmFtZSwgcHR5X25hbWUsIE1BWFBBVEhMRU4pOwotICAgICptYXN0ZXJfZmRwID0gbWZkOwotICAgICpzbGF2ZV9mZHAgPSBzZmQ7Ci0KLSAgICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL3BwcGQvdHR5LmMgYi9wcHBkL3R0eS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWEwYjMzLi4wMDAwMDAwCi0tLSBhL3BwcGQvdHR5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjY2ICswLDAgQEAKLS8qCi0gKiB0dHkuYyAtIGNvZGUgZm9yIGhhbmRsaW5nIHNlcmlhbCBwb3J0cyBpbiBwcHBkLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IFBhdWwgTWFja2VycmFzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gVGhlIG5hbWUocykgb2YgdGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIDMuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgUGF1bCBNYWNrZXJyYXMKLSAqICAgICA8cGF1bHVzQHNhbWJhLm9yZz4iLgotICoKLSAqIFRIRSBBVVRIT1JTIE9GIFRISVMgU09GVFdBUkUgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLSAqIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotICogQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKgotICogUG9ydGlvbnMgZGVyaXZlZCBmcm9tIG1haW4uYywgd2hpY2ggaXM6Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTg0LTIwMDAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIG5hbWUgIkNhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3IgcGVybWlzc2lvbiBvciBhbnkgbGVnYWwKLSAqICAgIGRldGFpbHMsIHBsZWFzZSBjb250YWN0Ci0gKiAgICAgIE9mZmljZSBvZiBUZWNobm9sb2d5IFRyYW5zZmVyCi0gKiAgICAgIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5Ci0gKiAgICAgIDUwMDAgRm9yYmVzIEF2ZW51ZQotICogICAgICBQaXR0c2J1cmdoLCBQQSAgMTUyMTMtMzg5MAotICogICAgICAoNDEyKSAyNjgtNDM4NywgZmF4OiAoNDEyKSAyNjgtNzM5NQotICogICAgICB0ZWNoLXRyYW5zZmVyQGFuZHJldy5jbXUuZWR1Ci0gKgotICogNC4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBDb21wdXRpbmcgU2VydmljZXMKLSAqICAgICBhdCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSAoaHR0cDovL3d3dy5jbXUuZWR1L2NvbXB1dGluZy8pLiIKLSAqCi0gKiBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLSAqIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotICogQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIENBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIEJFIExJQUJMRQotICogRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2RlZmluZSBSQ1NJRAkiJElkOiB0dHkuYyx2IDEuMjcgMjAwOC8wNy8wMSAxMjoyNzo1NiBwYXVsdXMgRXhwICQiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dGVybWlvcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXNsb2cuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHV0bXAuaD4KLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotCi0jaW5jbHVkZSAicHBwZC5oIgotI2luY2x1ZGUgImZzbS5oIgotI2luY2x1ZGUgImxjcC5oIgotCi12b2lkIHR0eV9wcm9jZXNzX2V4dHJhX29wdGlvbnMgX19QKCh2b2lkKSk7Ci12b2lkIHR0eV9jaGVja19vcHRpb25zIF9fUCgodm9pZCkpOwotaW50ICBjb25uZWN0X3R0eSBfX1AoKHZvaWQpKTsKLXZvaWQgZGlzY29ubmVjdF90dHkgX19QKCh2b2lkKSk7Ci12b2lkIHR0eV9jbG9zZV9mZHMgX19QKCh2b2lkKSk7Ci12b2lkIGNsZWFudXBfdHR5IF9fUCgodm9pZCkpOwotdm9pZCB0dHlfZG9fc2VuZF9jb25maWcgX19QKChpbnQsIHVfaW50MzJfdCwgaW50LCBpbnQpKTsKLQotc3RhdGljIGludCBzZXRkZXZuYW1lIF9fUCgoY2hhciAqLCBjaGFyICoqLCBpbnQpKTsKLXN0YXRpYyBpbnQgc2V0c3BlZWQgX19QKChjaGFyICosIGNoYXIgKiosIGludCkpOwotc3RhdGljIGludCBzZXR4b254b2ZmIF9fUCgoY2hhciAqKikpOwotc3RhdGljIGludCBzZXRlc2NhcGUgX19QKChjaGFyICoqKSk7Ci1zdGF0aWMgdm9pZCBwcmludGVzY2FwZSBfX1AoKG9wdGlvbl90ICosIHZvaWQgKCopKHZvaWQgKiwgY2hhciAqLC4uLiksdm9pZCAqKSk7Ci1zdGF0aWMgdm9pZCBmaW5pc2hfdHR5IF9fUCgodm9pZCkpOwotc3RhdGljIGludCBzdGFydF9jaGFyc2h1bnQgX19QKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgc3RvcF9jaGFyc2h1bnQgX19QKCh2b2lkICosIGludCkpOwotc3RhdGljIHZvaWQgY2hhcnNodW50X2RvbmUgX19QKCh2b2lkICopKTsKLXN0YXRpYyB2b2lkIGNoYXJzaHVudCBfX1AoKGludCwgaW50LCBjaGFyICopKTsKLXN0YXRpYyBpbnQgcmVjb3JkX3dyaXRlIF9fUCgoRklMRSAqLCBpbnQgY29kZSwgdV9jaGFyICpidWYsIGludCBuYiwKLQkJCSAgICAgc3RydWN0IHRpbWV2YWwgKikpOwotc3RhdGljIGludCBvcGVuX3NvY2tldCBfX1AoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgbWF5YmVfcmVsb2NrIF9fUCgodm9pZCAqLCBpbnQpKTsKLQotc3RhdGljIGludCBwdHlfbWFzdGVyOwkJLyogZmQgZm9yIG1hc3RlciBzaWRlIG9mIHB0eSAqLwotc3RhdGljIGludCBwdHlfc2xhdmU7CQkvKiBmZCBmb3Igc2xhdmUgc2lkZSBvZiBwdHkgKi8KLXN0YXRpYyBpbnQgcmVhbF90dHlmZDsJCS8qIGZkIGZvciBhY3R1YWwgc2VyaWFsIHBvcnQgKG5vdCBwdHkpICovCi1zdGF0aWMgaW50IHR0eWZkOwkJLyogU2VyaWFsIHBvcnQgZmlsZSBkZXNjcmlwdG9yICovCi1zdGF0aWMgY2hhciBzcGVlZF9zdHJbMTZdOwkvKiBTZXJpYWwgcG9ydCBzcGVlZCBhcyBzdHJpbmcgKi8KLQotbW9kZV90IHR0eV9tb2RlID0gKG1vZGVfdCktMTsJLyogT3JpZ2luYWwgYWNjZXNzIHBlcm1pc3Npb25zIHRvIHR0eSAqLwotaW50IGJhdWRfcmF0ZTsJCQkvKiBBY3R1YWwgYml0cy9zZWNvbmQgZm9yIHNlcmlhbCBkZXZpY2UgKi8KLWNoYXIgKmNhbGxiYWNrX3NjcmlwdDsJCS8qIHNjcmlwdCBmb3IgZG9pbmcgY2FsbGJhY2sgKi8KLWludCBjaGFyc2h1bnRfcGlkOwkJLyogUHJvY2VzcyBJRCBmb3IgY2hhcnNodW50ICovCi1pbnQgbG9ja2VkOwkJCS8qIGxvY2soKSBoYXMgc3VjY2VlZGVkICovCi1zdHJ1Y3Qgc3RhdCBkZXZzdGF0OwkJLyogcmVzdWx0IG9mIHN0YXQoKSBvbiBkZXZuYW0gKi8KLQotLyogb3B0aW9uIHZhcmlhYmxlcyAqLwotaW50CWNydHNjdHMgPSAwOwkJLyogVXNlIGhhcmR3YXJlIGZsb3cgY29udHJvbCAqLwotaW50CXN0b3BfYml0cyA9IDE7CQkvKiBOdW1iZXIgb2Ygc2VyaWFsIHBvcnQgc3RvcCBiaXRzICovCi1ib29sCW1vZGVtID0gMTsJCS8qIFVzZSBtb2RlbSBjb250cm9sIGxpbmVzICovCi1pbnQJaW5zcGVlZCA9IDA7CQkvKiBJbnB1dC9PdXRwdXQgc3BlZWQgcmVxdWVzdGVkICovCi1ib29sCWxvY2tmbGFnID0gMDsJCS8qIENyZWF0ZSBsb2NrIGZpbGUgdG8gbG9jayB0aGUgc2VyaWFsIGRldiAqLwotY2hhcgkqaW5pdGlhbGl6ZXIgPSBOVUxMOwkvKiBTY3JpcHQgdG8gaW5pdGlhbGl6ZSBwaHlzaWNhbCBsaW5rICovCi1jaGFyCSpjb25uZWN0X3NjcmlwdCA9IE5VTEw7CS8qIFNjcmlwdCB0byBlc3RhYmxpc2ggcGh5c2ljYWwgbGluayAqLwotY2hhcgkqZGlzY29ubmVjdF9zY3JpcHQgPSBOVUxMOyAvKiBTY3JpcHQgdG8gZGlzZXN0YWJsaXNoIHBoeXNpY2FsIGxpbmsgKi8KLWNoYXIJKndlbGNvbWVyID0gTlVMTDsJLyogU2NyaXB0IHRvIHJ1biBhZnRlciBwaHlzIGxpbmsgZXN0YWIuICovCi1jaGFyCSpwdHljb21tYW5kID0gTlVMTDsJLyogQ29tbWFuZCB0byBydW4gb24gb3RoZXIgc2lkZSBvZiBwdHkgKi8KLWJvb2wJbm90dHkgPSAwOwkJLyogU3RkaW4vb3V0IGlzIG5vdCBhIHR0eSAqLwotY2hhcgkqcmVjb3JkX2ZpbGUgPSBOVUxMOwkvKiBGaWxlIHRvIHJlY29yZCBjaGFycyBzZW50L3JlY2VpdmVkICovCi1pbnQJbWF4X2RhdGFfcmF0ZTsJCS8qIG1heCBieXRlcy9zZWMgdGhyb3VnaCBjaGFyc2h1bnQgKi8KLWJvb2wJc3luY19zZXJpYWwgPSAwOwkvKiBEZXZpY2UgaXMgc3luY2hyb25vdXMgc2VyaWFsIGRldmljZSAqLwotY2hhcgkqcHR5X3NvY2tldCA9IE5VTEw7CS8qIFNvY2tldCB0byBjb25uZWN0IHRvIHB0eSAqLwotaW50CXVzaW5nX3B0eSA9IDA7CQkvKiB3ZSdyZSBhbGxvY2F0aW5nIGEgcHR5IGFzIHRoZSBkZXZpY2UgKi8KLQotZXh0ZXJuIHVpZF90IHVpZDsKLWV4dGVybiBpbnQga2lsbF9saW5rOwotZXh0ZXJuIGludCBhc2tlZF90b19xdWl0OwotZXh0ZXJuIGludCBnb3Rfc2lndGVybTsKLQotLyogWFhYICovCi1leHRlcm4gaW50IHByaXZvcGVuOwkJLyogZG9uJ3QgbG9jaywgb3BlbiBkZXZpY2UgYXMgcm9vdCAqLwotCi11X2ludDMyX3QgeG1pdF9hY2NtWzhdOwkJLyogZXh0ZW5kZWQgdHJhbnNtaXQgQUNDTSAqLwotCi0vKiBvcHRpb24gZGVzY3JpcHRvcnMgKi8KLW9wdGlvbl90IHR0eV9vcHRpb25zW10gPSB7Ci0gICAgLyogZGV2aWNlIG5hbWUgbXVzdCBiZSBmaXJzdCwgb3IgY2hhbmdlIGNvbm5lY3RfdHR5KCkgYmVsb3chICovCi0gICAgeyAiZGV2aWNlIG5hbWUiLCBvX3dpbGQsICh2b2lkICopICZzZXRkZXZuYW1lLAotICAgICAgIlNlcmlhbCBwb3J0IGRldmljZSBuYW1lIiwKLSAgICAgIE9QVF9ERVZOQU0gfCBPUFRfUFJJVkZJWCB8IE9QVF9OT0FSRyAgfCBPUFRfQTJTVFJWQUwgfCBPUFRfU1RBVElDLAotICAgICAgZGV2bmFtfSwKLQotICAgIHsgInR0eSBzcGVlZCIsIG9fd2lsZCwgKHZvaWQgKikgJnNldHNwZWVkLAotICAgICAgIkJhdWQgcmF0ZSBmb3Igc2VyaWFsIHBvcnQiLAotICAgICAgT1BUX1BSSU8gfCBPUFRfTk9BUkcgfCBPUFRfQTJTVFJWQUwgfCBPUFRfU1RBVElDLCBzcGVlZF9zdHIgfSwKLQotICAgIHsgImxvY2siLCBvX2Jvb2wsICZsb2NrZmxhZywKLSAgICAgICJMb2NrIHNlcmlhbCBkZXZpY2Ugd2l0aCBVVUNQLXN0eWxlIGxvY2sgZmlsZSIsIE9QVF9QUklPIHwgMSB9LAotICAgIHsgIm5vbG9jayIsIG9fYm9vbCwgJmxvY2tmbGFnLAotICAgICAgIkRvbid0IGxvY2sgc2VyaWFsIGRldmljZSIsIE9QVF9QUklPU1VCIHwgT1BUX1BSSVYgfSwKLQotICAgIHsgImluaXQiLCBvX3N0cmluZywgJmluaXRpYWxpemVyLAotICAgICAgIkEgcHJvZ3JhbSB0byBpbml0aWFsaXplIHRoZSBkZXZpY2UiLCBPUFRfUFJJTyB8IE9QVF9QUklWRklYIH0sCi0KLSAgICB7ICJjb25uZWN0Iiwgb19zdHJpbmcsICZjb25uZWN0X3NjcmlwdCwKLSAgICAgICJBIHByb2dyYW0gdG8gc2V0IHVwIGEgY29ubmVjdGlvbiIsIE9QVF9QUklPIHwgT1BUX1BSSVZGSVggfSwKLQotICAgIHsgImRpc2Nvbm5lY3QiLCBvX3N0cmluZywgJmRpc2Nvbm5lY3Rfc2NyaXB0LAotICAgICAgIlByb2dyYW0gdG8gZGlzY29ubmVjdCBzZXJpYWwgZGV2aWNlIiwgT1BUX1BSSU8gfCBPUFRfUFJJVkZJWCB9LAotCi0gICAgeyAid2VsY29tZSIsIG9fc3RyaW5nLCAmd2VsY29tZXIsCi0gICAgICAiU2NyaXB0IHRvIHdlbGNvbWUgY2xpZW50IiwgT1BUX1BSSU8gfCBPUFRfUFJJVkZJWCB9LAotCi0gICAgeyAicHR5Iiwgb19zdHJpbmcsICZwdHljb21tYW5kLAotICAgICAgIlNjcmlwdCB0byBydW4gb24gcHNldWRvLXR0eSBtYXN0ZXIgc2lkZSIsCi0gICAgICBPUFRfUFJJTyB8IE9QVF9QUklWRklYIHwgT1BUX0RFVk5BTSB9LAotCi0gICAgeyAibm90dHkiLCBvX2Jvb2wsICZub3R0eSwKLSAgICAgICJJbnB1dC9vdXRwdXQgaXMgbm90IGEgdHR5IiwgT1BUX0RFVk5BTSB8IDEgfSwKLQotICAgIHsgInNvY2tldCIsIG9fc3RyaW5nLCAmcHR5X3NvY2tldCwKLSAgICAgICJTZW5kIGFuZCByZWNlaXZlIG92ZXIgc29ja2V0LCBhcmcgaXMgaG9zdDpwb3J0IiwKLSAgICAgIE9QVF9QUklPIHwgT1BUX0RFVk5BTSB9LAotCi0gICAgeyAicmVjb3JkIiwgb19zdHJpbmcsICZyZWNvcmRfZmlsZSwKLSAgICAgICJSZWNvcmQgY2hhcmFjdGVycyBzZW50L3JlY2VpdmVkIHRvIGZpbGUiLCBPUFRfUFJJTyB9LAotCi0gICAgeyAiY3J0c2N0cyIsIG9faW50LCAmY3J0c2N0cywKLSAgICAgICJTZXQgaGFyZHdhcmUgKFJUUy9DVFMpIGZsb3cgY29udHJvbCIsCi0gICAgICBPUFRfUFJJTyB8IE9QVF9OT0FSRyB8IE9QVF9WQUwoMSkgfSwKLSAgICB7ICJjZHRyY3RzIiwgb19pbnQsICZjcnRzY3RzLAotICAgICAgIlNldCBhbHRlcm5hdGUgaGFyZHdhcmUgKERUUi9DVFMpIGZsb3cgY29udHJvbCIsCi0gICAgICBPUFRfUFJJT1NVQiB8IE9QVF9OT0FSRyB8IE9QVF9WQUwoMikgfSwKLSAgICB7ICJub2NydHNjdHMiLCBvX2ludCwgJmNydHNjdHMsCi0gICAgICAiRGlzYWJsZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wiLAotICAgICAgT1BUX1BSSU9TVUIgfCBPUFRfTk9BUkcgfCBPUFRfVkFMKC0xKSB9LAotICAgIHsgIi1jcnRzY3RzIiwgb19pbnQsICZjcnRzY3RzLAotICAgICAgIkRpc2FibGUgaGFyZHdhcmUgZmxvdyBjb250cm9sIiwKLSAgICAgIE9QVF9QUklPU1VCIHwgT1BUX0FMSUFTIHwgT1BUX05PQVJHIHwgT1BUX1ZBTCgtMSkgfSwKLSAgICB7ICJub2NkdHJjdHMiLCBvX2ludCwgJmNydHNjdHMsCi0gICAgICAiRGlzYWJsZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wiLAotICAgICAgT1BUX1BSSU9TVUIgfCBPUFRfQUxJQVMgfCBPUFRfTk9BUkcgfCBPUFRfVkFMKC0xKSB9LAotICAgIHsgInhvbnhvZmYiLCBvX3NwZWNpYWxfbm9hcmcsICh2b2lkICopc2V0eG9ueG9mZiwKLSAgICAgICJTZXQgc29mdHdhcmUgKFhPTi9YT0ZGKSBmbG93IGNvbnRyb2wiLCBPUFRfUFJJT1NVQiB9LAotICAgIHsgInN0b3AtYml0cyIsIG9faW50LCAmc3RvcF9iaXRzLAotICAgICAgIk51bWJlciBvZiBzdG9wIGJpdHMgaW4gc2VyaWFsIHBvcnQiLAotICAgICAgT1BUX1BSSU8gfCBPUFRfUFJJVkZJWCB8IE9QVF9MSU1JVFMsIE5VTEwsIDIsIDEgfSwKLQotICAgIHsgIm1vZGVtIiwgb19ib29sLCAmbW9kZW0sCi0gICAgICAiVXNlIG1vZGVtIGNvbnRyb2wgbGluZXMiLCBPUFRfUFJJTyB8IDEgfSwKLSAgICB7ICJsb2NhbCIsIG9fYm9vbCwgJm1vZGVtLAotICAgICAgIkRvbid0IHVzZSBtb2RlbSBjb250cm9sIGxpbmVzIiwgT1BUX1BSSU9TVUIgfCAwIH0sCi0KLSAgICB7ICJzeW5jIiwgb19ib29sLCAmc3luY19zZXJpYWwsCi0gICAgICAiVXNlIHN5bmNocm9ub3VzIEhETEMgc2VyaWFsIGVuY29kaW5nIiwgMSB9LAotCi0gICAgeyAiZGF0YXJhdGUiLCBvX2ludCwgJm1heF9kYXRhX3JhdGUsCi0gICAgICAiTWF4aW11bSBkYXRhIHJhdGUgaW4gYnl0ZXMvc2VjICh3aXRoIHB0eSwgbm90dHkgb3IgcmVjb3JkIG9wdGlvbikiLAotICAgICAgT1BUX1BSSU8gfSwKLQotICAgIHsgImVzY2FwZSIsIG9fc3BlY2lhbCwgKHZvaWQgKilzZXRlc2NhcGUsCi0gICAgICAiTGlzdCBvZiBjaGFyYWN0ZXIgY29kZXMgdG8gZXNjYXBlIG9uIHRyYW5zbWlzc2lvbiIsCi0gICAgICBPUFRfQTJQUklOVEVSLCAodm9pZCAqKXByaW50ZXNjYXBlIH0sCi0KLSAgICB7IE5VTEwgfQotfTsKLQotCi1zdHJ1Y3QgY2hhbm5lbCB0dHlfY2hhbm5lbCA9IHsKLQl0dHlfb3B0aW9ucywKLQkmdHR5X3Byb2Nlc3NfZXh0cmFfb3B0aW9ucywKLQkmdHR5X2NoZWNrX29wdGlvbnMsCi0JJmNvbm5lY3RfdHR5LAotCSZkaXNjb25uZWN0X3R0eSwKLQkmdHR5X2VzdGFibGlzaF9wcHAsCi0JJnR0eV9kaXNlc3RhYmxpc2hfcHBwLAotCSZ0dHlfZG9fc2VuZF9jb25maWcsCi0JJnR0eV9yZWN2X2NvbmZpZywKLQkmY2xlYW51cF90dHksCi0JJnR0eV9jbG9zZV9mZHMKLX07Ci0KLS8qCi0gKiBzZXRzcGVlZCAtIFNldCB0aGUgc2VyaWFsIHBvcnQgYmF1ZCByYXRlLgotICogSWYgZG9pdCBpcyAwLCB0aGUgY2FsbCBpcyB0byBjaGVjayB3aGV0aGVyIHRoaXMgb3B0aW9uIGlzCi0gKiBwb3RlbnRpYWxseSBhIHNwZWVkIHZhbHVlLgotICovCi1zdGF0aWMgaW50Ci1zZXRzcGVlZChhcmcsIGFyZ3YsIGRvaXQpCi0gICAgY2hhciAqYXJnOwotICAgIGNoYXIgKiphcmd2OwotICAgIGludCBkb2l0OwotewotCWNoYXIgKnB0cjsKLQlpbnQgc3BkOwotCi0Jc3BkID0gc3RydG9sKGFyZywgJnB0ciwgMCk7Ci0JaWYgKHB0ciA9PSBhcmcgfHwgKnB0ciAhPSAwIHx8IHNwZCA9PSAwKQotCQlyZXR1cm4gMDsKLQlpZiAoZG9pdCkgewotCQlpbnNwZWVkID0gc3BkOwotCQlzbHByaW50ZihzcGVlZF9zdHIsIHNpemVvZihzcGVlZF9zdHIpLCAiJWQiLCBzcGQpOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotCi0vKgotICogc2V0ZGV2bmFtZSAtIFNldCB0aGUgZGV2aWNlIG5hbWUuCi0gKiBJZiBkb2l0IGlzIDAsIHRoZSBjYWxsIGlzIHRvIGNoZWNrIHdoZXRoZXIgdGhpcyBvcHRpb24gaXMKLSAqIHBvdGVudGlhbGx5IGEgZGV2aWNlIG5hbWUuCi0gKi8KLXN0YXRpYyBpbnQKLXNldGRldm5hbWUoY3AsIGFyZ3YsIGRvaXQpCi0gICAgY2hhciAqY3A7Ci0gICAgY2hhciAqKmFyZ3Y7Ci0gICAgaW50IGRvaXQ7Ci17Ci0Jc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLQljaGFyIGRldltNQVhQQVRITEVOXTsKLQotCWlmICgqY3AgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoKmNwICE9ICcvJykgewotCQlzdHJsY3B5KGRldiwgIi9kZXYvIiwgc2l6ZW9mKGRldikpOwotCQlzdHJsY2F0KGRldiwgY3AsIHNpemVvZihkZXYpKTsKLQkJY3AgPSBkZXY7Ci0JfQotCi0JLyoKLQkgKiBDaGVjayBpZiB0aGVyZSBpcyBhIGNoYXJhY3RlciBkZXZpY2UgYnkgdGhpcyBuYW1lLgotCSAqLwotCWlmIChzdGF0KGNwLCAmc3RhdGJ1ZikgPCAwKSB7Ci0JCWlmICghZG9pdCkKLQkJCXJldHVybiBlcnJubyAhPSBFTk9FTlQ7Ci0JCW9wdGlvbl9lcnJvcigiQ291bGRuJ3Qgc3RhdCAlczogJW0iLCBjcCk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoIVNfSVNDSFIoc3RhdGJ1Zi5zdF9tb2RlKSkgewotCQlpZiAoZG9pdCkKLQkJCW9wdGlvbl9lcnJvcigiJXMgaXMgbm90IGEgY2hhcmFjdGVyIGRldmljZSIsIGNwKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKGRvaXQpIHsKLQkJc3RybGNweShkZXZuYW0sIGNwLCBzaXplb2YoZGV2bmFtKSk7Ci0JCWRldnN0YXQgPSBzdGF0YnVmOwotCQlkZWZhdWx0X2RldmljZSA9IDA7Ci0JfQotICAKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotc2V0eG9ueG9mZihhcmd2KQotICAgIGNoYXIgKiphcmd2OwotewotCWxjcF93YW50b3B0aW9uc1swXS5hc3luY21hcCB8PSAweDAwMEEwMDAwOwkvKiBlc2NhcGUgXlMgYW5kIF5RICovCi0JbGNwX3dhbnRvcHRpb25zWzBdLm5lZ19hc3luY21hcCA9IDE7Ci0KLQljcnRzY3RzID0gLTI7Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBzZXRlc2NhcGUgLSBhZGQgY2hhcnMgdG8gdGhlIHNldCB3ZSBlc2NhcGUgb24gdHJhbnNtaXNzaW9uLgotICovCi1zdGF0aWMgaW50Ci1zZXRlc2NhcGUoYXJndikKLSAgICBjaGFyICoqYXJndjsKLXsKLSAgICBpbnQgbiwgcmV0OwotICAgIGNoYXIgKnAsICplbmRwOwotCi0gICAgcCA9ICphcmd2OwotICAgIHJldCA9IDE7Ci0gICAgd2hpbGUgKCpwKSB7Ci0JbiA9IHN0cnRvbChwLCAmZW5kcCwgMTYpOwotCWlmIChwID09IGVuZHApIHsKLQkgICAgb3B0aW9uX2Vycm9yKCJlc2NhcGUgcGFyYW1ldGVyIGNvbnRhaW5zIGludmFsaWQgaGV4IG51bWJlciAnJXMnIiwKLQkJCSBwKTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCXAgPSBlbmRwOwotCWlmIChuIDwgMCB8fCBuID09IDB4NUUgfHwgbiA+IDB4RkYpIHsKLQkgICAgb3B0aW9uX2Vycm9yKCJjYW4ndCBlc2NhcGUgY2hhcmFjdGVyIDB4JXgiLCBuKTsKLQkgICAgcmV0ID0gMDsKLQl9IGVsc2UKLQkgICAgeG1pdF9hY2NtW24gPj4gNV0gfD0gMSA8PCAobiAmIDB4MUYpOwotCXdoaWxlICgqcCA9PSAnLCcgfHwgKnAgPT0gJyAnKQotCSAgICArK3A7Ci0gICAgfQotICAgIGxjcF9hbGxvd29wdGlvbnNbMF0uYXN5bmNtYXAgPSB4bWl0X2FjY21bMF07Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50ZXNjYXBlKG9wdCwgcHJpbnRlciwgYXJnKQotICAgIG9wdGlvbl90ICpvcHQ7Ci0gICAgdm9pZCAoKnByaW50ZXIpIF9fUCgodm9pZCAqLCBjaGFyICosIC4uLikpOwotICAgIHZvaWQgKmFyZzsKLXsKLQlpbnQgbjsKLQlpbnQgZmlyc3QgPSAxOwotCi0JZm9yIChuID0gMDsgbiA8IDI1NjsgKytuKSB7Ci0JCWlmIChuID09IDB4N2QpCi0JCQluICs9IDI7CQkvKiBza2lwIDdkLCA3ZSAqLwotCQlpZiAoeG1pdF9hY2NtW24gPj4gNV0gJiAoMSA8PCAobiAmIDB4MWYpKSkgewotCQkJaWYgKCFmaXJzdCkKLQkJCQlwcmludGVyKGFyZywgIiwiKTsKLQkJCWVsc2UKLQkJCQlmaXJzdCA9IDA7Ci0JCQlwcmludGVyKGFyZywgIiV4Iiwgbik7Ci0JCX0KLQl9Ci0JaWYgKGZpcnN0KQotCQlwcmludGVyKGFyZywgIm9vcHMgIyBub3RoaW5nIGVzY2FwZWQiKTsKLX0KLQotLyoKLSAqIHR0eV9pbml0IC0gZG8gdmFyaW91cyB0dHktcmVsYXRlZCBpbml0aWFsaXphdGlvbnMuCi0gKi8KLXZvaWQgdHR5X2luaXQoKQotewotICAgIGFkZF9ub3RpZmllcigmcGlkY2hhbmdlLCBtYXliZV9yZWxvY2ssIDApOwotICAgIHRoZV9jaGFubmVsID0gJnR0eV9jaGFubmVsOwotICAgIHhtaXRfYWNjbVszXSA9IDB4NjAwMDAwMDA7Ci19Ci0KLS8qCi0gKiB0dHlfcHJvY2Vzc19leHRyYV9vcHRpb25zIC0gd29yayBvdXQgd2hpY2ggdHR5IGRldmljZSB3ZSBhcmUgdXNpbmcKLSAqIGFuZCByZWFkIGl0cyBvcHRpb25zIGZpbGUuCi0gKi8KLXZvaWQgdHR5X3Byb2Nlc3NfZXh0cmFfb3B0aW9ucygpCi17Ci0JdXNpbmdfcHR5ID0gbm90dHkgfHwgcHR5Y29tbWFuZCAhPSBOVUxMIHx8IHB0eV9zb2NrZXQgIT0gTlVMTDsKLQlpZiAodXNpbmdfcHR5KQotCQlyZXR1cm47Ci0JaWYgKGRlZmF1bHRfZGV2aWNlKSB7Ci0JCWNoYXIgKnA7Ci0JCWlmICghaXNhdHR5KDApIHx8IChwID0gdHR5bmFtZSgwKSkgPT0gTlVMTCkgewotCQkJb3B0aW9uX2Vycm9yKCJubyBkZXZpY2Ugc3BlY2lmaWVkIGFuZCBzdGRpbiBpcyBub3QgYSB0dHkiKTsKLQkJCWV4aXQoRVhJVF9PUFRJT05fRVJST1IpOwotCQl9Ci0JCXN0cmxjcHkoZGV2bmFtLCBwLCBzaXplb2YoZGV2bmFtKSk7Ci0JCWlmIChzdGF0KGRldm5hbSwgJmRldnN0YXQpIDwgMCkKLQkJCWZhdGFsKCJDb3VsZG4ndCBzdGF0IGRlZmF1bHQgZGV2aWNlICVzOiAlbSIsIGRldm5hbSk7Ci0JfQotCi0KLQkvKgotCSAqIFBhcnNlIHRoZSB0dHkgb3B0aW9ucyBmaWxlLgotCSAqIFRoZSBwZXItdHR5IG9wdGlvbnMgZmlsZSBzaG91bGQgbm90IGNoYW5nZQotCSAqIHB0eWNvbW1hbmQsIHB0eV9zb2NrZXQsIG5vdHR5IG9yIGRldm5hbS4KLQkgKiBvcHRpb25zX2Zvcl90dHkgZG9lc24ndCBvdmVycmlkZSBvcHRpb25zIHNldCBvbiB0aGUgY29tbWFuZCBsaW5lLAotCSAqIGV4Y2VwdCBmb3Igc29tZSBwcml2aWxlZ2VkIG9wdGlvbnMuCi0JICovCi0JaWYgKCFvcHRpb25zX2Zvcl90dHkoKSkKLQkJZXhpdChFWElUX09QVElPTl9FUlJPUik7Ci19Ci0KLS8qCi0gKiB0dHlfY2hlY2tfb3B0aW9ucyAtIGRvIGNvbnNpc3RlbmN5IGNoZWNrcyBvbiB0aGUgb3B0aW9ucyB3ZSB3ZXJlIGdpdmVuLgotICovCi12b2lkCi10dHlfY2hlY2tfb3B0aW9ucygpCi17Ci0Jc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLQlpbnQgZmRmbGFnczsKLQotCWlmIChkZW1hbmQgJiYgbm90dHkpIHsKLQkJb3B0aW9uX2Vycm9yKCJkZW1hbmQtZGlhbGxpbmcgaXMgaW5jb21wYXRpYmxlIHdpdGggbm90dHkiKTsKLQkJZXhpdChFWElUX09QVElPTl9FUlJPUik7Ci0JfQotCWlmIChkZW1hbmQgJiYgY29ubmVjdF9zY3JpcHQgPT0gMCAmJiBwdHljb21tYW5kID09IE5VTEwKLQkgICAgJiYgcHR5X3NvY2tldCA9PSBOVUxMKSB7Ci0JCW9wdGlvbl9lcnJvcigiY29ubmVjdCBzY3JpcHQgaXMgcmVxdWlyZWQgZm9yIGRlbWFuZC1kaWFsbGluZ1xuIik7Ci0JCWV4aXQoRVhJVF9PUFRJT05fRVJST1IpOwotCX0KLQkvKiBkZWZhdWx0IGhvbGRvZmYgdG8gMCBpZiBubyBjb25uZWN0IHNjcmlwdCBoYXMgYmVlbiBnaXZlbiAqLwotCWlmIChjb25uZWN0X3NjcmlwdCA9PSAwICYmICFob2xkb2ZmX3NwZWNpZmllZCkKLQkJaG9sZG9mZiA9IDA7Ci0KLQlpZiAodXNpbmdfcHR5KSB7Ci0JCWlmICghZGVmYXVsdF9kZXZpY2UpIHsKLQkJCW9wdGlvbl9lcnJvcigiJXMgb3B0aW9uIHByZWNsdWRlcyBzcGVjaWZ5aW5nIGRldmljZSBuYW1lIiwKLQkJCQkgICAgIHB0eV9zb2NrZXQ/ICJzb2NrZXQiOiBub3R0eT8gIm5vdHR5IjogInB0eSIpOwotCQkJZXhpdChFWElUX09QVElPTl9FUlJPUik7Ci0JCX0KLQkJaWYgKHB0eWNvbW1hbmQgIT0gTlVMTCAmJiBub3R0eSkgewotCQkJb3B0aW9uX2Vycm9yKCJwdHkgb3B0aW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIG5vdHR5IG9wdGlvbiIpOwotCQkJZXhpdChFWElUX09QVElPTl9FUlJPUik7Ci0JCX0KLQkJaWYgKHB0eV9zb2NrZXQgIT0gTlVMTCAmJiAocHR5Y29tbWFuZCAhPSBOVUxMIHx8IG5vdHR5KSkgewotCQkJb3B0aW9uX2Vycm9yKCJzb2NrZXQgb3B0aW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIHB0eSBhbmQgbm90dHkiKTsKLQkJCWV4aXQoRVhJVF9PUFRJT05fRVJST1IpOwotCQl9Ci0JCWRlZmF1bHRfZGV2aWNlID0gbm90dHk7Ci0JCWxvY2tmbGFnID0gMDsKLQkJbW9kZW0gPSAwOwotCQlpZiAobm90dHkgJiYgbG9nX3RvX2ZkIDw9IDEpCi0JCQlsb2dfdG9fZmQgPSAtMTsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBJZiB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIGEgZGV2aWNlIHdoaWNoIGlzIHRoZSBzYW1lIGFzCi0JCSAqIHRoZSBvbmUgb24gc3RkaW4sIHByZXRlbmQgdGhleSBkaWRuJ3Qgc3BlY2lmeSBhbnkuCi0JCSAqIElmIHRoZSBkZXZpY2UgaXMgYWxyZWFkeSBvcGVuIHJlYWQvd3JpdGUgb24gc3RkaW4sCi0JCSAqIHdlIGFzc3VtZSB3ZSBkb24ndCBuZWVkIHRvIGxvY2sgaXQsIGFuZCB3ZSBjYW4gb3BlbiBpdAotCQkgKiBhcyByb290LgotCQkgKi8KLQkJaWYgKGZzdGF0KDAsICZzdGF0YnVmKSA+PSAwICYmIFNfSVNDSFIoc3RhdGJ1Zi5zdF9tb2RlKQotCQkgICAgJiYgc3RhdGJ1Zi5zdF9yZGV2ID09IGRldnN0YXQuc3RfcmRldikgewotCQkJZGVmYXVsdF9kZXZpY2UgPSAxOwotCQkJZmRmbGFncyA9IGZjbnRsKDAsIEZfR0VURkwpOwotCQkJaWYgKGZkZmxhZ3MgIT0gLTEgJiYgKGZkZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRXUikKLQkJCQlwcml2b3BlbiA9IDE7Ci0JCX0KLQl9Ci0JaWYgKGRlZmF1bHRfZGV2aWNlKQotCQlub2RldGFjaCA9IDE7Ci0KLQkvKgotCSAqIERvbid0IHNlbmQgbG9nIG1lc3NhZ2VzIHRvIHRoZSBzZXJpYWwgcG9ydCwgaXQgdGVuZHMgdG8KLQkgKiBjb25mdXNlIHRoZSBwZWVyLiA6LSkKLQkgKi8KLQlpZiAobG9nX3RvX2ZkID49IDAgJiYgZnN0YXQobG9nX3RvX2ZkLCAmc3RhdGJ1ZikgPj0gMAotCSAgICAmJiBTX0lTQ0hSKHN0YXRidWYuc3RfbW9kZSkgJiYgc3RhdGJ1Zi5zdF9yZGV2ID09IGRldnN0YXQuc3RfcmRldikKLQkJbG9nX3RvX2ZkID0gLTE7Ci19Ci0KLS8qCi0gKiBjb25uZWN0X3R0eSAtIGdldCB0aGUgc2VyaWFsIHBvcnQgcmVhZHkgdG8gc3RhcnQgZG9pbmcgUFBQLgotICogVGhhdCBpcywgb3BlbiB0aGUgc2VyaWFsIHBvcnQsIHNldCBpdHMgc3BlZWQgYW5kIG1vZGUsIGFuZCBydW4KLSAqIHRoZSBjb25uZWN0b3IgYW5kL29yIHdlbGNvbWVyLgotICovCi1pbnQgY29ubmVjdF90dHkoKQotewotCWNoYXIgKmNvbm5lY3RvcjsKLQlpbnQgZmRmbGFnczsKLSNpZm5kZWYgX19saW51eF9fCi0Jc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSNlbmRpZgotCWNoYXIgbnVtYnVmWzE2XTsKLQotCS8qCi0JICogR2V0IGEgcHR5IG1hc3Rlci9zbGF2ZSBwYWlyIGlmIHRoZSBwdHksIG5vdHR5LCBzb2NrZXQsCi0JICogb3IgcmVjb3JkIG9wdGlvbnMgd2VyZSBzcGVjaWZpZWQuCi0JICovCi0Jc3RybGNweShwcHBfZGV2bmFtLCBkZXZuYW0sIHNpemVvZihwcHBfZGV2bmFtKSk7Ci0JcHR5X21hc3RlciA9IC0xOwotCXB0eV9zbGF2ZSA9IC0xOwotCXJlYWxfdHR5ZmQgPSAtMTsKLQlpZiAodXNpbmdfcHR5IHx8IHJlY29yZF9maWxlICE9IE5VTEwpIHsKLQkJaWYgKCFnZXRfcHR5KCZwdHlfbWFzdGVyLCAmcHR5X3NsYXZlLCBwcHBfZGV2bmFtLCB1aWQpKSB7Ci0JCQllcnJvcigiQ291bGRuJ3QgYWxsb2NhdGUgcHNldWRvLXR0eSIpOwotCQkJc3RhdHVzID0gRVhJVF9GQVRBTF9FUlJPUjsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlzZXRfdXBfdHR5KHB0eV9zbGF2ZSwgMSk7Ci0JfQotCi0JLyoKLQkgKiBMb2NrIHRoZSBkZXZpY2UgaWYgd2UndmUgYmVlbiBhc2tlZCB0by4KLQkgKi8KLQlzdGF0dXMgPSBFWElUX0xPQ0tfRkFJTEVEOwotCWlmIChsb2NrZmxhZyAmJiAhcHJpdm9wZW4pIHsKLQkJaWYgKGxvY2soZGV2bmFtKSA8IDApCi0JCQlnb3RvIGVycnJldDsKLQkJbG9ja2VkID0gMTsKLQl9Ci0KLQkvKgotCSAqIE9wZW4gdGhlIHNlcmlhbCBkZXZpY2UgYW5kIHNldCBpdCB1cCB0byBiZSB0aGUgcHBwIGludGVyZmFjZS4KLQkgKiBGaXJzdCB3ZSBvcGVuIGl0IGluIG5vbi1ibG9ja2luZyBtb2RlIHNvIHdlIGNhbiBzZXQgdGhlCi0JICogdmFyaW91cyB0ZXJtaW9zIGZsYWdzIGFwcHJvcHJpYXRlbHkuICBJZiB3ZSBhcmVuJ3QgZGlhbGxpbmcKLQkgKiBvdXQgYW5kIHdlIHdhbnQgdG8gdXNlIHRoZSBtb2RlbSBsaW5lcywgd2UgcmVvcGVuIGl0IGxhdGVyCi0JICogaW4gb3JkZXIgdG8gd2FpdCBmb3IgdGhlIGNhcnJpZXIgZGV0ZWN0IHNpZ25hbCBmcm9tIHRoZSBtb2RlbS4KLQkgKi8KLQlnb3Rfc2lndGVybSA9IDA7Ci0JY29ubmVjdG9yID0gZG9pbmdfY2FsbGJhY2s/IGNhbGxiYWNrX3NjcmlwdDogY29ubmVjdF9zY3JpcHQ7Ci0JaWYgKGRldm5hbVswXSAhPSAwKSB7Ci0JCWZvciAoOzspIHsKLQkJCS8qIElmIHRoZSB1c2VyIHNwZWNpZmllZCB0aGUgZGV2aWNlIG5hbWUsIGJlY29tZSB0aGUKLQkJCSAgIHVzZXIgYmVmb3JlIG9wZW5pbmcgaXQuICovCi0JCQlpbnQgZXJyLCBwcmlvOwotCi0JCQlwcmlvID0gcHJpdm9wZW4/IE9QUklPX1JPT1Q6IHR0eV9vcHRpb25zWzBdLnByaW9yaXR5OwotCQkJaWYgKHByaW8gPCBPUFJJT19ST09UICYmIHNldGV1aWQodWlkKSA9PSAtMSkgewotCQkJCWVycm9yKCJVbmFibGUgdG8gZHJvcCBwcml2aWxlZ2VzIGJlZm9yZSBvcGVuaW5nICVzOiAlbVxuIiwKLQkJCQkgICAgICBkZXZuYW0pOwotCQkJCXN0YXR1cyA9IEVYSVRfT1BFTl9GQUlMRUQ7Ci0JCQkJZ290byBlcnJyZXQ7Ci0JCQl9Ci0JCQlyZWFsX3R0eWZkID0gb3BlbihkZXZuYW0sIE9fTk9OQkxPQ0sgfCBPX1JEV1IsIDApOwotCQkJZXJyID0gZXJybm87Ci0JCQlpZiAocHJpbyA8IE9QUklPX1JPT1QgJiYgc2V0ZXVpZCgwKSA9PSAtMSkKLQkJCQlmYXRhbCgiVW5hYmxlIHRvIHJlZ2FpbiBwcml2aWxlZ2VzIik7Ci0JCQlpZiAocmVhbF90dHlmZCA+PSAwKQotCQkJCWJyZWFrOwotCQkJZXJybm8gPSBlcnI7Ci0JCQlpZiAoZXJyICE9IEVJTlRSKSB7Ci0JCQkJZXJyb3IoIkZhaWxlZCB0byBvcGVuICVzOiAlbSIsIGRldm5hbSk7Ci0JCQkJc3RhdHVzID0gRVhJVF9PUEVOX0ZBSUxFRDsKLQkJCX0KLQkJCWlmICghcGVyc2lzdCB8fCBlcnIgIT0gRUlOVFIpCi0JCQkJZ290byBlcnJyZXQ7Ci0JCX0KLQkJdHR5ZmQgPSByZWFsX3R0eWZkOwotCQlpZiAoKGZkZmxhZ3MgPSBmY250bCh0dHlmZCwgRl9HRVRGTCkpID09IC0xCi0JCSAgICB8fCBmY250bCh0dHlmZCwgRl9TRVRGTCwgZmRmbGFncyAmIH5PX05PTkJMT0NLKSA8IDApCi0JCQl3YXJuKCJDb3VsZG4ndCByZXNldCBub24tYmxvY2tpbmcgbW9kZSBvbiBkZXZpY2U6ICVtIik7Ci0KLSNpZm5kZWYgX19saW51eF9fCi0JCS8qCi0JCSAqIExpbnV4IDIuNCBhbmQgYWJvdmUgYmxvY2tzIG5vcm1hbCB3cml0ZXMgdG8gdGhlIHR0eQotCQkgKiB3aGVuIGl0IGlzIGluIFBQUCBsaW5lIGRpc2NpcGxpbmUsIHNvIHRoaXMgaXNuJ3QgbmVlZGVkLgotCQkgKi8KLQkJLyoKLQkJICogRG8gdGhlIGVxdWl2YWxlbnQgb2YgYG1lc2cgbicgdG8gc3RvcCBicm9hZGNhc3QgbWVzc2FnZXMuCi0JCSAqLwotCQlpZiAoZnN0YXQodHR5ZmQsICZzdGF0YnVmKSA8IDAKLQkJICAgIHx8IGZjaG1vZCh0dHlmZCwgc3RhdGJ1Zi5zdF9tb2RlICYgfihTX0lXR1JQIHwgU19JV09USCkpIDwgMCkgewotCQkJd2FybigiQ291bGRuJ3QgcmVzdHJpY3Qgd3JpdGUgcGVybWlzc2lvbnMgdG8gJXM6ICVtIiwgZGV2bmFtKTsKLQkJfSBlbHNlCi0JCQl0dHlfbW9kZSA9IHN0YXRidWYuc3RfbW9kZTsKLSNlbmRpZiAvKiBfX2xpbnV4X18gKi8KLQotCQkvKgotCQkgKiBTZXQgbGluZSBzcGVlZCwgZmxvdyBjb250cm9sLCBldGMuCi0JCSAqIElmIHdlIGhhdmUgYSBub24tbnVsbCBjb25uZWN0aW9uIG9yIGluaXRpYWxpemVyIHNjcmlwdCwKLQkJICogb24gbW9zdCBzeXN0ZW1zIHdlIHNldCBDTE9DQUwgZm9yIG5vdyBzbyB0aGF0IHdlIGNhbiB0YWxrCi0JCSAqIHRvIHRoZSBtb2RlbSBiZWZvcmUgY2FycmllciBjb21lcyB1cC4gIEJ1dCB0aGlzIGhhcyB0aGUKLQkJICogc2lkZSBlZmZlY3QgdGhhdCB3ZSBtaWdodCBtaXNzIGl0IGlmIENEIGRyb3BzIGJlZm9yZSB3ZQotCQkgKiBnZXQgdG8gY2xlYXIgQ0xPQ0FMIGJlbG93LiAgT24gc3lzdGVtcyB3aGVyZSB3ZSBjYW4gdGFsawotCQkgKiBzdWNjZXNzZnVsbHkgdG8gdGhlIG1vZGVtIHdpdGggQ0xPQ0FMIGNsZWFyIGFuZCBDRCBkb3duLAotCQkgKiB3ZSBjb3VsZCBjbGVhciBDTE9DQUwgYXQgdGhpcyBwb2ludC4KLQkJICovCi0JCXNldF91cF90dHkodHR5ZmQsICgoY29ubmVjdG9yICE9IE5VTEwgJiYgY29ubmVjdG9yWzBdICE9IDApCi0JCQkJICAgfHwgaW5pdGlhbGl6ZXIgIT0gTlVMTCkpOwotCX0KLQotCS8qCi0JICogSWYgdGhlIHB0eSwgc29ja2V0LCBub3R0eSBhbmQvb3IgcmVjb3JkIG9wdGlvbiB3YXMgc3BlY2lmaWVkLAotCSAqIHN0YXJ0IHVwIHRoZSBjaGFyYWN0ZXIgc2h1bnQgbm93LgotCSAqLwotCXN0YXR1cyA9IEVYSVRfUFRZQ01EX0ZBSUxFRDsKLQlpZiAocHR5Y29tbWFuZCAhPSBOVUxMKSB7Ci0JCWlmIChyZWNvcmRfZmlsZSAhPSBOVUxMKSB7Ci0JCQlpbnQgaXBpcGVbMl0sIG9waXBlWzJdLCBvazsKLQotCQkJaWYgKHBpcGUoaXBpcGUpIDwgMCB8fCBwaXBlKG9waXBlKSA8IDApCi0JCQkJZmF0YWwoIkNvdWxkbid0IGNyZWF0ZSBwaXBlcyBmb3IgcmVjb3JkIG9wdGlvbjogJW0iKTsKLQotCQkJLyogZG9uJ3QgbGVhayB0aGVzZSB0byB0aGUgcHR5Y29tbWFuZCAqLwotCQkJKHZvaWQpIGZjbnRsKGlwaXBlWzBdLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKLQkJCSh2b2lkKSBmY250bChvcGlwZVsxXSwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7Ci0KLQkJCW9rID0gZGV2aWNlX3NjcmlwdChwdHljb21tYW5kLCBvcGlwZVswXSwgaXBpcGVbMV0sIDEpID09IDAKLQkJCQkmJiBzdGFydF9jaGFyc2h1bnQoaXBpcGVbMF0sIG9waXBlWzFdKTsKLQkJCWNsb3NlKGlwaXBlWzBdKTsKLQkJCWNsb3NlKGlwaXBlWzFdKTsKLQkJCWNsb3NlKG9waXBlWzBdKTsKLQkJCWNsb3NlKG9waXBlWzFdKTsKLQkJCWlmICghb2spCi0JCQkJZ290byBlcnJyZXQ7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZGV2aWNlX3NjcmlwdChwdHljb21tYW5kLCBwdHlfbWFzdGVyLCBwdHlfbWFzdGVyLCAxKSA8IDApCi0JCQkJZ290byBlcnJyZXQ7Ci0JCX0KLQl9IGVsc2UgaWYgKHB0eV9zb2NrZXQgIT0gTlVMTCkgewotCQlpbnQgZmQgPSBvcGVuX3NvY2tldChwdHlfc29ja2V0KTsKLQkJaWYgKGZkIDwgMCkKLQkJCWdvdG8gZXJycmV0OwotCQlpZiAoIXN0YXJ0X2NoYXJzaHVudChmZCwgZmQpKQotCQkJZ290byBlcnJyZXQ7Ci0JCWNsb3NlKGZkKTsKLQl9IGVsc2UgaWYgKG5vdHR5KSB7Ci0JCWlmICghc3RhcnRfY2hhcnNodW50KDAsIDEpKQotCQkJZ290byBlcnJyZXQ7Ci0JCWR1cDIoZmRfZGV2bnVsbCwgMCk7Ci0JCWR1cDIoZmRfZGV2bnVsbCwgMSk7Ci0JCWlmIChsb2dfdG9fZmQgPT0gMSkKLQkJCWxvZ190b19mZCA9IC0xOwotCQlpZiAobG9nX3RvX2ZkICE9IDIpCi0JCQlkdXAyKGZkX2Rldm51bGwsIDIpOwotCX0gZWxzZSBpZiAocmVjb3JkX2ZpbGUgIT0gTlVMTCkgewotCQlpbnQgZmQgPSBkdXAodHR5ZmQpOwotCQlpZiAoIXN0YXJ0X2NoYXJzaHVudChmZCwgZmQpKQotCQkJZ290byBlcnJyZXQ7Ci0JfQotCi0JaWYgKHVzaW5nX3B0eSB8fCByZWNvcmRfZmlsZSAhPSBOVUxMKSB7Ci0JCXR0eWZkID0gcHR5X3NsYXZlOwotCQljbG9zZShwdHlfbWFzdGVyKTsKLQkJcHR5X21hc3RlciA9IC0xOwotCX0KLQotCS8qIHJ1biBjb25uZWN0aW9uIHNjcmlwdCAqLwotCWlmICgoY29ubmVjdG9yICYmIGNvbm5lY3RvclswXSkgfHwgaW5pdGlhbGl6ZXIpIHsKLQkJaWYgKHJlYWxfdHR5ZmQgIT0gLTEpIHsKLQkJCS8qIFhYWCBkbyB0aGlzIGlmIGRvaW5nX2NhbGxiYWNrID09IENBTExCQUNLX0RJQUxJTj8gKi8KLQkJCWlmICghZGVmYXVsdF9kZXZpY2UgJiYgbW9kZW0pIHsKLQkJCQlzZXRkdHIocmVhbF90dHlmZCwgMCk7CS8qIGluIGNhc2UgbW9kZW0gaXMgb2ZmIGhvb2sgKi8KLQkJCQlzbGVlcCgxKTsKLQkJCQlzZXRkdHIocmVhbF90dHlmZCwgMSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaW5pdGlhbGl6ZXIgJiYgaW5pdGlhbGl6ZXJbMF0pIHsKLQkJCWlmIChkZXZpY2Vfc2NyaXB0KGluaXRpYWxpemVyLCB0dHlmZCwgdHR5ZmQsIDApIDwgMCkgewotCQkJCWVycm9yKCJJbml0aWFsaXplciBzY3JpcHQgZmFpbGVkIik7Ci0JCQkJc3RhdHVzID0gRVhJVF9JTklUX0ZBSUxFRDsKLQkJCQlnb3RvIGVycnJldGY7Ci0JCQl9Ci0JCQlpZiAoZ290X3NpZ3Rlcm0pIHsKLQkJCQlkaXNjb25uZWN0X3R0eSgpOwotCQkJCWdvdG8gZXJycmV0ZjsKLQkJCX0KLQkJCWluZm8oIlNlcmlhbCBwb3J0IGluaXRpYWxpemVkLiIpOwotCQl9Ci0KLQkJaWYgKGNvbm5lY3RvciAmJiBjb25uZWN0b3JbMF0pIHsKLQkJCWlmIChkZXZpY2Vfc2NyaXB0KGNvbm5lY3RvciwgdHR5ZmQsIHR0eWZkLCAwKSA8IDApIHsKLQkJCQllcnJvcigiQ29ubmVjdCBzY3JpcHQgZmFpbGVkIik7Ci0JCQkJc3RhdHVzID0gRVhJVF9DT05ORUNUX0ZBSUxFRDsKLQkJCQlnb3RvIGVycnJldGY7Ci0JCQl9Ci0JCQlpZiAoZ290X3NpZ3Rlcm0pIHsKLQkJCQlkaXNjb25uZWN0X3R0eSgpOwotCQkJCWdvdG8gZXJycmV0ZjsKLQkJCX0KLQkJCWluZm8oIlNlcmlhbCBjb25uZWN0aW9uIGVzdGFibGlzaGVkLiIpOwotCQl9Ci0KLQkJLyogc2V0IGxpbmUgc3BlZWQsIGZsb3cgY29udHJvbCwgZXRjLjsKLQkJICAgY2xlYXIgQ0xPQ0FMIGlmIG1vZGVtIG9wdGlvbiAqLwotCQlpZiAocmVhbF90dHlmZCAhPSAtMSkKLQkJCXNldF91cF90dHkocmVhbF90dHlmZCwgMCk7Ci0KLQkJaWYgKGRvaW5nX2NhbGxiYWNrID09IENBTExCQUNLX0RJQUxJTikKLQkJCWNvbm5lY3RvciA9IE5VTEw7Ci0JfQotCi0JLyogcmVvcGVuIHR0eSBpZiBuZWNlc3NhcnkgdG8gd2FpdCBmb3IgY2FycmllciAqLwotCWlmIChjb25uZWN0b3IgPT0gTlVMTCAmJiBtb2RlbSAmJiBkZXZuYW1bMF0gIT0gMCkgewotCQlpbnQgaTsKLQkJZm9yICg7OykgewotCQkJaWYgKChpID0gb3BlbihkZXZuYW0sIE9fUkRXUikpID49IDApCi0JCQkJYnJlYWs7Ci0JCQlpZiAoZXJybm8gIT0gRUlOVFIpIHsKLQkJCQllcnJvcigiRmFpbGVkIHRvIHJlb3BlbiAlczogJW0iLCBkZXZuYW0pOwotCQkJCXN0YXR1cyA9IEVYSVRfT1BFTl9GQUlMRUQ7Ci0JCQl9Ci0JCQlpZiAoIXBlcnNpc3QgfHwgZXJybm8gIT0gRUlOVFIgfHwgaHVuZ3VwIHx8IGdvdF9zaWd0ZXJtKQotCQkJCWdvdG8gZXJycmV0OwotCQl9Ci0JCWNsb3NlKGkpOwotCX0KLQotCXNscHJpbnRmKG51bWJ1Ziwgc2l6ZW9mKG51bWJ1ZiksICIlZCIsIGJhdWRfcmF0ZSk7Ci0Jc2NyaXB0X3NldGVudigiU1BFRUQiLCBudW1idWYsIDApOwotCi0JLyogcnVuIHdlbGNvbWUgc2NyaXB0LCBpZiBhbnkgKi8KLQlpZiAod2VsY29tZXIgJiYgd2VsY29tZXJbMF0pIHsKLQkJaWYgKGRldmljZV9zY3JpcHQod2VsY29tZXIsIHR0eWZkLCB0dHlmZCwgMCkgPCAwKQotCQkJd2FybigiV2VsY29tZSBzY3JpcHQgZmFpbGVkIik7Ci0JfQotCi0JLyoKLQkgKiBJZiB3ZSBhcmUgaW5pdGlhdGluZyB0aGlzIGNvbm5lY3Rpb24sIHdhaXQgZm9yIGEgc2hvcnQKLQkgKiB0aW1lIGZvciBzb21ldGhpbmcgZnJvbSB0aGUgcGVlci4gIFRoaXMgY2FuIGF2b2lkIGJvdW5jaW5nCi0JICogb3VyIHBhY2tldHMgb2ZmIGhpcyB0dHkgYmVmb3JlIGhlIGhhcyBpdCBzZXQgdXAuCi0JICovCi0JaWYgKGNvbm5lY3RvciAhPSBOVUxMIHx8IHB0eWNvbW1hbmQgIT0gTlVMTCB8fCBwdHlfc29ja2V0ICE9IE5VTEwpCi0JCWxpc3Rlbl90aW1lID0gY29ubmVjdF9kZWxheTsKLQotCXJldHVybiB0dHlmZDsKLQotIGVycnJldGY6Ci0JaWYgKHJlYWxfdHR5ZmQgPj0gMCkKLQkJdGNmbHVzaChyZWFsX3R0eWZkLCBUQ0lPRkxVU0gpOwotIGVycnJldDoKLQlpZiAocHR5X21hc3RlciA+PSAwKSB7Ci0JCWNsb3NlKHB0eV9tYXN0ZXIpOwotCQlwdHlfbWFzdGVyID0gLTE7Ci0JfQotCXR0eWZkID0gLTE7Ci0JaWYgKGdvdF9zaWd0ZXJtKQotCQlhc2tlZF90b19xdWl0ID0gMTsKLQlyZXR1cm4gLTE7Ci19Ci0KLQotdm9pZCBkaXNjb25uZWN0X3R0eSgpCi17Ci0JaWYgKGRpc2Nvbm5lY3Rfc2NyaXB0ID09IE5VTEwgfHwgaHVuZ3VwKQotCQlyZXR1cm47Ci0JaWYgKHJlYWxfdHR5ZmQgPj0gMCkKLQkJc2V0X3VwX3R0eShyZWFsX3R0eWZkLCAxKTsKLQlpZiAoZGV2aWNlX3NjcmlwdChkaXNjb25uZWN0X3NjcmlwdCwgdHR5ZmQsIHR0eWZkLCAwKSA8IDApIHsKLQkJd2FybigiZGlzY29ubmVjdCBzY3JpcHQgZmFpbGVkIik7Ci0JfSBlbHNlIHsKLQkJaW5mbygiU2VyaWFsIGxpbmsgZGlzY29ubmVjdGVkLiIpOwotCX0KLQlzdG9wX2NoYXJzaHVudChOVUxMLCAwKTsKLX0KLQotdm9pZCB0dHlfY2xvc2VfZmRzKCkKLXsKLQlpZiAocHR5X3NsYXZlID49IDApCi0JCWNsb3NlKHB0eV9zbGF2ZSk7Ci0JaWYgKHJlYWxfdHR5ZmQgPj0gMCkgewotCQljbG9zZShyZWFsX3R0eWZkKTsKLQkJcmVhbF90dHlmZCA9IC0xOwotCX0KLQkvKiBOLkIuIHR0eWZkIHdpbGwgPT0gZWl0aGVyIHB0eV9zbGF2ZSBvciByZWFsX3R0eWZkICovCi19Ci0KLXZvaWQgY2xlYW51cF90dHkoKQotewotCWlmIChyZWFsX3R0eWZkID49IDApCi0JCWZpbmlzaF90dHkoKTsKLQl0dHlfY2xvc2VfZmRzKCk7Ci0JaWYgKGxvY2tlZCkgewotCQl1bmxvY2soKTsKLQkJbG9ja2VkID0gMDsKLQl9Ci19Ci0KLS8qCi0gKiB0dHlfZG9fc2VuZF9jb25maWcgLSBzZXQgdHJhbnNtaXQtc2lkZSBQUFAgY29uZmlndXJhdGlvbi4KLSAqIFdlIHNldCB0aGUgZXh0ZW5kZWQgdHJhbnNtaXQgQUNDTSBoZXJlIGFzIHdlbGwuCi0gKi8KLXZvaWQKLXR0eV9kb19zZW5kX2NvbmZpZyhtdHUsIGFjY20sIHBjb21wLCBhY2NvbXApCi0gICAgaW50IG10dTsKLSAgICB1X2ludDMyX3QgYWNjbTsKLSAgICBpbnQgcGNvbXAsIGFjY29tcDsKLXsKLQl0dHlfc2V0X3hhY2NtKHhtaXRfYWNjbSk7Ci0JdHR5X3NlbmRfY29uZmlnKG10dSwgYWNjbSwgcGNvbXAsIGFjY29tcCk7Ci19Ci0KLS8qCi0gKiBmaW5pc2hfdHR5IC0gcmVzdG9yZSB0aGUgdGVybWluYWwgZGV2aWNlIHRvIGl0cyBvcmlnaW5hbCBzZXR0aW5ncwotICovCi1zdGF0aWMgdm9pZAotZmluaXNoX3R0eSgpCi17Ci0JLyogZHJvcCBkdHIgdG8gaGFuZyB1cCAqLwotCWlmICghZGVmYXVsdF9kZXZpY2UgJiYgbW9kZW0pIHsKLQkJc2V0ZHRyKHJlYWxfdHR5ZmQsIDApOwotCQkvKgotCQkgKiBUaGlzIHNsZWVwIGlzIGluIGNhc2UgdGhlIHNlcmlhbCBwb3J0IGhhcyBDTE9DQUwgc2V0IGJ5IGRlZmF1bHQsCi0JCSAqIGFuZCBjb25zZXF1ZW50bHkgd2lsbCByZWFzc2VydCBEVFIgd2hlbiB3ZSBjbG9zZSB0aGUgZGV2aWNlLgotCQkgKi8KLQkJc2xlZXAoMSk7Ci0JfQotCi0JcmVzdG9yZV90dHkocmVhbF90dHlmZCk7Ci0KLSNpZm5kZWYgX19saW51eF9fCi0JaWYgKHR0eV9tb2RlICE9IChtb2RlX3QpIC0xKSB7Ci0JCWlmIChmY2htb2QocmVhbF90dHlmZCwgdHR5X21vZGUpICE9IDApCi0JCQllcnJvcigiQ291bGRuJ3QgcmVzdG9yZSB0dHkgcGVybWlzc2lvbnMiKTsKLQl9Ci0jZW5kaWYgLyogX19saW51eF9fICovCi0KLQljbG9zZShyZWFsX3R0eWZkKTsKLQlyZWFsX3R0eWZkID0gLTE7Ci19Ci0KLS8qCi0gKiBtYXliZV9yZWxvY2sgLSBvdXIgUElEIGhhcyBjaGFuZ2VkLCBtYXliZSB1cGRhdGUgdGhlIGxvY2sgZmlsZS4KLSAqLwotc3RhdGljIHZvaWQKLW1heWJlX3JlbG9jayhhcmcsIHBpZCkKLSAgICB2b2lkICphcmc7Ci0gICAgaW50IHBpZDsKLXsKLSAgICBpZiAobG9ja2VkKQotCXJlbG9jayhwaWQpOwotfQotCi0vKgotICogb3Blbl9zb2NrZXQgLSBlc3RhYmxpc2ggYSBzdHJlYW0gc29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIG5vbWluYXRlZAotICogaG9zdCBhbmQgcG9ydC4KLSAqLwotc3RhdGljIGludAotb3Blbl9zb2NrZXQoZGVzdCkKLSAgICBjaGFyICpkZXN0OwotewotICAgIGNoYXIgKnNlcCwgKmVuZHAgPSBOVUxMOwotICAgIGludCBzb2NrLCBwb3J0ID0gLTE7Ci0gICAgdV9pbnQzMl90IGhvc3Q7Ci0gICAgc3RydWN0IGhvc3RlbnQgKmhlbnQ7Ci0gICAgc3RydWN0IHNvY2thZGRyX2luIHNhZDsKLQotICAgIC8qIHBhcnNlIGhvc3Q6cG9ydCBhbmQgcmVzb2x2ZSBob3N0IHRvIGFuIElQIGFkZHJlc3MgKi8KLSAgICBzZXAgPSBzdHJjaHIoZGVzdCwgJzonKTsKLSAgICBpZiAoc2VwICE9IE5VTEwpCi0JcG9ydCA9IHN0cnRvbChzZXArMSwgJmVuZHAsIDEwKTsKLSAgICBpZiAocG9ydCA8IDAgfHwgZW5kcCA9PSBzZXArMSB8fCBzZXAgPT0gZGVzdCkgewotCWVycm9yKCJDYW4ndCBwYXJzZSBob3N0OnBvcnQgZm9yIHNvY2tldCBkZXN0aW5hdGlvbiIpOwotCXJldHVybiAtMTsKLSAgICB9Ci0gICAgKnNlcCA9IDA7Ci0gICAgaG9zdCA9IGluZXRfYWRkcihkZXN0KTsKLSAgICBpZiAoaG9zdCA9PSAodV9pbnQzMl90KSAtMSkgewotCWhlbnQgPSBnZXRob3N0YnluYW1lKGRlc3QpOwotCWlmIChoZW50ID09IE5VTEwpIHsKLQkgICAgZXJyb3IoIiVzOiB1bmtub3duIGhvc3QgaW4gc29ja2V0IG9wdGlvbiIsIGRlc3QpOwotCSAgICAqc2VwID0gJzonOwotCSAgICByZXR1cm4gLTE7Ci0JfQotCWhvc3QgPSAqKHVfaW50MzJfdCAqKShoZW50LT5oX2FkZHJfbGlzdFswXSk7Ci0gICAgfQotICAgICpzZXAgPSAnOic7Ci0KLSAgICAvKiBnZXQgYSBzb2NrZXQgYW5kIGNvbm5lY3QgaXQgdG8gdGhlIG90aGVyIGVuZCAqLwotICAgIHNvY2sgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19TVFJFQU0sIDApOwotICAgIGlmIChzb2NrIDwgMCkgewotCWVycm9yKCJDYW4ndCBjcmVhdGUgc29ja2V0OiAlbSIpOwotCXJldHVybiAtMTsKLSAgICB9Ci0gICAgbWVtc2V0KCZzYWQsIDAsIHNpemVvZihzYWQpKTsKLSAgICBzYWQuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgc2FkLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0gICAgc2FkLnNpbl9hZGRyLnNfYWRkciA9IGhvc3Q7Ci0gICAgaWYgKGNvbm5lY3Qoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzYWQsIHNpemVvZihzYWQpKSA8IDApIHsKLQllcnJvcigiQ2FuJ3QgY29ubmVjdCB0byAlczogJW0iLCBkZXN0KTsKLQljbG9zZShzb2NrKTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNvY2s7Ci19Ci0KLQotLyoKLSAqIHN0YXJ0X2NoYXJzaHVudCAtIGNyZWF0ZSBhIGNoaWxkIHByb2Nlc3MgdG8gcnVuIHRoZSBjaGFyYWN0ZXIgc2h1bnQuCi0gKi8KLXN0YXRpYyBpbnQKLXN0YXJ0X2NoYXJzaHVudChpZmQsIG9mZCkKLSAgICBpbnQgaWZkLCBvZmQ7Ci17Ci0gICAgaW50IGNwaWQ7Ci0KLSAgICBjcGlkID0gc2FmZV9mb3JrKGlmZCwgb2ZkLCAobG9nX3RvX2ZkID49IDA/IGxvZ190b19mZDogMikpOwotICAgIGlmIChjcGlkID09IC0xKSB7Ci0JZXJyb3IoIkNhbid0IGZvcmsgcHJvY2VzcyBmb3IgY2hhcmFjdGVyIHNodW50OiAlbSIpOwotCXJldHVybiAwOwotICAgIH0KLSAgICBpZiAoY3BpZCA9PSAwKSB7Ci0JLyogY2hpbGQgKi8KLQlyZW9wZW5fbG9nKCk7Ci0JaWYgKCFub2RldGFjaCkKLQkgICAgbG9nX3RvX2ZkID0gLTE7Ci0JZWxzZSBpZiAobG9nX3RvX2ZkID49IDApCi0JICAgIGxvZ190b19mZCA9IDI7Ci0Jc2V0Z2lkKGdldGdpZCgpKTsKLQlzZXR1aWQodWlkKTsKLQlpZiAoZ2V0dWlkKCkgIT0gdWlkKQotCSAgICBmYXRhbCgic2V0dWlkIGZhaWxlZCIpOwotCWNoYXJzaHVudCgwLCAxLCByZWNvcmRfZmlsZSk7Ci0JZXhpdCgwKTsKLSAgICB9Ci0gICAgY2hhcnNodW50X3BpZCA9IGNwaWQ7Ci0gICAgcmVjb3JkX2NoaWxkKGNwaWQsICJwcHBkIChjaGFyc2h1bnQpIiwgY2hhcnNodW50X2RvbmUsIE5VTEwsIDEpOwotICAgIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotY2hhcnNodW50X2RvbmUoYXJnKQotICAgIHZvaWQgKmFyZzsKLXsKLQljaGFyc2h1bnRfcGlkID0gMDsKLX0KLQotc3RhdGljIHZvaWQKLXN0b3BfY2hhcnNodW50KGFyZywgc2lnKQotICAgIHZvaWQgKmFyZzsKLSAgICBpbnQgc2lnOwotewotCWlmIChjaGFyc2h1bnRfcGlkKQotCQlraWxsKGNoYXJzaHVudF9waWQsIChzaWcgPT0gU0lHSU5UPyBzaWc6IFNJR1RFUk0pKTsKLX0KLQotLyoKLSAqIGNoYXJzaHVudCAtIHRoZSBjaGFyYWN0ZXIgc2h1bnQsIHdoaWNoIHBhc3NlcyBjaGFyYWN0ZXJzIGJldHdlZW4KLSAqIHRoZSBwdHkgbWFzdGVyIHNpZGUgYW5kIHRoZSBzZXJpYWwgcG9ydCAob3Igc3RkaW4vc3Rkb3V0KS4KLSAqIFRoaXMgcnVucyBhcyB0aGUgdXNlciAobm90IGFzIHJvb3QpLgotICogKFdlIGFzc3VtZSBvZmQgPj0gaWZkIHdoaWNoIGlzIHRydWUgdGhlIHdheSB0aGlzIGdldHMgY2FsbGVkLiA6LSkuCi0gKi8KLXN0YXRpYyB2b2lkCi1jaGFyc2h1bnQoaWZkLCBvZmQsIHJlY29yZF9maWxlKQotICAgIGludCBpZmQsIG9mZDsKLSAgICBjaGFyICpyZWNvcmRfZmlsZTsKLXsKLSAgICBpbnQgbiwgbmZkczsKLSAgICBmZF9zZXQgcmVhZHksIHdyaXRleTsKLSAgICB1X2NoYXIgKmlidWZwLCAqb2J1ZnA7Ci0gICAgaW50IG5pYnVmLCBub2J1ZjsKLSAgICBpbnQgZmxhZ3M7Ci0gICAgaW50IHB0eV9yZWFkYWJsZSwgc3RkaW5fcmVhZGFibGU7Ci0gICAgc3RydWN0IHRpbWV2YWwgbGFzdHRpbWU7Ci0gICAgRklMRSAqcmVjb3JkZiA9IE5VTEw7Ci0gICAgaW50IGlsZXZlbCwgb2xldmVsLCBtYXhfbGV2ZWw7Ci0gICAgc3RydWN0IHRpbWV2YWwgbGV2ZWx0LCB0b3V0LCAqdG9wOwotICAgIGV4dGVybiB1X2NoYXIgaW5wYWNrZXRfYnVmW107Ci0KLSAgICAvKgotICAgICAqIFJlc2V0IHNpZ25hbCBoYW5kbGVycy4KLSAgICAgKi8KLSAgICBzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsJCS8qIEhhbmd1cCAqLwotICAgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOwkJLyogSW50ZXJydXB0ICovCi0gICAgc2lnbmFsKFNJR1RFUk0sIFNJR19ERkwpOwkJLyogVGVybWluYXRlICovCi0gICAgc2lnbmFsKFNJR0NITEQsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdVU1IxLCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHVVNSMiwgU0lHX0RGTCk7Ci0gICAgc2lnbmFsKFNJR0FCUlQsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdBTFJNLCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHRlBFLCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHSUxMLCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHUElQRSwgU0lHX0RGTCk7Ci0gICAgc2lnbmFsKFNJR1FVSVQsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdTRUdWLCBTSUdfREZMKTsKLSNpZmRlZiBTSUdCVVMKLSAgICBzaWduYWwoU0lHQlVTLCBTSUdfREZMKTsKLSNlbmRpZgotI2lmZGVmIFNJR0VNVAotICAgIHNpZ25hbChTSUdFTVQsIFNJR19ERkwpOwotI2VuZGlmCi0jaWZkZWYgU0lHUE9MTAotICAgIHNpZ25hbChTSUdQT0xMLCBTSUdfREZMKTsKLSNlbmRpZgotI2lmZGVmIFNJR1BST0YKLSAgICBzaWduYWwoU0lHUFJPRiwgU0lHX0RGTCk7Ci0jZW5kaWYKLSNpZmRlZiBTSUdTWVMKLSAgICBzaWduYWwoU0lHU1lTLCBTSUdfREZMKTsKLSNlbmRpZgotI2lmZGVmIFNJR1RSQVAKLSAgICBzaWduYWwoU0lHVFJBUCwgU0lHX0RGTCk7Ci0jZW5kaWYKLSNpZmRlZiBTSUdWVEFMUk0KLSAgICBzaWduYWwoU0lHVlRBTFJNLCBTSUdfREZMKTsKLSNlbmRpZgotI2lmZGVmIFNJR1hDUFUKLSAgICBzaWduYWwoU0lHWENQVSwgU0lHX0RGTCk7Ci0jZW5kaWYKLSNpZmRlZiBTSUdYRlNaCi0gICAgc2lnbmFsKFNJR1hGU1osIFNJR19ERkwpOwotI2VuZGlmCi0KLSAgICAvKgotICAgICAqIENoZWNrIHRoYXQgdGhlIGZkcyB3b24ndCBvdmVycnVuIHRoZSBmZF9zZXRzCi0gICAgICovCi0gICAgaWYgKGlmZCA+PSBGRF9TRVRTSVpFIHx8IG9mZCA+PSBGRF9TRVRTSVpFIHx8IHB0eV9tYXN0ZXIgPj0gRkRfU0VUU0laRSkKLQlmYXRhbCgiaW50ZXJuYWwgZXJyb3I6IGZpbGUgZGVzY3JpcHRvciB0b28gbGFyZ2UgKCVkLCAlZCwgJWQpIiwKLQkgICAgICBpZmQsIG9mZCwgcHR5X21hc3Rlcik7Ci0KLSAgICAvKgotICAgICAqIE9wZW4gdGhlIHJlY29yZCBmaWxlIGlmIHJlcXVpcmVkLgotICAgICAqLwotICAgIGlmIChyZWNvcmRfZmlsZSAhPSBOVUxMKSB7Ci0JcmVjb3JkZiA9IGZvcGVuKHJlY29yZF9maWxlLCAiYSIpOwotCWlmIChyZWNvcmRmID09IE5VTEwpCi0JICAgIGVycm9yKCJDb3VsZG4ndCBjcmVhdGUgcmVjb3JkIGZpbGUgJXM6ICVtIiwgcmVjb3JkX2ZpbGUpOwotICAgIH0KLQotICAgIC8qIHNldCBhbGwgdGhlIGZkcyB0byBub24tYmxvY2tpbmcgbW9kZSAqLwotICAgIGZsYWdzID0gZmNudGwocHR5X21hc3RlciwgRl9HRVRGTCk7Ci0gICAgaWYgKGZsYWdzID09IC0xCi0JfHwgZmNudGwocHR5X21hc3RlciwgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKSA9PSAtMSkKLQl3YXJuKCJjb3VsZG4ndCBzZXQgcHR5IG1hc3RlciB0byBub25ibG9jazogJW0iKTsKLSAgICBmbGFncyA9IGZjbnRsKGlmZCwgRl9HRVRGTCk7Ci0gICAgaWYgKGZsYWdzID09IC0xCi0JfHwgZmNudGwoaWZkLCBGX1NFVEZMLCBmbGFncyB8IE9fTk9OQkxPQ0spID09IC0xKQotCXdhcm4oImNvdWxkbid0IHNldCAlcyB0byBub25ibG9jazogJW0iLCAoaWZkPT0wPyAic3RkaW4iOiAidHR5IikpOwotICAgIGlmIChvZmQgIT0gaWZkKSB7Ci0JZmxhZ3MgPSBmY250bChvZmQsIEZfR0VURkwpOwotCWlmIChmbGFncyA9PSAtMQotCSAgICB8fCBmY250bChvZmQsIEZfU0VURkwsIGZsYWdzIHwgT19OT05CTE9DSykgPT0gLTEpCi0JICAgIHdhcm4oImNvdWxkbid0IHNldCBzdGRvdXQgdG8gbm9uYmxvY2s6ICVtIik7Ci0gICAgfQotCi0gICAgbmlidWYgPSBub2J1ZiA9IDA7Ci0gICAgaWJ1ZnAgPSBvYnVmcCA9IE5VTEw7Ci0gICAgcHR5X3JlYWRhYmxlID0gc3RkaW5fcmVhZGFibGUgPSAxOwotCi0gICAgaWxldmVsID0gb2xldmVsID0gMDsKLSAgICBnZXR0aW1lb2ZkYXkoJmxldmVsdCwgTlVMTCk7Ci0gICAgaWYgKG1heF9kYXRhX3JhdGUpIHsKLQltYXhfbGV2ZWwgPSBtYXhfZGF0YV9yYXRlIC8gMTA7Ci0JaWYgKG1heF9sZXZlbCA8IDEwMCkKLQkgICAgbWF4X2xldmVsID0gMTAwOwotICAgIH0gZWxzZQotCW1heF9sZXZlbCA9IFBQUF9NUlUgKyBQUFBfSERSTEVOICsgMTsKLQotICAgIG5mZHMgPSAob2ZkID4gcHR5X21hc3Rlcj8gb2ZkOiBwdHlfbWFzdGVyKSArIDE7Ci0gICAgaWYgKHJlY29yZGYgIT0gTlVMTCkgewotCWdldHRpbWVvZmRheSgmbGFzdHRpbWUsIE5VTEwpOwotCXB1dGMoNywgcmVjb3JkZik7CS8qIHB1dCBzdGFydCBtYXJrZXIgKi8KLQlwdXRjKGxhc3R0aW1lLnR2X3NlYyA+PiAyNCwgcmVjb3JkZik7Ci0JcHV0YyhsYXN0dGltZS50dl9zZWMgPj4gMTYsIHJlY29yZGYpOwotCXB1dGMobGFzdHRpbWUudHZfc2VjID4+IDgsIHJlY29yZGYpOwotCXB1dGMobGFzdHRpbWUudHZfc2VjLCByZWNvcmRmKTsKLQlsYXN0dGltZS50dl91c2VjID0gMDsKLSAgICB9Ci0KLSAgICB3aGlsZSAobmlidWYgIT0gMCB8fCBub2J1ZiAhPSAwIHx8IHB0eV9yZWFkYWJsZSB8fCBzdGRpbl9yZWFkYWJsZSkgewotCXRvcCA9IDA7Ci0JdG91dC50dl9zZWMgPSAwOwotCXRvdXQudHZfdXNlYyA9IDEwMDAwOwotCUZEX1pFUk8oJnJlYWR5KTsKLQlGRF9aRVJPKCZ3cml0ZXkpOwotCWlmIChuaWJ1ZiAhPSAwKSB7Ci0JICAgIGlmIChpbGV2ZWwgPj0gbWF4X2xldmVsKQotCQl0b3AgPSAmdG91dDsKLQkgICAgZWxzZQotCQlGRF9TRVQocHR5X21hc3RlciwgJndyaXRleSk7Ci0JfSBlbHNlIGlmIChzdGRpbl9yZWFkYWJsZSkKLQkgICAgRkRfU0VUKGlmZCwgJnJlYWR5KTsKLQlpZiAobm9idWYgIT0gMCkgewotCSAgICBpZiAob2xldmVsID49IG1heF9sZXZlbCkKLQkJdG9wID0gJnRvdXQ7Ci0JICAgIGVsc2UKLQkJRkRfU0VUKG9mZCwgJndyaXRleSk7Ci0JfSBlbHNlIGlmIChwdHlfcmVhZGFibGUpCi0JICAgIEZEX1NFVChwdHlfbWFzdGVyLCAmcmVhZHkpOwotCWlmIChzZWxlY3QobmZkcywgJnJlYWR5LCAmd3JpdGV5LCBOVUxMLCB0b3ApIDwgMCkgewotCSAgICBpZiAoZXJybm8gIT0gRUlOVFIpCi0JCWZhdGFsKCJzZWxlY3QiKTsKLQkgICAgY29udGludWU7Ci0JfQotCWlmIChtYXhfZGF0YV9yYXRlKSB7Ci0JICAgIGRvdWJsZSBkdDsKLQkgICAgaW50IG5idDsKLQkgICAgc3RydWN0IHRpbWV2YWwgbm93OwotCi0JICAgIGdldHRpbWVvZmRheSgmbm93LCBOVUxMKTsKLQkgICAgZHQgPSAobm93LnR2X3NlYyAtIGxldmVsdC50dl9zZWMKLQkJICArIChub3cudHZfdXNlYyAtIGxldmVsdC50dl91c2VjKSAvIDFlNik7Ci0JICAgIG5idCA9IChpbnQpKGR0ICogbWF4X2RhdGFfcmF0ZSk7Ci0JICAgIGlsZXZlbCA9IChuYnQgPCAwIHx8IG5idCA+IGlsZXZlbCk/IDA6IGlsZXZlbCAtIG5idDsKLQkgICAgb2xldmVsID0gKG5idCA8IDAgfHwgbmJ0ID4gb2xldmVsKT8gMDogb2xldmVsIC0gbmJ0OwotCSAgICBsZXZlbHQgPSBub3c7Ci0JfSBlbHNlCi0JICAgIGlsZXZlbCA9IG9sZXZlbCA9IDA7Ci0JaWYgKEZEX0lTU0VUKGlmZCwgJnJlYWR5KSkgewotCSAgICBpYnVmcCA9IGlucGFja2V0X2J1ZjsKLQkgICAgbmlidWYgPSByZWFkKGlmZCwgaWJ1ZnAsIFBQUF9NUlUgKyBQUFBfSERSTEVOKTsKLQkgICAgaWYgKG5pYnVmIDwgMCAmJiBlcnJubyA9PSBFSU8pCi0JCW5pYnVmID0gMDsKLQkgICAgaWYgKG5pYnVmIDwgMCkgewotCQlpZiAoIShlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFQUdBSU4pKSB7Ci0JCSAgICBlcnJvcigiRXJyb3IgcmVhZGluZyBzdGFuZGFyZCBpbnB1dDogJW0iKTsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCW5pYnVmID0gMDsKLQkgICAgfSBlbHNlIGlmIChuaWJ1ZiA9PSAwKSB7Ci0JCS8qIGVuZCBvZiBmaWxlIGZyb20gc3RkaW4gKi8KLQkJc3RkaW5fcmVhZGFibGUgPSAwOwotCQlpZiAocmVjb3JkZikKLQkJICAgIGlmICghcmVjb3JkX3dyaXRlKHJlY29yZGYsIDQsIE5VTEwsIDAsICZsYXN0dGltZSkpCi0JCQlyZWNvcmRmID0gTlVMTDsKLQkgICAgfSBlbHNlIHsKLQkJRkRfU0VUKHB0eV9tYXN0ZXIsICZ3cml0ZXkpOwotCQlpZiAocmVjb3JkZikKLQkJICAgIGlmICghcmVjb3JkX3dyaXRlKHJlY29yZGYsIDIsIGlidWZwLCBuaWJ1ZiwgJmxhc3R0aW1lKSkKLQkJCXJlY29yZGYgPSBOVUxMOwotCSAgICB9Ci0JfQotCWlmIChGRF9JU1NFVChwdHlfbWFzdGVyLCAmcmVhZHkpKSB7Ci0JICAgIG9idWZwID0gb3V0cGFja2V0X2J1ZjsKLQkgICAgbm9idWYgPSByZWFkKHB0eV9tYXN0ZXIsIG9idWZwLCBQUFBfTVJVICsgUFBQX0hEUkxFTik7Ci0JICAgIGlmIChub2J1ZiA8IDAgJiYgZXJybm8gPT0gRUlPKQotCQlub2J1ZiA9IDA7Ci0JICAgIGlmIChub2J1ZiA8IDApIHsKLQkJaWYgKCEoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOKSkgewotCQkgICAgZXJyb3IoIkVycm9yIHJlYWRpbmcgcHNldWRvLXR0eSBtYXN0ZXI6ICVtIik7Ci0JCSAgICBicmVhazsKLQkJfQotCQlub2J1ZiA9IDA7Ci0JICAgIH0gZWxzZSBpZiAobm9idWYgPT0gMCkgewotCQkvKiBlbmQgb2YgZmlsZSBmcm9tIHRoZSBwdHkgLSBzbGF2ZSBzaWRlIGhhcyBjbG9zZWQgKi8KLQkJcHR5X3JlYWRhYmxlID0gMDsKLQkJc3RkaW5fcmVhZGFibGUgPSAwOwkvKiBwdHkgaXMgbm90IHdyaXRhYmxlIG5vdyAqLwotCQluaWJ1ZiA9IDA7Ci0JCWNsb3NlKG9mZCk7Ci0JCWlmIChyZWNvcmRmKQotCQkgICAgaWYgKCFyZWNvcmRfd3JpdGUocmVjb3JkZiwgMywgTlVMTCwgMCwgJmxhc3R0aW1lKSkKLQkJCXJlY29yZGYgPSBOVUxMOwotCSAgICB9IGVsc2UgewotCQlGRF9TRVQob2ZkLCAmd3JpdGV5KTsKLQkJaWYgKHJlY29yZGYpCi0JCSAgICBpZiAoIXJlY29yZF93cml0ZShyZWNvcmRmLCAxLCBvYnVmcCwgbm9idWYsICZsYXN0dGltZSkpCi0JCQlyZWNvcmRmID0gTlVMTDsKLQkgICAgfQotCX0gZWxzZSBpZiAoIXN0ZGluX3JlYWRhYmxlKQotCSAgICBwdHlfcmVhZGFibGUgPSAwOwotCWlmIChGRF9JU1NFVChvZmQsICZ3cml0ZXkpKSB7Ci0JICAgIG4gPSBub2J1ZjsKLQkgICAgaWYgKG9sZXZlbCArIG4gPiBtYXhfbGV2ZWwpCi0JCW4gPSBtYXhfbGV2ZWwgLSBvbGV2ZWw7Ci0JICAgIG4gPSB3cml0ZShvZmQsIG9idWZwLCBuKTsKLQkgICAgaWYgKG4gPCAwKSB7Ci0JCWlmIChlcnJubyA9PSBFSU8pIHsKLQkJICAgIHB0eV9yZWFkYWJsZSA9IDA7Ci0JCSAgICBub2J1ZiA9IDA7Ci0JCX0gZWxzZSBpZiAoZXJybm8gIT0gRUFHQUlOICYmIGVycm5vICE9IEVJTlRSKSB7Ci0JCSAgICBlcnJvcigiRXJyb3Igd3JpdGluZyBzdGFuZGFyZCBvdXRwdXQ6ICVtIik7Ci0JCSAgICBicmVhazsKLQkJfQotCSAgICB9IGVsc2UgewotCQlvYnVmcCArPSBuOwotCQlub2J1ZiAtPSBuOwotCQlvbGV2ZWwgKz0gbjsKLQkgICAgfQotCX0KLQlpZiAoRkRfSVNTRVQocHR5X21hc3RlciwgJndyaXRleSkpIHsKLQkgICAgbiA9IG5pYnVmOwotCSAgICBpZiAoaWxldmVsICsgbiA+IG1heF9sZXZlbCkKLQkJbiA9IG1heF9sZXZlbCAtIGlsZXZlbDsKLQkgICAgbiA9IHdyaXRlKHB0eV9tYXN0ZXIsIGlidWZwLCBuKTsKLQkgICAgaWYgKG4gPCAwKSB7Ci0JCWlmIChlcnJubyA9PSBFSU8pIHsKLQkJICAgIHN0ZGluX3JlYWRhYmxlID0gMDsKLQkJICAgIG5pYnVmID0gMDsKLQkJfSBlbHNlIGlmIChlcnJubyAhPSBFQUdBSU4gJiYgZXJybm8gIT0gRUlOVFIpIHsKLQkJICAgIGVycm9yKCJFcnJvciB3cml0aW5nIHBzZXVkby10dHkgbWFzdGVyOiAlbSIpOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgfSBlbHNlIHsKLQkJaWJ1ZnAgKz0gbjsKLQkJbmlidWYgLT0gbjsKLQkJaWxldmVsICs9IG47Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIGV4aXQoMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXJlY29yZF93cml0ZShmLCBjb2RlLCBidWYsIG5iLCB0cCkKLSAgICBGSUxFICpmOwotICAgIGludCBjb2RlOwotICAgIHVfY2hhciAqYnVmOwotICAgIGludCBuYjsKLSAgICBzdHJ1Y3QgdGltZXZhbCAqdHA7Ci17Ci0gICAgc3RydWN0IHRpbWV2YWwgbm93OwotICAgIGludCBkaWZmOwotCi0gICAgZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOwotICAgIG5vdy50dl91c2VjIC89IDEwMDAwMDsJLyogYWN0dWFsbHkgMS8xMCBzLCBub3QgdXNlYyBub3cgKi8KLSAgICBkaWZmID0gKG5vdy50dl9zZWMgLSB0cC0+dHZfc2VjKSAqIDEwICsgKG5vdy50dl91c2VjIC0gdHAtPnR2X3VzZWMpOwotICAgIGlmIChkaWZmID4gMCkgewotCWlmIChkaWZmID4gMjU1KSB7Ci0JICAgIHB1dGMoNSwgZik7Ci0JICAgIHB1dGMoZGlmZiA+PiAyNCwgZik7Ci0JICAgIHB1dGMoZGlmZiA+PiAxNiwgZik7Ci0JICAgIHB1dGMoZGlmZiA+PiA4LCBmKTsKLQkgICAgcHV0YyhkaWZmLCBmKTsKLQl9IGVsc2UgewotCSAgICBwdXRjKDYsIGYpOwotCSAgICBwdXRjKGRpZmYsIGYpOwotCX0KLQkqdHAgPSBub3c7Ci0gICAgfQotICAgIHB1dGMoY29kZSwgZik7Ci0gICAgaWYgKGJ1ZiAhPSBOVUxMKSB7Ci0JcHV0YyhuYiA+PiA4LCBmKTsKLQlwdXRjKG5iLCBmKTsKLQlmd3JpdGUoYnVmLCBuYiwgMSwgZik7Ci0gICAgfQotICAgIGZmbHVzaChmKTsKLSAgICBpZiAoZmVycm9yKGYpKSB7Ci0JZXJyb3IoIkVycm9yIHdyaXRpbmcgcmVjb3JkIGZpbGU6ICVtIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvcHBwZC91cGFwLmMgYi9wcHBkL3VwYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE3MzYyMS4uMDAwMDAwMAotLS0gYS9wcHBkL3VwYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDY4MiArMCwwIEBACi0vKgotICogdXBhcC5jIC0gVXNlci9QYXNzd29yZCBBdXRoZW50aWNhdGlvbiBQcm90b2NvbC4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODQtMjAwMCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgbmFtZSAiQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciBwZXJtaXNzaW9uIG9yIGFueSBsZWdhbAotICogICAgZGV0YWlscywgcGxlYXNlIGNvbnRhY3QKLSAqICAgICAgT2ZmaWNlIG9mIFRlY2hub2xvZ3kgVHJhbnNmZXIKLSAqICAgICAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAqICAgICAgNTAwMCBGb3JiZXMgQXZlbnVlCi0gKiAgICAgIFBpdHRzYnVyZ2gsIFBBICAxNTIxMy0zODkwCi0gKiAgICAgICg0MTIpIDI2OC00Mzg3LCBmYXg6ICg0MTIpIDI2OC03Mzk1Ci0gKiAgICAgIHRlY2gtdHJhbnNmZXJAYW5kcmV3LmNtdS5lZHUKLSAqCi0gKiA0LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IENvbXB1dGluZyBTZXJ2aWNlcwotICogICAgIGF0IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IChodHRwOi8vd3d3LmNtdS5lZHUvY29tcHV0aW5nLykuIgotICoKLSAqIENBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotICogVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi0gKiBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi0gKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi0gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jZGVmaW5lIFJDU0lECSIkSWQ6IHVwYXAuYyx2IDEuMzAgMjAwNS8wNy8xMyAxMDo0MTo1OCBwYXVsdXMgRXhwICQiCi0KLS8qCi0gKiBUT0RPOgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAicHBwZC5oIgotI2luY2x1ZGUgInVwYXAuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSA9IFJDU0lEOwotCi1zdGF0aWMgYm9vbCBoaWRlX3Bhc3N3b3JkID0gMTsKLQotLyoKLSAqIENvbW1hbmQtbGluZSBvcHRpb25zLgotICovCi1zdGF0aWMgb3B0aW9uX3QgcGFwX29wdGlvbl9saXN0W10gPSB7Ci0gICAgeyAiaGlkZS1wYXNzd29yZCIsIG9fYm9vbCwgJmhpZGVfcGFzc3dvcmQsCi0gICAgICAiRG9uJ3Qgb3V0cHV0IHBhc3N3b3JkcyB0byBsb2ciLCBPUFRfUFJJTyB8IDEgfSwKLSAgICB7ICJzaG93LXBhc3N3b3JkIiwgb19ib29sLCAmaGlkZV9wYXNzd29yZCwKLSAgICAgICJTaG93IHBhc3N3b3JkIHN0cmluZyBpbiBkZWJ1ZyBsb2cgbWVzc2FnZXMiLCBPUFRfUFJJT1NVQiB8IDAgfSwKLQotICAgIHsgInBhcC1yZXN0YXJ0Iiwgb19pbnQsICZ1cGFwWzBdLnVzX3RpbWVvdXR0aW1lLAotICAgICAgIlNldCByZXRyYW5zbWl0IHRpbWVvdXQgZm9yIFBBUCIsIE9QVF9QUklPIH0sCi0gICAgeyAicGFwLW1heC1hdXRocmVxIiwgb19pbnQsICZ1cGFwWzBdLnVzX21heHRyYW5zbWl0cywKLSAgICAgICJTZXQgbWF4IG51bWJlciBvZiB0cmFuc21pc3Npb25zIGZvciBhdXRoLXJlcXMiLCBPUFRfUFJJTyB9LAotICAgIHsgInBhcC10aW1lb3V0Iiwgb19pbnQsICZ1cGFwWzBdLnVzX3JlcXRpbWVvdXQsCi0gICAgICAiU2V0IHRpbWUgbGltaXQgZm9yIHBlZXIgUEFQIGF1dGhlbnRpY2F0aW9uIiwgT1BUX1BSSU8gfSwKLQotICAgIHsgTlVMTCB9Ci19OwotCi0vKgotICogUHJvdG9jb2wgZW50cnkgcG9pbnRzLgotICovCi1zdGF0aWMgdm9pZCB1cGFwX2luaXQgX19QKChpbnQpKTsKLXN0YXRpYyB2b2lkIHVwYXBfbG93ZXJ1cCBfX1AoKGludCkpOwotc3RhdGljIHZvaWQgdXBhcF9sb3dlcmRvd24gX19QKChpbnQpKTsKLXN0YXRpYyB2b2lkIHVwYXBfaW5wdXQgX19QKChpbnQsIHVfY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHVwYXBfcHJvdHJlaiBfX1AoKGludCkpOwotc3RhdGljIGludCAgdXBhcF9wcmludHBrdCBfX1AoKHVfY2hhciAqLCBpbnQsCi0JCQkgICAgICAgdm9pZCAoKikgX19QKCh2b2lkICosIGNoYXIgKiwgLi4uKSksIHZvaWQgKikpOwotCi1zdHJ1Y3QgcHJvdGVudCBwYXBfcHJvdGVudCA9IHsKLSAgICBQUFBfUEFQLAotICAgIHVwYXBfaW5pdCwKLSAgICB1cGFwX2lucHV0LAotICAgIHVwYXBfcHJvdHJlaiwKLSAgICB1cGFwX2xvd2VydXAsCi0gICAgdXBhcF9sb3dlcmRvd24sCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIHVwYXBfcHJpbnRwa3QsCi0gICAgTlVMTCwKLSAgICAxLAotICAgICJQQVAiLAotICAgIE5VTEwsCi0gICAgcGFwX29wdGlvbl9saXN0LAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMCi19OwotCi11cGFwX3N0YXRlIHVwYXBbTlVNX1BQUF07CQkvKiBVUEFQIHN0YXRlOyBvbmUgZm9yIGVhY2ggdW5pdCAqLwotCi1zdGF0aWMgdm9pZCB1cGFwX3RpbWVvdXQgX19QKCh2b2lkICopKTsKLXN0YXRpYyB2b2lkIHVwYXBfcmVxdGltZW91dCBfX1AoKHZvaWQgKikpOwotc3RhdGljIHZvaWQgdXBhcF9yYXV0aHJlcSBfX1AoKHVwYXBfc3RhdGUgKiwgdV9jaGFyICosIGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCB1cGFwX3JhdXRoYWNrIF9fUCgodXBhcF9zdGF0ZSAqLCB1X2NoYXIgKiwgaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIHVwYXBfcmF1dGhuYWsgX19QKCh1cGFwX3N0YXRlICosIHVfY2hhciAqLCBpbnQsIGludCkpOwotc3RhdGljIHZvaWQgdXBhcF9zYXV0aHJlcSBfX1AoKHVwYXBfc3RhdGUgKikpOwotc3RhdGljIHZvaWQgdXBhcF9zcmVzcCBfX1AoKHVwYXBfc3RhdGUgKiwgaW50LCBpbnQsIGNoYXIgKiwgaW50KSk7Ci0KLQotLyoKLSAqIHVwYXBfaW5pdCAtIEluaXRpYWxpemUgYSBVUEFQIHVuaXQuCi0gKi8KLXN0YXRpYyB2b2lkCi11cGFwX2luaXQodW5pdCkKLSAgICBpbnQgdW5pdDsKLXsKLSAgICB1cGFwX3N0YXRlICp1ID0gJnVwYXBbdW5pdF07Ci0KLSAgICB1LT51c191bml0ID0gdW5pdDsKLSAgICB1LT51c191c2VyID0gTlVMTDsKLSAgICB1LT51c191c2VybGVuID0gMDsKLSAgICB1LT51c19wYXNzd2QgPSBOVUxMOwotICAgIHUtPnVzX3Bhc3N3ZGxlbiA9IDA7Ci0gICAgdS0+dXNfY2xpZW50c3RhdGUgPSBVUEFQQ1NfSU5JVElBTDsKLSAgICB1LT51c19zZXJ2ZXJzdGF0ZSA9IFVQQVBTU19JTklUSUFMOwotICAgIHUtPnVzX2lkID0gMDsKLSAgICB1LT51c190aW1lb3V0dGltZSA9IFVQQVBfREVGVElNRU9VVDsKLSAgICB1LT51c19tYXh0cmFuc21pdHMgPSAxMDsKLSAgICB1LT51c19yZXF0aW1lb3V0ID0gVVBBUF9ERUZSRVFUSU1FOwotfQotCi0KLS8qCi0gKiB1cGFwX2F1dGh3aXRocGVlciAtIEF1dGhlbnRpY2F0ZSB1cyB3aXRoIG91ciBwZWVyIChzdGFydCBjbGllbnQpLgotICoKLSAqIFNldCBuZXcgc3RhdGUgYW5kIHNlbmQgYXV0aGVudGljYXRlJ3MuCi0gKi8KLXZvaWQKLXVwYXBfYXV0aHdpdGhwZWVyKHVuaXQsIHVzZXIsIHBhc3N3b3JkKQotICAgIGludCB1bml0OwotICAgIGNoYXIgKnVzZXIsICpwYXNzd29yZDsKLXsKLSAgICB1cGFwX3N0YXRlICp1ID0gJnVwYXBbdW5pdF07Ci0KLSAgICAvKiBTYXZlIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgd2UncmUgZ2l2ZW4gKi8KLSAgICB1LT51c191c2VyID0gdXNlcjsKLSAgICB1LT51c191c2VybGVuID0gc3RybGVuKHVzZXIpOwotICAgIHUtPnVzX3Bhc3N3ZCA9IHBhc3N3b3JkOwotICAgIHUtPnVzX3Bhc3N3ZGxlbiA9IHN0cmxlbihwYXNzd29yZCk7Ci0gICAgdS0+dXNfdHJhbnNtaXRzID0gMDsKLQotICAgIC8qIExvd2VyIGxheWVyIHVwIHlldD8gKi8KLSAgICBpZiAodS0+dXNfY2xpZW50c3RhdGUgPT0gVVBBUENTX0lOSVRJQUwgfHwKLQl1LT51c19jbGllbnRzdGF0ZSA9PSBVUEFQQ1NfUEVORElORykgewotCXUtPnVzX2NsaWVudHN0YXRlID0gVVBBUENTX1BFTkRJTkc7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIHVwYXBfc2F1dGhyZXEodSk7CQkJLyogU3RhcnQgcHJvdG9jb2wgKi8KLX0KLQotCi0vKgotICogdXBhcF9hdXRocGVlciAtIEF1dGhlbnRpY2F0ZSBvdXIgcGVlciAoc3RhcnQgc2VydmVyKS4KLSAqCi0gKiBTZXQgbmV3IHN0YXRlLgotICovCi12b2lkCi11cGFwX2F1dGhwZWVyKHVuaXQpCi0gICAgaW50IHVuaXQ7Ci17Ci0gICAgdXBhcF9zdGF0ZSAqdSA9ICZ1cGFwW3VuaXRdOwotCi0gICAgLyogTG93ZXIgbGF5ZXIgdXAgeWV0PyAqLwotICAgIGlmICh1LT51c19zZXJ2ZXJzdGF0ZSA9PSBVUEFQU1NfSU5JVElBTCB8fAotCXUtPnVzX3NlcnZlcnN0YXRlID09IFVQQVBTU19QRU5ESU5HKSB7Ci0JdS0+dXNfc2VydmVyc3RhdGUgPSBVUEFQU1NfUEVORElORzsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgdS0+dXNfc2VydmVyc3RhdGUgPSBVUEFQU1NfTElTVEVOOwotICAgIGlmICh1LT51c19yZXF0aW1lb3V0ID4gMCkKLQlUSU1FT1VUKHVwYXBfcmVxdGltZW91dCwgdSwgdS0+dXNfcmVxdGltZW91dCk7Ci19Ci0KLQotLyoKLSAqIHVwYXBfdGltZW91dCAtIFJldHJhbnNtaXNzaW9uIHRpbWVyIGZvciBzZW5kaW5nIGF1dGgtcmVxcyBleHBpcmVkLgotICovCi1zdGF0aWMgdm9pZAotdXBhcF90aW1lb3V0KGFyZykKLSAgICB2b2lkICphcmc7Ci17Ci0gICAgdXBhcF9zdGF0ZSAqdSA9ICh1cGFwX3N0YXRlICopIGFyZzsKLQotICAgIGlmICh1LT51c19jbGllbnRzdGF0ZSAhPSBVUEFQQ1NfQVVUSFJFUSkKLQlyZXR1cm47Ci0KLSAgICBpZiAodS0+dXNfdHJhbnNtaXRzID49IHUtPnVzX21heHRyYW5zbWl0cykgewotCS8qIGdpdmUgdXAgaW4gZGlzZ3VzdCAqLwotCWVycm9yKCJObyByZXNwb25zZSB0byBQQVAgYXV0aGVudGljYXRlLXJlcXVlc3RzIik7Ci0JdS0+dXNfY2xpZW50c3RhdGUgPSBVUEFQQ1NfQkFEQVVUSDsKLQlhdXRoX3dpdGhwZWVyX2ZhaWwodS0+dXNfdW5pdCwgUFBQX1BBUCk7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIHVwYXBfc2F1dGhyZXEodSk7CQkvKiBTZW5kIEF1dGhlbnRpY2F0ZS1SZXF1ZXN0ICovCi19Ci0KLQotLyoKLSAqIHVwYXBfcmVxdGltZW91dCAtIEdpdmUgdXAgd2FpdGluZyBmb3IgdGhlIHBlZXIgdG8gc2VuZCBhbiBhdXRoLXJlcS4KLSAqLwotc3RhdGljIHZvaWQKLXVwYXBfcmVxdGltZW91dChhcmcpCi0gICAgdm9pZCAqYXJnOwotewotICAgIHVwYXBfc3RhdGUgKnUgPSAodXBhcF9zdGF0ZSAqKSBhcmc7Ci0KLSAgICBpZiAodS0+dXNfc2VydmVyc3RhdGUgIT0gVVBBUFNTX0xJU1RFTikKLQlyZXR1cm47CQkJLyogaHVoPz8gKi8KLQotICAgIGF1dGhfcGVlcl9mYWlsKHUtPnVzX3VuaXQsIFBQUF9QQVApOwotICAgIHUtPnVzX3NlcnZlcnN0YXRlID0gVVBBUFNTX0JBREFVVEg7Ci19Ci0KLQotLyoKLSAqIHVwYXBfbG93ZXJ1cCAtIFRoZSBsb3dlciBsYXllciBpcyB1cC4KLSAqCi0gKiBTdGFydCBhdXRoZW50aWNhdGluZyBpZiBwZW5kaW5nLgotICovCi1zdGF0aWMgdm9pZAotdXBhcF9sb3dlcnVwKHVuaXQpCi0gICAgaW50IHVuaXQ7Ci17Ci0gICAgdXBhcF9zdGF0ZSAqdSA9ICZ1cGFwW3VuaXRdOwotCi0gICAgaWYgKHUtPnVzX2NsaWVudHN0YXRlID09IFVQQVBDU19JTklUSUFMKQotCXUtPnVzX2NsaWVudHN0YXRlID0gVVBBUENTX0NMT1NFRDsKLSAgICBlbHNlIGlmICh1LT51c19jbGllbnRzdGF0ZSA9PSBVUEFQQ1NfUEVORElORykgewotCXVwYXBfc2F1dGhyZXEodSk7CS8qIHNlbmQgYW4gYXV0aC1yZXF1ZXN0ICovCi0gICAgfQotCi0gICAgaWYgKHUtPnVzX3NlcnZlcnN0YXRlID09IFVQQVBTU19JTklUSUFMKQotCXUtPnVzX3NlcnZlcnN0YXRlID0gVVBBUFNTX0NMT1NFRDsKLSAgICBlbHNlIGlmICh1LT51c19zZXJ2ZXJzdGF0ZSA9PSBVUEFQU1NfUEVORElORykgewotCXUtPnVzX3NlcnZlcnN0YXRlID0gVVBBUFNTX0xJU1RFTjsKLQlpZiAodS0+dXNfcmVxdGltZW91dCA+IDApCi0JICAgIFRJTUVPVVQodXBhcF9yZXF0aW1lb3V0LCB1LCB1LT51c19yZXF0aW1lb3V0KTsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIHVwYXBfbG93ZXJkb3duIC0gVGhlIGxvd2VyIGxheWVyIGlzIGRvd24uCi0gKgotICogQ2FuY2VsIGFsbCB0aW1lb3V0cy4KLSAqLwotc3RhdGljIHZvaWQKLXVwYXBfbG93ZXJkb3duKHVuaXQpCi0gICAgaW50IHVuaXQ7Ci17Ci0gICAgdXBhcF9zdGF0ZSAqdSA9ICZ1cGFwW3VuaXRdOwotCi0gICAgaWYgKHUtPnVzX2NsaWVudHN0YXRlID09IFVQQVBDU19BVVRIUkVRKQkvKiBUaW1lb3V0IHBlbmRpbmc/ICovCi0JVU5USU1FT1VUKHVwYXBfdGltZW91dCwgdSk7CQkvKiBDYW5jZWwgdGltZW91dCAqLwotICAgIGlmICh1LT51c19zZXJ2ZXJzdGF0ZSA9PSBVUEFQU1NfTElTVEVOICYmIHUtPnVzX3JlcXRpbWVvdXQgPiAwKQotCVVOVElNRU9VVCh1cGFwX3JlcXRpbWVvdXQsIHUpOwotCi0gICAgdS0+dXNfY2xpZW50c3RhdGUgPSBVUEFQQ1NfSU5JVElBTDsKLSAgICB1LT51c19zZXJ2ZXJzdGF0ZSA9IFVQQVBTU19JTklUSUFMOwotfQotCi0KLS8qCi0gKiB1cGFwX3Byb3RyZWogLSBQZWVyIGRvZXNuJ3Qgc3BlYWsgdGhpcyBwcm90b2NvbC4KLSAqCi0gKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4uICBJbiBhbnkgY2FzZSwgcHJldGVuZCBsb3dlciBsYXllciB3ZW50IGRvd24uCi0gKi8KLXN0YXRpYyB2b2lkCi11cGFwX3Byb3RyZWoodW5pdCkKLSAgICBpbnQgdW5pdDsKLXsKLSAgICB1cGFwX3N0YXRlICp1ID0gJnVwYXBbdW5pdF07Ci0KLSAgICBpZiAodS0+dXNfY2xpZW50c3RhdGUgPT0gVVBBUENTX0FVVEhSRVEpIHsKLQllcnJvcigiUEFQIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCBkdWUgdG8gcHJvdG9jb2wtcmVqZWN0Iik7Ci0JYXV0aF93aXRocGVlcl9mYWlsKHVuaXQsIFBQUF9QQVApOwotICAgIH0KLSAgICBpZiAodS0+dXNfc2VydmVyc3RhdGUgPT0gVVBBUFNTX0xJU1RFTikgewotCWVycm9yKCJQQVAgYXV0aGVudGljYXRpb24gb2YgcGVlciBmYWlsZWQgKHByb3RvY29sLXJlamVjdCkiKTsKLQlhdXRoX3BlZXJfZmFpbCh1bml0LCBQUFBfUEFQKTsKLSAgICB9Ci0gICAgdXBhcF9sb3dlcmRvd24odW5pdCk7Ci19Ci0KLQotLyoKLSAqIHVwYXBfaW5wdXQgLSBJbnB1dCBVUEFQIHBhY2tldC4KLSAqLwotc3RhdGljIHZvaWQKLXVwYXBfaW5wdXQodW5pdCwgaW5wYWNrZXQsIGwpCi0gICAgaW50IHVuaXQ7Ci0gICAgdV9jaGFyICppbnBhY2tldDsKLSAgICBpbnQgbDsKLXsKLSAgICB1cGFwX3N0YXRlICp1ID0gJnVwYXBbdW5pdF07Ci0gICAgdV9jaGFyICppbnA7Ci0gICAgdV9jaGFyIGNvZGUsIGlkOwotICAgIGludCBsZW47Ci0KLSAgICAvKgotICAgICAqIFBhcnNlIGhlYWRlciAoY29kZSwgaWQgYW5kIGxlbmd0aCkuCi0gICAgICogSWYgcGFja2V0IHRvbyBzaG9ydCwgZHJvcCBpdC4KLSAgICAgKi8KLSAgICBpbnAgPSBpbnBhY2tldDsKLSAgICBpZiAobCA8IFVQQVBfSEVBREVSTEVOKSB7Ci0JVVBBUERFQlVHKCgicGFwX2lucHV0OiByY3ZkIHNob3J0IGhlYWRlci4iKSk7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBHRVRDSEFSKGNvZGUsIGlucCk7Ci0gICAgR0VUQ0hBUihpZCwgaW5wKTsKLSAgICBHRVRTSE9SVChsZW4sIGlucCk7Ci0gICAgaWYgKGxlbiA8IFVQQVBfSEVBREVSTEVOKSB7Ci0JVVBBUERFQlVHKCgicGFwX2lucHV0OiByY3ZkIGlsbGVnYWwgbGVuZ3RoLiIpKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIGlmIChsZW4gPiBsKSB7Ci0JVVBBUERFQlVHKCgicGFwX2lucHV0OiByY3ZkIHNob3J0IHBhY2tldC4iKSk7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBsZW4gLT0gVVBBUF9IRUFERVJMRU47Ci0KLSAgICAvKgotICAgICAqIEFjdGlvbiBkZXBlbmRzIG9uIGNvZGUuCi0gICAgICovCi0gICAgc3dpdGNoIChjb2RlKSB7Ci0gICAgY2FzZSBVUEFQX0FVVEhSRVE6Ci0JdXBhcF9yYXV0aHJlcSh1LCBpbnAsIGlkLCBsZW4pOwotCWJyZWFrOwotCi0gICAgY2FzZSBVUEFQX0FVVEhBQ0s6Ci0JdXBhcF9yYXV0aGFjayh1LCBpbnAsIGlkLCBsZW4pOwotCWJyZWFrOwotCi0gICAgY2FzZSBVUEFQX0FVVEhOQUs6Ci0JdXBhcF9yYXV0aG5hayh1LCBpbnAsIGlkLCBsZW4pOwotCWJyZWFrOwotCi0gICAgZGVmYXVsdDoJCQkJLyogWFhYIE5lZWQgY29kZSByZWplY3QgKi8KLQlicmVhazsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIHVwYXBfcmF1dGggLSBSZWNlaXZlIEF1dGhlbnRpY2F0ZS4KLSAqLwotc3RhdGljIHZvaWQKLXVwYXBfcmF1dGhyZXEodSwgaW5wLCBpZCwgbGVuKQotICAgIHVwYXBfc3RhdGUgKnU7Ci0gICAgdV9jaGFyICppbnA7Ci0gICAgaW50IGlkOwotICAgIGludCBsZW47Ci17Ci0gICAgdV9jaGFyIHJ1c2VybGVuLCBycGFzc3dkbGVuOwotICAgIGNoYXIgKnJ1c2VyLCAqcnBhc3N3ZDsKLSAgICBjaGFyIHJob3N0bmFtZVsyNTZdOwotICAgIGludCByZXRjb2RlOwotICAgIGNoYXIgKm1zZzsKLSAgICBpbnQgbXNnbGVuOwotCi0gICAgaWYgKHUtPnVzX3NlcnZlcnN0YXRlIDwgVVBBUFNTX0xJU1RFTikKLQlyZXR1cm47Ci0KLSAgICAvKgotICAgICAqIElmIHdlIHJlY2VpdmUgYSBkdXBsaWNhdGUgYXV0aGVudGljYXRlLXJlcXVlc3QsIHdlIGFyZQotICAgICAqIHN1cHBvc2VkIHRvIHJldHVybiB0aGUgc2FtZSBzdGF0dXMgYXMgZm9yIHRoZSBmaXJzdCByZXF1ZXN0LgotICAgICAqLwotICAgIGlmICh1LT51c19zZXJ2ZXJzdGF0ZSA9PSBVUEFQU1NfT1BFTikgewotCXVwYXBfc3Jlc3AodSwgVVBBUF9BVVRIQUNLLCBpZCwgIiIsIDApOwkvKiByZXR1cm4gYXV0aC1hY2sgKi8KLQlyZXR1cm47Ci0gICAgfQotICAgIGlmICh1LT51c19zZXJ2ZXJzdGF0ZSA9PSBVUEFQU1NfQkFEQVVUSCkgewotCXVwYXBfc3Jlc3AodSwgVVBBUF9BVVRITkFLLCBpZCwgIiIsIDApOwkvKiByZXR1cm4gYXV0aC1uYWsgKi8KLQlyZXR1cm47Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBQYXJzZSB1c2VyL3Bhc3N3ZC4KLSAgICAgKi8KLSAgICBpZiAobGVuIDwgMSkgewotCVVQQVBERUJVRygoInBhcF9yYXV0aDogcmN2ZCBzaG9ydCBwYWNrZXQuIikpOwotCXJldHVybjsKLSAgICB9Ci0gICAgR0VUQ0hBUihydXNlcmxlbiwgaW5wKTsKLSAgICBsZW4gLT0gc2l6ZW9mICh1X2NoYXIpICsgcnVzZXJsZW4gKyBzaXplb2YgKHVfY2hhcik7Ci0gICAgaWYgKGxlbiA8IDApIHsKLQlVUEFQREVCVUcoKCJwYXBfcmF1dGg6IHJjdmQgc2hvcnQgcGFja2V0LiIpKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIHJ1c2VyID0gKGNoYXIgKikgaW5wOwotICAgIElOQ1BUUihydXNlcmxlbiwgaW5wKTsKLSAgICBHRVRDSEFSKHJwYXNzd2RsZW4sIGlucCk7Ci0gICAgaWYgKGxlbiA8IHJwYXNzd2RsZW4pIHsKLQlVUEFQREVCVUcoKCJwYXBfcmF1dGg6IHJjdmQgc2hvcnQgcGFja2V0LiIpKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIHJwYXNzd2QgPSAoY2hhciAqKSBpbnA7Ci0KLSAgICAvKgotICAgICAqIENoZWNrIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgZ2l2ZW4uCi0gICAgICovCi0gICAgcmV0Y29kZSA9IGNoZWNrX3Bhc3N3ZCh1LT51c191bml0LCBydXNlciwgcnVzZXJsZW4sIHJwYXNzd2QsCi0JCQkgICBycGFzc3dkbGVuLCAmbXNnKTsKLSAgICBCWkVSTyhycGFzc3dkLCBycGFzc3dkbGVuKTsKLQotICAgIC8qCi0gICAgICogQ2hlY2sgcmVtb3RlIG51bWJlciBhdXRob3JpemF0aW9uLiAgQSBwbHVnaW4gbWF5IGhhdmUgZmlsbGVkIGluCi0gICAgICogdGhlIHJlbW90ZSBudW1iZXIgb3IgYWRkZWQgYW4gYWxsb3dlZCBudW1iZXIsIGFuZCByYXRoZXIgdGhhbgotICAgICAqIHJldHVybiBhbiBhdXRoZW50aWNhdGUgZmFpbHVyZSwgaXMgbGVhdmluZyBpdCBmb3IgdXMgdG8gdmVyaWZ5LgotICAgICAqLwotICAgIGlmIChyZXRjb2RlID09IFVQQVBfQVVUSEFDSykgewotCWlmICghYXV0aF9udW1iZXIoKSkgewotCSAgICAvKiBXZSBkbyBub3Qgd2FudCB0byBsZWFrIGluZm8gYWJvdXQgdGhlIHBhcCByZXN1bHQuICovCi0JICAgIHJldGNvZGUgPSBVUEFQX0FVVEhOQUs7IC8qIFhYWCBleGl0IHZhbHVlIHdpbGwgYmUgIndyb25nIiAqLwotCSAgICB3YXJuKCJjYWxsaW5nIG51bWJlciAlcSBpcyBub3QgYXV0aG9yaXplZCIsIHJlbW90ZV9udW1iZXIpOwotCX0KLSAgICB9Ci0KLSAgICBtc2dsZW4gPSBzdHJsZW4obXNnKTsKLSAgICBpZiAobXNnbGVuID4gMjU1KQotCW1zZ2xlbiA9IDI1NTsKLSAgICB1cGFwX3NyZXNwKHUsIHJldGNvZGUsIGlkLCBtc2csIG1zZ2xlbik7Ci0KLSAgICAvKiBOdWxsIHRlcm1pbmF0ZSBhbmQgY2xlYW4gcmVtb3RlIG5hbWUuICovCi0gICAgc2xwcmludGYocmhvc3RuYW1lLCBzaXplb2Yocmhvc3RuYW1lKSwgIiUuKnYiLCBydXNlcmxlbiwgcnVzZXIpOwotCi0gICAgaWYgKHJldGNvZGUgPT0gVVBBUF9BVVRIQUNLKSB7Ci0JdS0+dXNfc2VydmVyc3RhdGUgPSBVUEFQU1NfT1BFTjsKLQlub3RpY2UoIlBBUCBwZWVyIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRlZCBmb3IgJXEiLCByaG9zdG5hbWUpOwotCWF1dGhfcGVlcl9zdWNjZXNzKHUtPnVzX3VuaXQsIFBQUF9QQVAsIDAsIHJ1c2VyLCBydXNlcmxlbik7Ci0gICAgfSBlbHNlIHsKLQl1LT51c19zZXJ2ZXJzdGF0ZSA9IFVQQVBTU19CQURBVVRIOwotCXdhcm4oIlBBUCBwZWVyIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCBmb3IgJXEiLCByaG9zdG5hbWUpOwotCWF1dGhfcGVlcl9mYWlsKHUtPnVzX3VuaXQsIFBQUF9QQVApOwotICAgIH0KLQotICAgIGlmICh1LT51c19yZXF0aW1lb3V0ID4gMCkKLQlVTlRJTUVPVVQodXBhcF9yZXF0aW1lb3V0LCB1KTsKLX0KLQotCi0vKgotICogdXBhcF9yYXV0aGFjayAtIFJlY2VpdmUgQXV0aGVudGljYXRlLUFjay4KLSAqLwotc3RhdGljIHZvaWQKLXVwYXBfcmF1dGhhY2sodSwgaW5wLCBpZCwgbGVuKQotICAgIHVwYXBfc3RhdGUgKnU7Ci0gICAgdV9jaGFyICppbnA7Ci0gICAgaW50IGlkOwotICAgIGludCBsZW47Ci17Ci0gICAgdV9jaGFyIG1zZ2xlbjsKLSAgICBjaGFyICptc2c7Ci0KLSAgICBpZiAodS0+dXNfY2xpZW50c3RhdGUgIT0gVVBBUENTX0FVVEhSRVEpIC8qIFhYWCAqLwotCXJldHVybjsKLQotICAgIC8qCi0gICAgICogUGFyc2UgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBpZiAobGVuIDwgMSkgewotCVVQQVBERUJVRygoInBhcF9yYXV0aGFjazogaWdub3JpbmcgbWlzc2luZyBtc2ctbGVuZ3RoLiIpKTsKLSAgICB9IGVsc2UgewotCUdFVENIQVIobXNnbGVuLCBpbnApOwotCWlmIChtc2dsZW4gPiAwKSB7Ci0JICAgIGxlbiAtPSBzaXplb2YgKHVfY2hhcik7Ci0JICAgIGlmIChsZW4gPCBtc2dsZW4pIHsKLQkJVVBBUERFQlVHKCgicGFwX3JhdXRoYWNrOiByY3ZkIHNob3J0IHBhY2tldC4iKSk7Ci0JCXJldHVybjsKLQkgICAgfQotCSAgICBtc2cgPSAoY2hhciAqKSBpbnA7Ci0JICAgIFBSSU5UTVNHKG1zZywgbXNnbGVuKTsKLQl9Ci0gICAgfQotCi0gICAgdS0+dXNfY2xpZW50c3RhdGUgPSBVUEFQQ1NfT1BFTjsKLQotICAgIGF1dGhfd2l0aHBlZXJfc3VjY2Vzcyh1LT51c191bml0LCBQUFBfUEFQLCAwKTsKLX0KLQotCi0vKgotICogdXBhcF9yYXV0aG5hayAtIFJlY2VpdmUgQXV0aGVudGljYXRlLU5hay4KLSAqLwotc3RhdGljIHZvaWQKLXVwYXBfcmF1dGhuYWsodSwgaW5wLCBpZCwgbGVuKQotICAgIHVwYXBfc3RhdGUgKnU7Ci0gICAgdV9jaGFyICppbnA7Ci0gICAgaW50IGlkOwotICAgIGludCBsZW47Ci17Ci0gICAgdV9jaGFyIG1zZ2xlbjsKLSAgICBjaGFyICptc2c7Ci0KLSAgICBpZiAodS0+dXNfY2xpZW50c3RhdGUgIT0gVVBBUENTX0FVVEhSRVEpIC8qIFhYWCAqLwotCXJldHVybjsKLQotICAgIC8qCi0gICAgICogUGFyc2UgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBpZiAobGVuIDwgMSkgewotCVVQQVBERUJVRygoInBhcF9yYXV0aG5hazogaWdub3JpbmcgbWlzc2luZyBtc2ctbGVuZ3RoLiIpKTsKLSAgICB9IGVsc2UgewotCUdFVENIQVIobXNnbGVuLCBpbnApOwotCWlmIChtc2dsZW4gPiAwKSB7Ci0JICAgIGxlbiAtPSBzaXplb2YgKHVfY2hhcik7Ci0JICAgIGlmIChsZW4gPCBtc2dsZW4pIHsKLQkJVVBBUERFQlVHKCgicGFwX3JhdXRobmFrOiByY3ZkIHNob3J0IHBhY2tldC4iKSk7Ci0JCXJldHVybjsKLQkgICAgfQotCSAgICBtc2cgPSAoY2hhciAqKSBpbnA7Ci0JICAgIFBSSU5UTVNHKG1zZywgbXNnbGVuKTsKLQl9Ci0gICAgfQotCi0gICAgdS0+dXNfY2xpZW50c3RhdGUgPSBVUEFQQ1NfQkFEQVVUSDsKLQotICAgIGVycm9yKCJQQVAgYXV0aGVudGljYXRpb24gZmFpbGVkIik7Ci0gICAgYXV0aF93aXRocGVlcl9mYWlsKHUtPnVzX3VuaXQsIFBQUF9QQVApOwotfQotCi0KLS8qCi0gKiB1cGFwX3NhdXRocmVxIC0gU2VuZCBhbiBBdXRoZW50aWNhdGUtUmVxdWVzdC4KLSAqLwotc3RhdGljIHZvaWQKLXVwYXBfc2F1dGhyZXEodSkKLSAgICB1cGFwX3N0YXRlICp1OwotewotICAgIHVfY2hhciAqb3V0cDsKLSAgICBpbnQgb3V0bGVuOwotCi0gICAgb3V0bGVuID0gVVBBUF9IRUFERVJMRU4gKyAyICogc2l6ZW9mICh1X2NoYXIpICsKLQl1LT51c191c2VybGVuICsgdS0+dXNfcGFzc3dkbGVuOwotICAgIG91dHAgPSBvdXRwYWNrZXRfYnVmOwotICAgIAotICAgIE1BS0VIRUFERVIob3V0cCwgUFBQX1BBUCk7Ci0KLSAgICBQVVRDSEFSKFVQQVBfQVVUSFJFUSwgb3V0cCk7Ci0gICAgUFVUQ0hBUigrK3UtPnVzX2lkLCBvdXRwKTsKLSAgICBQVVRTSE9SVChvdXRsZW4sIG91dHApOwotICAgIFBVVENIQVIodS0+dXNfdXNlcmxlbiwgb3V0cCk7Ci0gICAgQkNPUFkodS0+dXNfdXNlciwgb3V0cCwgdS0+dXNfdXNlcmxlbik7Ci0gICAgSU5DUFRSKHUtPnVzX3VzZXJsZW4sIG91dHApOwotICAgIFBVVENIQVIodS0+dXNfcGFzc3dkbGVuLCBvdXRwKTsKLSAgICBCQ09QWSh1LT51c19wYXNzd2QsIG91dHAsIHUtPnVzX3Bhc3N3ZGxlbik7Ci0KLSAgICBvdXRwdXQodS0+dXNfdW5pdCwgb3V0cGFja2V0X2J1Ziwgb3V0bGVuICsgUFBQX0hEUkxFTik7Ci0KLSAgICBUSU1FT1VUKHVwYXBfdGltZW91dCwgdSwgdS0+dXNfdGltZW91dHRpbWUpOwotICAgICsrdS0+dXNfdHJhbnNtaXRzOwotICAgIHUtPnVzX2NsaWVudHN0YXRlID0gVVBBUENTX0FVVEhSRVE7Ci19Ci0KLQotLyoKLSAqIHVwYXBfc3Jlc3AgLSBTZW5kIGEgcmVzcG9uc2UgKGFjayBvciBuYWspLgotICovCi1zdGF0aWMgdm9pZAotdXBhcF9zcmVzcCh1LCBjb2RlLCBpZCwgbXNnLCBtc2dsZW4pCi0gICAgdXBhcF9zdGF0ZSAqdTsKLSAgICB1X2NoYXIgY29kZSwgaWQ7Ci0gICAgY2hhciAqbXNnOwotICAgIGludCBtc2dsZW47Ci17Ci0gICAgdV9jaGFyICpvdXRwOwotICAgIGludCBvdXRsZW47Ci0KLSAgICBvdXRsZW4gPSBVUEFQX0hFQURFUkxFTiArIHNpemVvZiAodV9jaGFyKSArIG1zZ2xlbjsKLSAgICBvdXRwID0gb3V0cGFja2V0X2J1ZjsKLSAgICBNQUtFSEVBREVSKG91dHAsIFBQUF9QQVApOwotCi0gICAgUFVUQ0hBUihjb2RlLCBvdXRwKTsKLSAgICBQVVRDSEFSKGlkLCBvdXRwKTsKLSAgICBQVVRTSE9SVChvdXRsZW4sIG91dHApOwotICAgIFBVVENIQVIobXNnbGVuLCBvdXRwKTsKLSAgICBCQ09QWShtc2csIG91dHAsIG1zZ2xlbik7Ci0gICAgb3V0cHV0KHUtPnVzX3VuaXQsIG91dHBhY2tldF9idWYsIG91dGxlbiArIFBQUF9IRFJMRU4pOwotfQotCi0vKgotICogdXBhcF9wcmludHBrdCAtIHByaW50IHRoZSBjb250ZW50cyBvZiBhIFBBUCBwYWNrZXQuCi0gKi8KLXN0YXRpYyBjaGFyICp1cGFwX2NvZGVuYW1lc1tdID0gewotICAgICJBdXRoUmVxIiwgIkF1dGhBY2siLCAiQXV0aE5hayIKLX07Ci0KLXN0YXRpYyBpbnQKLXVwYXBfcHJpbnRwa3QocCwgcGxlbiwgcHJpbnRlciwgYXJnKQotICAgIHVfY2hhciAqcDsKLSAgICBpbnQgcGxlbjsKLSAgICB2b2lkICgqcHJpbnRlcikgX19QKCh2b2lkICosIGNoYXIgKiwgLi4uKSk7Ci0gICAgdm9pZCAqYXJnOwotewotICAgIGludCBjb2RlLCBpZCwgbGVuOwotICAgIGludCBtbGVuLCB1bGVuLCB3bGVuOwotICAgIGNoYXIgKnVzZXIsICpwd2QsICptc2c7Ci0gICAgdV9jaGFyICpwc3RhcnQ7Ci0KLSAgICBpZiAocGxlbiA8IFVQQVBfSEVBREVSTEVOKQotCXJldHVybiAwOwotICAgIHBzdGFydCA9IHA7Ci0gICAgR0VUQ0hBUihjb2RlLCBwKTsKLSAgICBHRVRDSEFSKGlkLCBwKTsKLSAgICBHRVRTSE9SVChsZW4sIHApOwotICAgIGlmIChsZW4gPCBVUEFQX0hFQURFUkxFTiB8fCBsZW4gPiBwbGVuKQotCXJldHVybiAwOwotCi0gICAgaWYgKGNvZGUgPj0gMSAmJiBjb2RlIDw9IHNpemVvZih1cGFwX2NvZGVuYW1lcykgLyBzaXplb2YoY2hhciAqKSkKLQlwcmludGVyKGFyZywgIiAlcyIsIHVwYXBfY29kZW5hbWVzW2NvZGUtMV0pOwotICAgIGVsc2UKLQlwcmludGVyKGFyZywgIiBjb2RlPTB4JXgiLCBjb2RlKTsKLSAgICBwcmludGVyKGFyZywgIiBpZD0weCV4IiwgaWQpOwotICAgIGxlbiAtPSBVUEFQX0hFQURFUkxFTjsKLSAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICBjYXNlIFVQQVBfQVVUSFJFUToKLQlpZiAobGVuIDwgMSkKLQkgICAgYnJlYWs7Ci0JdWxlbiA9IHBbMF07Ci0JaWYgKGxlbiA8IHVsZW4gKyAyKQotCSAgICBicmVhazsKLQl3bGVuID0gcFt1bGVuICsgMV07Ci0JaWYgKGxlbiA8IHVsZW4gKyB3bGVuICsgMikKLQkgICAgYnJlYWs7Ci0JdXNlciA9IChjaGFyICopIChwICsgMSk7Ci0JcHdkID0gKGNoYXIgKikgKHAgKyB1bGVuICsgMik7Ci0JcCArPSB1bGVuICsgd2xlbiArIDI7Ci0JbGVuIC09IHVsZW4gKyB3bGVuICsgMjsKLQlwcmludGVyKGFyZywgIiB1c2VyPSIpOwotCXByaW50X3N0cmluZyh1c2VyLCB1bGVuLCBwcmludGVyLCBhcmcpOwotCXByaW50ZXIoYXJnLCAiIHBhc3N3b3JkPSIpOwotCWlmICghaGlkZV9wYXNzd29yZCkKLQkgICAgcHJpbnRfc3RyaW5nKHB3ZCwgd2xlbiwgcHJpbnRlciwgYXJnKTsKLQllbHNlCi0JICAgIHByaW50ZXIoYXJnLCAiPGhpZGRlbj4iKTsKLQlicmVhazsKLSAgICBjYXNlIFVQQVBfQVVUSEFDSzoKLSAgICBjYXNlIFVQQVBfQVVUSE5BSzoKLQlpZiAobGVuIDwgMSkKLQkgICAgYnJlYWs7Ci0JbWxlbiA9IHBbMF07Ci0JaWYgKGxlbiA8IG1sZW4gKyAxKQotCSAgICBicmVhazsKLQltc2cgPSAoY2hhciAqKSAocCArIDEpOwotCXAgKz0gbWxlbiArIDE7Ci0JbGVuIC09IG1sZW4gKyAxOwotCXByaW50ZXIoYXJnLCAiICIpOwotCXByaW50X3N0cmluZyhtc2csIG1sZW4sIHByaW50ZXIsIGFyZyk7Ci0JYnJlYWs7Ci0gICAgfQotCi0gICAgLyogcHJpbnQgdGhlIHJlc3Qgb2YgdGhlIGJ5dGVzIGluIHRoZSBwYWNrZXQgKi8KLSAgICBmb3IgKDsgbGVuID4gMDsgLS1sZW4pIHsKLQlHRVRDSEFSKGNvZGUsIHApOwotCXByaW50ZXIoYXJnLCAiICUuMngiLCBjb2RlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcCAtIHBzdGFydDsKLX0KZGlmZiAtLWdpdCBhL3BwcGQvdXBhcC5oIGIvcHBwZC91cGFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYjU5ZTkuLjAwMDAwMDAKLS0tIGEvcHBwZC91cGFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIHVwYXAuaCAtIFVzZXIvUGFzc3dvcmQgQXV0aGVudGljYXRpb24gUHJvdG9jb2wgZGVmaW5pdGlvbnMuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTg0LTIwMDAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIG5hbWUgIkNhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3IgcGVybWlzc2lvbiBvciBhbnkgbGVnYWwKLSAqICAgIGRldGFpbHMsIHBsZWFzZSBjb250YWN0Ci0gKiAgICAgIE9mZmljZSBvZiBUZWNobm9sb2d5IFRyYW5zZmVyCi0gKiAgICAgIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5Ci0gKiAgICAgIDUwMDAgRm9yYmVzIEF2ZW51ZQotICogICAgICBQaXR0c2J1cmdoLCBQQSAgMTUyMTMtMzg5MAotICogICAgICAoNDEyKSAyNjgtNDM4NywgZmF4OiAoNDEyKSAyNjgtNzM5NQotICogICAgICB0ZWNoLXRyYW5zZmVyQGFuZHJldy5jbXUuZWR1Ci0gKgotICogNC4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBDb21wdXRpbmcgU2VydmljZXMKLSAqICAgICBhdCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSAoaHR0cDovL3d3dy5jbXUuZWR1L2NvbXB1dGluZy8pLiIKLSAqCi0gKiBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLSAqIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotICogQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIENBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIEJFIExJQUJMRQotICogRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKgotICogJElkOiB1cGFwLmgsdiAxLjggMjAwMi8xMi8wNCAyMzowMzozMyBwYXVsdXMgRXhwICQKLSAqLwotCi0vKgotICogUGFja2V0IGhlYWRlciA9IENvZGUsIGlkLCBsZW5ndGguCi0gKi8KLSNkZWZpbmUgVVBBUF9IRUFERVJMRU4JNAotCi0KLS8qCi0gKiBVUEFQIGNvZGVzLgotICovCi0jZGVmaW5lIFVQQVBfQVVUSFJFUQkxCS8qIEF1dGhlbnRpY2F0ZS1SZXF1ZXN0ICovCi0jZGVmaW5lIFVQQVBfQVVUSEFDSwkyCS8qIEF1dGhlbnRpY2F0ZS1BY2sgKi8KLSNkZWZpbmUgVVBBUF9BVVRITkFLCTMJLyogQXV0aGVudGljYXRlLU5hayAqLwotCi0KLS8qCi0gKiBFYWNoIGludGVyZmFjZSBpcyBkZXNjcmliZWQgYnkgdXBhcCBzdHJ1Y3R1cmUuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHVwYXBfc3RhdGUgewotICAgIGludCB1c191bml0OwkJLyogSW50ZXJmYWNlIHVuaXQgbnVtYmVyICovCi0gICAgY2hhciAqdXNfdXNlcjsJCS8qIFVzZXIgKi8KLSAgICBpbnQgdXNfdXNlcmxlbjsJCS8qIFVzZXIgbGVuZ3RoICovCi0gICAgY2hhciAqdXNfcGFzc3dkOwkJLyogUGFzc3dvcmQgKi8KLSAgICBpbnQgdXNfcGFzc3dkbGVuOwkJLyogUGFzc3dvcmQgbGVuZ3RoICovCi0gICAgaW50IHVzX2NsaWVudHN0YXRlOwkJLyogQ2xpZW50IHN0YXRlICovCi0gICAgaW50IHVzX3NlcnZlcnN0YXRlOwkJLyogU2VydmVyIHN0YXRlICovCi0gICAgdV9jaGFyIHVzX2lkOwkJLyogQ3VycmVudCBpZCAqLwotICAgIGludCB1c190aW1lb3V0dGltZTsJCS8qIFRpbWVvdXQgKHNlY29uZHMpIGZvciBhdXRoLXJlcSByZXRyYW5zLiAqLwotICAgIGludCB1c190cmFuc21pdHM7CQkvKiBOdW1iZXIgb2YgYXV0aC1yZXFzIHNlbnQgKi8KLSAgICBpbnQgdXNfbWF4dHJhbnNtaXRzOwkvKiBNYXhpbXVtIG51bWJlciBvZiBhdXRoLXJlcXMgdG8gc2VuZCAqLwotICAgIGludCB1c19yZXF0aW1lb3V0OwkJLyogVGltZSB0byB3YWl0IGZvciBhdXRoLXJlcSBmcm9tIHBlZXIgKi8KLX0gdXBhcF9zdGF0ZTsKLQotCi0vKgotICogQ2xpZW50IHN0YXRlcy4KLSAqLwotI2RlZmluZSBVUEFQQ1NfSU5JVElBTAkwCS8qIENvbm5lY3Rpb24gZG93biAqLwotI2RlZmluZSBVUEFQQ1NfQ0xPU0VECTEJLyogQ29ubmVjdGlvbiB1cCwgaGF2ZW4ndCByZXF1ZXN0ZWQgYXV0aCAqLwotI2RlZmluZSBVUEFQQ1NfUEVORElORwkyCS8qIENvbm5lY3Rpb24gZG93biwgaGF2ZSByZXF1ZXN0ZWQgYXV0aCAqLwotI2RlZmluZSBVUEFQQ1NfQVVUSFJFUQkzCS8qIFdlJ3ZlIHNlbnQgYW4gQXV0aGVudGljYXRlLVJlcXVlc3QgKi8KLSNkZWZpbmUgVVBBUENTX09QRU4JNAkvKiBXZSd2ZSByZWNlaXZlZCBhbiBBY2sgKi8KLSNkZWZpbmUgVVBBUENTX0JBREFVVEgJNQkvKiBXZSd2ZSByZWNlaXZlZCBhIE5hayAqLwotCi0vKgotICogU2VydmVyIHN0YXRlcy4KLSAqLwotI2RlZmluZSBVUEFQU1NfSU5JVElBTAkwCS8qIENvbm5lY3Rpb24gZG93biAqLwotI2RlZmluZSBVUEFQU1NfQ0xPU0VECTEJLyogQ29ubmVjdGlvbiB1cCwgaGF2ZW4ndCByZXF1ZXN0ZWQgYXV0aCAqLwotI2RlZmluZSBVUEFQU1NfUEVORElORwkyCS8qIENvbm5lY3Rpb24gZG93biwgaGF2ZSByZXF1ZXN0ZWQgYXV0aCAqLwotI2RlZmluZSBVUEFQU1NfTElTVEVOCTMJLyogTGlzdGVuaW5nIGZvciBhbiBBdXRoZW50aWNhdGUgKi8KLSNkZWZpbmUgVVBBUFNTX09QRU4JNAkvKiBXZSd2ZSBzZW50IGFuIEFjayAqLwotI2RlZmluZSBVUEFQU1NfQkFEQVVUSAk1CS8qIFdlJ3ZlIHNlbnQgYSBOYWsgKi8KLQotCi0vKgotICogVGltZW91dHMuCi0gKi8KLSNkZWZpbmUgVVBBUF9ERUZUSU1FT1VUCTMJLyogVGltZW91dCAoc2Vjb25kcykgZm9yIHJldHJhbnNtaXR0aW5nIHJlcSAqLwotI2RlZmluZSBVUEFQX0RFRlJFUVRJTUUJMzAJLyogVGltZSB0byB3YWl0IGZvciBhdXRoLXJlcSBmcm9tIHBlZXIgKi8KLQotZXh0ZXJuIHVwYXBfc3RhdGUgdXBhcFtdOwotCi12b2lkIHVwYXBfYXV0aHdpdGhwZWVyIF9fUCgoaW50LCBjaGFyICosIGNoYXIgKikpOwotdm9pZCB1cGFwX2F1dGhwZWVyIF9fUCgoaW50KSk7Ci0KLWV4dGVybiBzdHJ1Y3QgcHJvdGVudCBwYXBfcHJvdGVudDsKZGlmZiAtLWdpdCBhL3BwcGQvdXRpbHMuYyBiL3BwcGQvdXRpbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBjYzI5Mi4uMDAwMDAwMAotLS0gYS9wcHBkL3V0aWxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUzICswLDAgQEAKLS8qCi0gKiB1dGlscy5jIC0gdmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucyB1c2VkIGluIHBwcGQuCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDIgUGF1bCBNYWNrZXJyYXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBUaGUgbmFtZShzKSBvZiB0aGUgYXV0aG9ycyBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogMy4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBQYXVsIE1hY2tlcnJhcwotICogICAgIDxwYXVsdXNAc2FtYmEub3JnPiIuCi0gKgotICogVEhFIEFVVEhPUlMgT0YgVEhJUyBTT0ZUV0FSRSBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTwotICogVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi0gKiBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi0gKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi0gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jZGVmaW5lIFJDU0lECSIkSWQ6IHV0aWxzLmMsdiAxLjI1IDIwMDgvMDYvMDMgMTI6MDY6MzcgcGF1bHVzIEV4cCAkIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXNsb2cuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDx1dG1wLmg+Ci0jaW5jbHVkZSA8cHdkLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpZmRlZiBTVlI0Ci0jaW5jbHVkZSA8c3lzL21rZGV2Lmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgInBwcGQuaCIKLSNpbmNsdWRlICJmc20uaCIKLSNpbmNsdWRlICJsY3AuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSA9IFJDU0lEOwotCi0jaWYgZGVmaW5lZChTVU5PUzQpCi1leHRlcm4gY2hhciAqc3RyZXJyb3IoKTsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBsb2dpdCBfX1AoKGludCwgY2hhciAqLCB2YV9saXN0KSk7Ci1zdGF0aWMgdm9pZCBsb2dfd3JpdGUgX19QKChpbnQsIGNoYXIgKikpOwotc3RhdGljIHZvaWQgdnNscF9wcmludGVyIF9fUCgodm9pZCAqLCBjaGFyICosIC4uLikpOwotc3RhdGljIHZvaWQgZm9ybWF0X3BhY2tldCBfX1AoKHVfY2hhciAqLCBpbnQsIHByaW50ZXJfZnVuYywgdm9pZCAqKSk7Ci0KLXN0cnVjdCBidWZmZXJfaW5mbyB7Ci0gICAgY2hhciAqcHRyOwotICAgIGludCBsZW47Ci19OwotCi0jaWYgIWRlZmluZWQoX19BTkRST0lEX18pCi0KLS8qCi0gKiBzdHJsY3B5IC0gbGlrZSBzdHJjcHkvc3RybmNweSwgZG9lc24ndCBvdmVyZmxvdyBkZXN0aW5hdGlvbiBidWZmZXIsCi0gKiBhbHdheXMgbGVhdmVzIGRlc3RpbmF0aW9uIG51bGwtdGVybWluYXRlZCAoZm9yIGxlbiA+IDApLgotICovCi1zaXplX3QKLXN0cmxjcHkoZGVzdCwgc3JjLCBsZW4pCi0gICAgY2hhciAqZGVzdDsKLSAgICBjb25zdCBjaGFyICpzcmM7Ci0gICAgc2l6ZV90IGxlbjsKLXsKLSAgICBzaXplX3QgcmV0ID0gc3RybGVuKHNyYyk7Ci0KLSAgICBpZiAobGVuICE9IDApIHsKLQlpZiAocmV0IDwgbGVuKQotCSAgICBzdHJjcHkoZGVzdCwgc3JjKTsKLQllbHNlIHsKLQkgICAgc3RybmNweShkZXN0LCBzcmMsIGxlbiAtIDEpOwotCSAgICBkZXN0W2xlbi0xXSA9IDA7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi0vKgotICogc3RybGNhdCAtIGxpa2Ugc3RyY2F0L3N0cm5jYXQsIGRvZXNuJ3Qgb3ZlcmZsb3cgZGVzdGluYXRpb24gYnVmZmVyLAotICogYWx3YXlzIGxlYXZlcyBkZXN0aW5hdGlvbiBudWxsLXRlcm1pbmF0ZWQgKGZvciBsZW4gPiAwKS4KLSAqLwotc2l6ZV90Ci1zdHJsY2F0KGRlc3QsIHNyYywgbGVuKQotICAgIGNoYXIgKmRlc3Q7Ci0gICAgY29uc3QgY2hhciAqc3JjOwotICAgIHNpemVfdCBsZW47Ci17Ci0gICAgc2l6ZV90IGRsZW4gPSBzdHJsZW4oZGVzdCk7Ci0KLSAgICByZXR1cm4gZGxlbiArIHN0cmxjcHkoZGVzdCArIGRsZW4sIHNyYywgKGxlbiA+IGRsZW4/IGxlbiAtIGRsZW46IDApKTsKLX0KLSNlbmRpZgotCi0KLS8qCi0gKiBzbHByaW50ZiAtIGZvcm1hdCBhIG1lc3NhZ2UgaW50byBhIGJ1ZmZlci4gIExpa2Ugc3ByaW50ZiBleGNlcHQgd2UKLSAqIGFsc28gc3BlY2lmeSB0aGUgbGVuZ3RoIG9mIHRoZSBvdXRwdXQgYnVmZmVyLCBhbmQgd2UgaGFuZGxlCi0gKiAlbSAoZXJyb3IgbWVzc2FnZSksICV2ICh2aXNpYmxlIHN0cmluZyksCi0gKiAlcSAocXVvdGVkIHN0cmluZyksICV0IChjdXJyZW50IHRpbWUpIGFuZCAlSSAoSVAgYWRkcmVzcykgZm9ybWF0cy4KLSAqIERvZXNuJ3QgZG8gZmxvYXRpbmctcG9pbnQgZm9ybWF0cy4KLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFycyBwdXQgaW50byBidWYuCi0gKi8KLWludAotc2xwcmludGYgX19WKChjaGFyICpidWYsIGludCBidWZsZW4sIGNoYXIgKmZtdCwgLi4uKSkKLXsKLSAgICB2YV9saXN0IGFyZ3M7Ci0gICAgaW50IG47Ci0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKQotICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0jZWxzZQotICAgIGNoYXIgKmJ1ZjsKLSAgICBpbnQgYnVmbGVuOwotICAgIGNoYXIgKmZtdDsKLSAgICB2YV9zdGFydChhcmdzKTsKLSAgICBidWYgPSB2YV9hcmcoYXJncywgY2hhciAqKTsKLSAgICBidWZsZW4gPSB2YV9hcmcoYXJncywgaW50KTsKLSAgICBmbXQgPSB2YV9hcmcoYXJncywgY2hhciAqKTsKLSNlbmRpZgotICAgIG4gPSB2c2xwcmludGYoYnVmLCBidWZsZW4sIGZtdCwgYXJncyk7Ci0gICAgdmFfZW5kKGFyZ3MpOwotICAgIHJldHVybiBuOwotfQotCi0vKgotICogdnNscHJpbnRmIC0gbGlrZSBzbHByaW50ZiwgdGFrZXMgYSB2YV9saXN0IGluc3RlYWQgb2YgYSBsaXN0IG9mIGFyZ3MuCi0gKi8KLSNkZWZpbmUgT1VUQ0hBUihjKQkoYnVmbGVuID4gMD8gKC0tYnVmbGVuLCAqYnVmKysgPSAoYykpOiAwKQotCi1pbnQKLXZzbHByaW50ZihidWYsIGJ1ZmxlbiwgZm10LCBhcmdzKQotICAgIGNoYXIgKmJ1ZjsKLSAgICBpbnQgYnVmbGVuOwotICAgIGNoYXIgKmZtdDsKLSAgICB2YV9saXN0IGFyZ3M7Ci17Ci0gICAgaW50IGMsIGksIG47Ci0gICAgaW50IHdpZHRoLCBwcmVjLCBmaWxsY2g7Ci0gICAgaW50IGJhc2UsIGxlbiwgbmVnLCBxdW90ZWQ7Ci0gICAgdW5zaWduZWQgbG9uZyB2YWwgPSAwOwotICAgIGNoYXIgKnN0ciwgKmYsICpidWYwOwotICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0gICAgY2hhciBudW1bMzJdOwotICAgIHRpbWVfdCB0OwotICAgIHVfaW50MzJfdCBpcDsKLSAgICBzdGF0aWMgY2hhciBoZXhjaGFyc1tdID0gIjAxMjM0NTY3ODlhYmNkZWYiOwotICAgIHN0cnVjdCBidWZmZXJfaW5mbyBidWZpbmZvOwotCi0gICAgYnVmMCA9IGJ1ZjsKLSAgICAtLWJ1ZmxlbjsKLSAgICB3aGlsZSAoYnVmbGVuID4gMCkgewotCWZvciAoZiA9IGZtdDsgKmYgIT0gJyUnICYmICpmICE9IDA7ICsrZikKLQkgICAgOwotCWlmIChmID4gZm10KSB7Ci0JICAgIGxlbiA9IGYgLSBmbXQ7Ci0JICAgIGlmIChsZW4gPiBidWZsZW4pCi0JCWxlbiA9IGJ1ZmxlbjsKLQkgICAgbWVtY3B5KGJ1ZiwgZm10LCBsZW4pOwotCSAgICBidWYgKz0gbGVuOwotCSAgICBidWZsZW4gLT0gbGVuOwotCSAgICBmbXQgPSBmOwotCX0KLQlpZiAoKmZtdCA9PSAwKQotCSAgICBicmVhazsKLQljID0gKisrZm10OwotCXdpZHRoID0gMDsKLQlwcmVjID0gLTE7Ci0JZmlsbGNoID0gJyAnOwotCWlmIChjID09ICcwJykgewotCSAgICBmaWxsY2ggPSAnMCc7Ci0JICAgIGMgPSAqKytmbXQ7Ci0JfQotCWlmIChjID09ICcqJykgewotCSAgICB3aWR0aCA9IHZhX2FyZyhhcmdzLCBpbnQpOwotCSAgICBjID0gKisrZm10OwotCX0gZWxzZSB7Ci0JICAgIHdoaWxlIChpc2RpZ2l0KGMpKSB7Ci0JCXdpZHRoID0gd2lkdGggKiAxMCArIGMgLSAnMCc7Ci0JCWMgPSAqKytmbXQ7Ci0JICAgIH0KLQl9Ci0JaWYgKGMgPT0gJy4nKSB7Ci0JICAgIGMgPSAqKytmbXQ7Ci0JICAgIGlmIChjID09ICcqJykgewotCQlwcmVjID0gdmFfYXJnKGFyZ3MsIGludCk7Ci0JCWMgPSAqKytmbXQ7Ci0JICAgIH0gZWxzZSB7Ci0JCXByZWMgPSAwOwotCQl3aGlsZSAoaXNkaWdpdChjKSkgewotCQkgICAgcHJlYyA9IHByZWMgKiAxMCArIGMgLSAnMCc7Ci0JCSAgICBjID0gKisrZm10OwotCQl9Ci0JICAgIH0KLQl9Ci0Jc3RyID0gMDsKLQliYXNlID0gMDsKLQluZWcgPSAwOwotCSsrZm10OwotCXN3aXRjaCAoYykgewotCWNhc2UgJ2wnOgotCSAgICBjID0gKmZtdCsrOwotCSAgICBzd2l0Y2ggKGMpIHsKLQkgICAgY2FzZSAnZCc6Ci0JCXZhbCA9IHZhX2FyZyhhcmdzLCBsb25nKTsKLSNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKQotCQlpZiAoKGxvbmcpdmFsIDwgMCkgewotCQkgICAgbmVnID0gMTsKLQkJICAgIHZhbCA9ICh1bnNpZ25lZCBsb25nKSgtKGxvbmcpdmFsKTsKLQkJfQotI2Vsc2UKLQkJaWYgKHZhbCA8IDApIHsKLQkJICAgIG5lZyA9IDE7Ci0JCSAgICB2YWwgPSAtdmFsOwotCQl9Ci0jZW5kaWYKLQkJYmFzZSA9IDEwOwotCQlicmVhazsKLQkgICAgY2FzZSAndSc6Ci0JCXZhbCA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBsb25nKTsKLQkJYmFzZSA9IDEwOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJT1VUQ0hBUignJScpOwotCQlPVVRDSEFSKCdsJyk7Ci0JCS0tZm10OwkJLyogc28gJWx6IG91dHB1dHMgJWx6IGV0Yy4gKi8KLQkJY29udGludWU7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSAnZCc6Ci0JICAgIGkgPSB2YV9hcmcoYXJncywgaW50KTsKLQkgICAgaWYgKGkgPCAwKSB7Ci0JCW5lZyA9IDE7Ci0JCXZhbCA9IC1pOwotCSAgICB9IGVsc2UKLQkJdmFsID0gaTsKLQkgICAgYmFzZSA9IDEwOwotCSAgICBicmVhazsKLQljYXNlICd1JzoKLQkgICAgdmFsID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGludCk7Ci0JICAgIGJhc2UgPSAxMDsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnbyc6Ci0JICAgIHZhbCA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBpbnQpOwotCSAgICBiYXNlID0gODsKLQkgICAgYnJlYWs7Ci0JY2FzZSAneCc6Ci0JY2FzZSAnWCc6Ci0JICAgIHZhbCA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBpbnQpOwotCSAgICBiYXNlID0gMTY7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ3AnOgotCSAgICB2YWwgPSAodW5zaWduZWQgbG9uZykgdmFfYXJnKGFyZ3MsIHZvaWQgKik7Ci0JICAgIGJhc2UgPSAxNjsKLQkgICAgbmVnID0gMjsKLQkgICAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICAgIHN0ciA9IHZhX2FyZyhhcmdzLCBjaGFyICopOwotCSAgICBicmVhazsKLQljYXNlICdjJzoKLQkgICAgbnVtWzBdID0gdmFfYXJnKGFyZ3MsIGludCk7Ci0JICAgIG51bVsxXSA9IDA7Ci0JICAgIHN0ciA9IG51bTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnbSc6Ci0JICAgIHN0ciA9IHN0cmVycm9yKGVycm5vKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnSSc6Ci0JICAgIGlwID0gdmFfYXJnKGFyZ3MsIHVfaW50MzJfdCk7Ci0JICAgIGlwID0gbnRvaGwoaXApOwotCSAgICBzbHByaW50ZihudW0sIHNpemVvZihudW0pLCAiJWQuJWQuJWQuJWQiLCAoaXAgPj4gMjQpICYgMHhmZiwKLQkJICAgICAoaXAgPj4gMTYpICYgMHhmZiwgKGlwID4+IDgpICYgMHhmZiwgaXAgJiAweGZmKTsKLQkgICAgc3RyID0gbnVtOwotCSAgICBicmVhazsKLQljYXNlICd0JzoKLQkgICAgdGltZSgmdCk7Ci0JICAgIHN0ciA9IGN0aW1lKCZ0KTsKLQkgICAgc3RyICs9IDQ7CQkvKiBjaG9wIG9mZiB0aGUgZGF5IG5hbWUgKi8KLQkgICAgc3RyWzE1XSA9IDA7CS8qIGNob3Agb2ZmIHllYXIgYW5kIG5ld2xpbmUgKi8KLQkgICAgYnJlYWs7Ci0JY2FzZSAndic6CQkvKiAidmlzaWJsZSIgc3RyaW5nICovCi0JY2FzZSAncSc6CQkvKiBxdW90ZWQgc3RyaW5nICovCi0JICAgIHF1b3RlZCA9IGMgPT0gJ3EnOwotCSAgICBwID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGNoYXIgKik7Ci0JICAgIGlmIChwID09IE5VTEwpCi0JCSAgICBwID0gKHVuc2lnbmVkIGNoYXIgKikiPE5VTEw+IjsKLQkgICAgaWYgKGZpbGxjaCA9PSAnMCcgJiYgcHJlYyA+PSAwKSB7Ci0JCW4gPSBwcmVjOwotCSAgICB9IGVsc2UgewotCQlpZiAocHJlYyA+PSAwKSB7Ci0JCSAgICBuID0gc3RybmxlbigoY2hhciAqKXAsIHByZWMpOwotCQl9IGVsc2UgewotCQkgICAgbiA9IHN0cmxlbigoY2hhciAqKXApOwotCQl9Ci0JICAgIH0KLQkgICAgd2hpbGUgKG4gPiAwICYmIGJ1ZmxlbiA+IDApIHsKLQkJYyA9ICpwKys7Ci0JCS0tbjsKLQkJaWYgKCFxdW90ZWQgJiYgYyA+PSAweDgwKSB7Ci0JCSAgICBPVVRDSEFSKCdNJyk7Ci0JCSAgICBPVVRDSEFSKCctJyk7Ci0JCSAgICBjIC09IDB4ODA7Ci0JCX0KLQkJaWYgKHF1b3RlZCAmJiAoYyA9PSAnIicgfHwgYyA9PSAnXFwnKSkKLQkJICAgIE9VVENIQVIoJ1xcJyk7Ci0JCWlmIChjIDwgMHgyMCB8fCAoMHg3ZiA8PSBjICYmIGMgPCAweGEwKSkgewotCQkgICAgaWYgKHF1b3RlZCkgewotCQkJT1VUQ0hBUignXFwnKTsKLQkJCXN3aXRjaCAoYykgewotCQkJY2FzZSAnXHQnOglPVVRDSEFSKCd0Jyk7CWJyZWFrOwotCQkJY2FzZSAnXG4nOglPVVRDSEFSKCduJyk7CWJyZWFrOwotCQkJY2FzZSAnXGInOglPVVRDSEFSKCdiJyk7CWJyZWFrOwotCQkJY2FzZSAnXGYnOglPVVRDSEFSKCdmJyk7CWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCSAgICBPVVRDSEFSKCd4Jyk7Ci0JCQkgICAgT1VUQ0hBUihoZXhjaGFyc1tjID4+IDRdKTsKLQkJCSAgICBPVVRDSEFSKGhleGNoYXJzW2MgJiAweGZdKTsKLQkJCX0KLQkJICAgIH0gZWxzZSB7Ci0JCQlpZiAoYyA9PSAnXHQnKQotCQkJICAgIE9VVENIQVIoYyk7Ci0JCQllbHNlIHsKLQkJCSAgICBPVVRDSEFSKCdeJyk7Ci0JCQkgICAgT1VUQ0hBUihjIF4gMHg0MCk7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0gZWxzZQotCQkgICAgT1VUQ0hBUihjKTsKLQkgICAgfQotCSAgICBjb250aW51ZTsKLQljYXNlICdQJzoJCS8qIHByaW50IFBQUCBwYWNrZXQgKi8KLQkgICAgYnVmaW5mby5wdHIgPSBidWY7Ci0JICAgIGJ1ZmluZm8ubGVuID0gYnVmbGVuICsgMTsKLQkgICAgcCA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBjaGFyICopOwotCSAgICBuID0gdmFfYXJnKGFyZ3MsIGludCk7Ci0JICAgIGZvcm1hdF9wYWNrZXQocCwgbiwgdnNscF9wcmludGVyLCAmYnVmaW5mbyk7Ci0JICAgIGJ1ZiA9IGJ1ZmluZm8ucHRyOwotCSAgICBidWZsZW4gPSBidWZpbmZvLmxlbiAtIDE7Ci0JICAgIGNvbnRpbnVlOwotCWNhc2UgJ0InOgotCSAgICBwID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGNoYXIgKik7Ci0JICAgIGZvciAobiA9IHByZWM7IG4gPiAwOyAtLW4pIHsKLQkJYyA9ICpwKys7Ci0JCWlmIChmaWxsY2ggPT0gJyAnKQotCQkgICAgT1VUQ0hBUignICcpOwotCQlPVVRDSEFSKGhleGNoYXJzWyhjID4+IDQpICYgMHhmXSk7Ci0JCU9VVENIQVIoaGV4Y2hhcnNbYyAmIDB4Zl0pOwotCSAgICB9Ci0JICAgIGNvbnRpbnVlOwotCWRlZmF1bHQ6Ci0JICAgICpidWYrKyA9ICclJzsKLQkgICAgaWYgKGMgIT0gJyUnKQotCQktLWZtdDsJCS8qIHNvICV6IG91dHB1dHMgJXogZXRjLiAqLwotCSAgICAtLWJ1ZmxlbjsKLQkgICAgY29udGludWU7Ci0JfQotCWlmIChiYXNlICE9IDApIHsKLQkgICAgc3RyID0gbnVtICsgc2l6ZW9mKG51bSk7Ci0JICAgICotLXN0ciA9IDA7Ci0JICAgIHdoaWxlIChzdHIgPiBudW0gKyBuZWcpIHsKLQkJKi0tc3RyID0gaGV4Y2hhcnNbdmFsICUgYmFzZV07Ci0JCXZhbCA9IHZhbCAvIGJhc2U7Ci0JCWlmICgtLXByZWMgPD0gMCAmJiB2YWwgPT0gMCkKLQkJICAgIGJyZWFrOwotCSAgICB9Ci0JICAgIHN3aXRjaCAobmVnKSB7Ci0JICAgIGNhc2UgMToKLQkJKi0tc3RyID0gJy0nOwotCQlicmVhazsKLQkgICAgY2FzZSAyOgotCQkqLS1zdHIgPSAneCc7Ci0JCSotLXN0ciA9ICcwJzsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgbGVuID0gbnVtICsgc2l6ZW9mKG51bSkgLSAxIC0gc3RyOwotCX0gZWxzZSB7Ci0JICAgIGxlbiA9IHN0cmxlbihzdHIpOwotCSAgICBpZiAocHJlYyA+PSAwICYmIGxlbiA+IHByZWMpCi0JCWxlbiA9IHByZWM7Ci0JfQotCWlmICh3aWR0aCA+IDApIHsKLQkgICAgaWYgKHdpZHRoID4gYnVmbGVuKQotCQl3aWR0aCA9IGJ1ZmxlbjsKLQkgICAgaWYgKChuID0gd2lkdGggLSBsZW4pID4gMCkgewotCQlidWZsZW4gLT0gbjsKLQkJZm9yICg7IG4gPiAwOyAtLW4pCi0JCSAgICAqYnVmKysgPSBmaWxsY2g7Ci0JICAgIH0KLQl9Ci0JaWYgKGxlbiA+IGJ1ZmxlbikKLQkgICAgbGVuID0gYnVmbGVuOwotCW1lbWNweShidWYsIHN0ciwgbGVuKTsKLQlidWYgKz0gbGVuOwotCWJ1ZmxlbiAtPSBsZW47Ci0gICAgfQotICAgICpidWYgPSAwOwotICAgIHJldHVybiBidWYgLSBidWYwOwotfQotCi0vKgotICogdnNscF9wcmludGVyIC0gdXNlZCBpbiBwcm9jZXNzaW5nIGEgJVAgZm9ybWF0Ci0gKi8KLXN0YXRpYyB2b2lkCi12c2xwX3ByaW50ZXIgX19WKCh2b2lkICphcmcsIGNoYXIgKmZtdCwgLi4uKSkKLXsKLSAgICBpbnQgbjsKLSAgICB2YV9saXN0IHB2YXI7Ci0gICAgc3RydWN0IGJ1ZmZlcl9pbmZvICpiaTsKLQotI2lmIGRlZmluZWQoX19TVERDX18pCi0gICAgdmFfc3RhcnQocHZhciwgZm10KTsKLSNlbHNlCi0gICAgdm9pZCAqYXJnOwotICAgIGNoYXIgKmZtdDsKLSAgICB2YV9zdGFydChwdmFyKTsKLSAgICBhcmcgPSB2YV9hcmcocHZhciwgdm9pZCAqKTsKLSAgICBmbXQgPSB2YV9hcmcocHZhciwgY2hhciAqKTsKLSNlbmRpZgotCi0gICAgYmkgPSAoc3RydWN0IGJ1ZmZlcl9pbmZvICopIGFyZzsKLSAgICBuID0gdnNscHJpbnRmKGJpLT5wdHIsIGJpLT5sZW4sIGZtdCwgcHZhcik7Ci0gICAgdmFfZW5kKHB2YXIpOwotCi0gICAgYmktPnB0ciArPSBuOwotICAgIGJpLT5sZW4gLT0gbjsKLX0KLQotI2lmZGVmIHVudXNlZAotLyoKLSAqIGxvZ19wYWNrZXQgLSBmb3JtYXQgYSBwYWNrZXQgYW5kIGxvZyBpdC4KLSAqLwotCi12b2lkCi1sb2dfcGFja2V0KHAsIGxlbiwgcHJlZml4LCBsZXZlbCkKLSAgICB1X2NoYXIgKnA7Ci0gICAgaW50IGxlbjsKLSAgICBjaGFyICpwcmVmaXg7Ci0gICAgaW50IGxldmVsOwotewotCWluaXRfcHJfbG9nKHByZWZpeCwgbGV2ZWwpOwotCWZvcm1hdF9wYWNrZXQocCwgbGVuLCBwcl9sb2csICZsZXZlbCk7Ci0JZW5kX3ByX2xvZygpOwotfQotI2VuZGlmIC8qIHVudXNlZCAqLwotCi0vKgotICogZm9ybWF0X3BhY2tldCAtIG1ha2UgYSByZWFkYWJsZSByZXByZXNlbnRhdGlvbiBvZiBhIHBhY2tldCwKLSAqIGNhbGxpbmcgYHByaW50ZXIoYXJnLCBmb3JtYXQsIC4uLiknIHRvIG91dHB1dCBpdC4KLSAqLwotc3RhdGljIHZvaWQKLWZvcm1hdF9wYWNrZXQocCwgbGVuLCBwcmludGVyLCBhcmcpCi0gICAgdV9jaGFyICpwOwotICAgIGludCBsZW47Ci0gICAgcHJpbnRlcl9mdW5jIHByaW50ZXI7Ci0gICAgdm9pZCAqYXJnOwotewotICAgIGludCBpLCBuOwotICAgIHVfc2hvcnQgcHJvdG87Ci0gICAgc3RydWN0IHByb3RlbnQgKnByb3RwOwotCi0gICAgaWYgKGxlbiA+PSBQUFBfSERSTEVOICYmIHBbMF0gPT0gUFBQX0FMTFNUQVRJT05TICYmIHBbMV0gPT0gUFBQX1VJKSB7Ci0JcCArPSAyOwotCUdFVFNIT1JUKHByb3RvLCBwKTsKLQlsZW4gLT0gUFBQX0hEUkxFTjsKLQlmb3IgKGkgPSAwOyAocHJvdHAgPSBwcm90b2NvbHNbaV0pICE9IE5VTEw7ICsraSkKLQkgICAgaWYgKHByb3RvID09IHByb3RwLT5wcm90b2NvbCkKLQkJYnJlYWs7Ci0JaWYgKHByb3RwICE9IE5VTEwpIHsKLQkgICAgcHJpbnRlcihhcmcsICJbJXMiLCBwcm90cC0+bmFtZSk7Ci0JICAgIG4gPSAoKnByb3RwLT5wcmludHBrdCkocCwgbGVuLCBwcmludGVyLCBhcmcpOwotCSAgICBwcmludGVyKGFyZywgIl0iKTsKLQkgICAgcCArPSBuOwotCSAgICBsZW4gLT0gbjsKLQl9IGVsc2UgewotCSAgICBmb3IgKGkgPSAwOyAocHJvdHAgPSBwcm90b2NvbHNbaV0pICE9IE5VTEw7ICsraSkKLQkJaWYgKHByb3RvID09IChwcm90cC0+cHJvdG9jb2wgJiB+MHg4MDAwKSkKLQkJICAgIGJyZWFrOwotCSAgICBpZiAocHJvdHAgIT0gMCAmJiBwcm90cC0+ZGF0YV9uYW1lICE9IDApIHsKLQkJcHJpbnRlcihhcmcsICJbJXMgZGF0YV0iLCBwcm90cC0+ZGF0YV9uYW1lKTsKLQkJaWYgKGxlbiA+IDgpCi0JCSAgICBwcmludGVyKGFyZywgIiUuOEIgLi4uIiwgcCk7Ci0JCWVsc2UKLQkJICAgIHByaW50ZXIoYXJnLCAiJS4qQiIsIGxlbiwgcCk7Ci0JCWxlbiA9IDA7Ci0JICAgIH0gZWxzZQotCQlwcmludGVyKGFyZywgIltwcm90bz0weCV4XSIsIHByb3RvKTsKLQl9Ci0gICAgfQotCi0gICAgaWYgKGxlbiA+IDMyKQotCXByaW50ZXIoYXJnLCAiJS4zMkIgLi4uIiwgcCk7Ci0gICAgZWxzZQotCXByaW50ZXIoYXJnLCAiJS4qQiIsIGxlbiwgcCk7Ci19Ci0KLS8qCi0gKiBpbml0X3ByX2xvZywgZW5kX3ByX2xvZyAtIGluaXRpYWxpemUgYW5kIGZpbmlzaCB1c2Ugb2YgcHJfbG9nLgotICovCi0KLXN0YXRpYyBjaGFyIGxpbmVbMjU2XTsJCS8qIGxpbmUgdG8gYmUgbG9nZ2VkIGFjY3VtdWxhdGVkIGhlcmUgKi8KLXN0YXRpYyBjaGFyICpsaW5lcDsJCS8qIGN1cnJlbnQgcG9pbnRlciB3aXRoaW4gbGluZSAqLwotc3RhdGljIGludCBsbGV2ZWw7CQkvKiBsZXZlbCBmb3IgbG9nZ2luZyAqLwotCi12b2lkCi1pbml0X3ByX2xvZyhwcmVmaXgsIGxldmVsKQotICAgICBjb25zdCBjaGFyICpwcmVmaXg7Ci0gICAgIGludCBsZXZlbDsKLXsKLQlsaW5lcCA9IGxpbmU7Ci0JaWYgKHByZWZpeCAhPSBOVUxMKSB7Ci0JCXN0cmxjcHkobGluZSwgcHJlZml4LCBzaXplb2YobGluZSkpOwotCQlsaW5lcCA9IGxpbmUgKyBzdHJsZW4obGluZSk7Ci0JfQotCWxsZXZlbCA9IGxldmVsOwotfQotCi12b2lkCi1lbmRfcHJfbG9nKCkKLXsKLQlpZiAobGluZXAgIT0gbGluZSkgewotCQkqbGluZXAgPSAwOwotCQlsb2dfd3JpdGUobGxldmVsLCBsaW5lKTsKLQl9Ci19Ci0KLS8qCi0gKiBwcl9sb2cgLSBwcmludGVyIHJvdXRpbmUgZm9yIG91dHB1dHRpbmcgdG8gc3lzbG9nCi0gKi8KLXZvaWQKLXByX2xvZyBfX1YoKHZvaWQgKmFyZywgY2hhciAqZm10LCAuLi4pKQotewotCWludCBsLCBuOwotCXZhX2xpc3QgcHZhcjsKLQljaGFyICpwLCAqZW9sOwotCWNoYXIgYnVmWzI1Nl07Ci0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKQotCXZhX3N0YXJ0KHB2YXIsIGZtdCk7Ci0jZWxzZQotCXZvaWQgKmFyZzsKLQljaGFyICpmbXQ7Ci0JdmFfc3RhcnQocHZhcik7Ci0JYXJnID0gdmFfYXJnKHB2YXIsIHZvaWQgKik7Ci0JZm10ID0gdmFfYXJnKHB2YXIsIGNoYXIgKik7Ci0jZW5kaWYKLQotCW4gPSB2c2xwcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBwdmFyKTsKLQl2YV9lbmQocHZhcik7Ci0KLQlwID0gYnVmOwotCWVvbCA9IHN0cmNocihidWYsICdcbicpOwotCWlmIChsaW5lcCAhPSBsaW5lKSB7Ci0JCWwgPSAoZW9sID09IE5VTEwpPyBuOiBlb2wgLSBidWY7Ci0JCWlmIChsaW5lcCArIGwgPCBsaW5lICsgc2l6ZW9mKGxpbmUpKSB7Ci0JCQlpZiAobCA+IDApIHsKLQkJCQltZW1jcHkobGluZXAsIGJ1ZiwgbCk7Ci0JCQkJbGluZXAgKz0gbDsKLQkJCX0KLQkJCWlmIChlb2wgPT0gTlVMTCkKLQkJCQlyZXR1cm47Ci0JCQlwID0gZW9sICsgMTsKLQkJCWVvbCA9IHN0cmNocihwLCAnXG4nKTsKLQkJfQotCQkqbGluZXAgPSAwOwotCQlsb2dfd3JpdGUobGxldmVsLCBsaW5lKTsKLQkJbGluZXAgPSBsaW5lOwotCX0KLQotCXdoaWxlIChlb2wgIT0gTlVMTCkgewotCQkqZW9sID0gMDsKLQkJbG9nX3dyaXRlKGxsZXZlbCwgcCk7Ci0JCXAgPSBlb2wgKyAxOwotCQllb2wgPSBzdHJjaHIocCwgJ1xuJyk7Ci0JfQotCi0JLyogYXNzdW1lcyBzaXplb2YoYnVmKSA8PSBzaXplb2YobGluZSkgKi8KLQlsID0gYnVmICsgbiAtIHA7Ci0JaWYgKGwgPiAwKSB7Ci0JCW1lbWNweShsaW5lLCBwLCBuKTsKLQkJbGluZXAgPSBsaW5lICsgbDsKLQl9Ci19Ci0KLS8qCi0gKiBwcmludF9zdHJpbmcgLSBwcmludCBhIHJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgc3RyaW5nIHVzaW5nCi0gKiBwcmludGVyLgotICovCi12b2lkCi1wcmludF9zdHJpbmcocCwgbGVuLCBwcmludGVyLCBhcmcpCi0gICAgY2hhciAqcDsKLSAgICBpbnQgbGVuOwotICAgIHByaW50ZXJfZnVuYyBwcmludGVyOwotICAgIHZvaWQgKmFyZzsKLXsKLSAgICBpbnQgYzsKLQotICAgIHByaW50ZXIoYXJnLCAiXCIiKTsKLSAgICBmb3IgKDsgbGVuID4gMDsgLS1sZW4pIHsKLQljID0gKnArKzsKLQlpZiAoJyAnIDw9IGMgJiYgYyA8PSAnficpIHsKLQkgICAgaWYgKGMgPT0gJ1xcJyB8fCBjID09ICciJykKLQkJcHJpbnRlcihhcmcsICJcXCIpOwotCSAgICBwcmludGVyKGFyZywgIiVjIiwgYyk7Ci0JfSBlbHNlIHsKLQkgICAgc3dpdGNoIChjKSB7Ci0JICAgIGNhc2UgJ1xuJzoKLQkJcHJpbnRlcihhcmcsICJcXG4iKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgJ1xyJzoKLQkJcHJpbnRlcihhcmcsICJcXHIiKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgJ1x0JzoKLQkJcHJpbnRlcihhcmcsICJcXHQiKTsKLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCXByaW50ZXIoYXJnLCAiXFwlLjNvIiwgYyk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIHByaW50ZXIoYXJnLCAiXCIiKTsKLX0KLQotLyoKLSAqIGxvZ2l0IC0gZG9lcyB0aGUgaGFyZCB3b3JrIGZvciBmYXRhbCBldCBhbC4KLSAqLwotc3RhdGljIHZvaWQKLWxvZ2l0KGxldmVsLCBmbXQsIGFyZ3MpCi0gICAgaW50IGxldmVsOwotICAgIGNoYXIgKmZtdDsKLSAgICB2YV9saXN0IGFyZ3M7Ci17Ci0gICAgY2hhciBidWZbMTAyNF07Ci0KLSAgICB2c2xwcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcmdzKTsKLSAgICBsb2dfd3JpdGUobGV2ZWwsIGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1sb2dfd3JpdGUobGV2ZWwsIGJ1ZikKLSAgICBpbnQgbGV2ZWw7Ci0gICAgY2hhciAqYnVmOwotewotICAgIHN5c2xvZyhsZXZlbCwgIiVzIiwgYnVmKTsKLSAgICBpZiAobG9nX3RvX2ZkID49IDAgJiYgKGxldmVsICE9IExPR19ERUJVRyB8fCBkZWJ1ZykpIHsKLQlpbnQgbiA9IHN0cmxlbihidWYpOwotCi0JaWYgKG4gPiAwICYmIGJ1ZltuLTFdID09ICdcbicpCi0JICAgIC0tbjsKLQlpZiAod3JpdGUobG9nX3RvX2ZkLCBidWYsIG4pICE9IG4KLQkgICAgfHwgd3JpdGUobG9nX3RvX2ZkLCAiXG4iLCAxKSAhPSAxKQotCSAgICBsb2dfdG9fZmQgPSAtMTsKLSAgICB9Ci19Ci0KLS8qCi0gKiBmYXRhbCAtIGxvZyBhbiBlcnJvciBtZXNzYWdlIGFuZCBkaWUgaG9ycmlibHkuCi0gKi8KLXZvaWQKLWZhdGFsIF9fVigoY2hhciAqZm10LCAuLi4pKQotewotICAgIHZhX2xpc3QgcHZhcjsKLQotI2lmIGRlZmluZWQoX19TVERDX18pCi0gICAgdmFfc3RhcnQocHZhciwgZm10KTsKLSNlbHNlCi0gICAgY2hhciAqZm10OwotICAgIHZhX3N0YXJ0KHB2YXIpOwotICAgIGZtdCA9IHZhX2FyZyhwdmFyLCBjaGFyICopOwotI2VuZGlmCi0KLSAgICBsb2dpdChMT0dfRVJSLCBmbXQsIHB2YXIpOwotICAgIHZhX2VuZChwdmFyKTsKLQotICAgIGRpZSgxKTsJCQkvKiBhcyBwcm9taXNlZCAqLwotfQotCi0vKgotICogZXJyb3IgLSBsb2cgYW4gZXJyb3IgbWVzc2FnZS4KLSAqLwotdm9pZAotZXJyb3IgX19WKChjaGFyICpmbXQsIC4uLikpCi17Ci0gICAgdmFfbGlzdCBwdmFyOwotCi0jaWYgZGVmaW5lZChfX1NURENfXykKLSAgICB2YV9zdGFydChwdmFyLCBmbXQpOwotI2Vsc2UKLSAgICBjaGFyICpmbXQ7Ci0gICAgdmFfc3RhcnQocHZhcik7Ci0gICAgZm10ID0gdmFfYXJnKHB2YXIsIGNoYXIgKik7Ci0jZW5kaWYKLQotICAgIGxvZ2l0KExPR19FUlIsIGZtdCwgcHZhcik7Ci0gICAgdmFfZW5kKHB2YXIpOwotICAgICsrZXJyb3JfY291bnQ7Ci19Ci0KLS8qCi0gKiB3YXJuIC0gbG9nIGEgd2FybmluZyBtZXNzYWdlLgotICovCi12b2lkCi13YXJuIF9fVigoY2hhciAqZm10LCAuLi4pKQotewotICAgIHZhX2xpc3QgcHZhcjsKLQotI2lmIGRlZmluZWQoX19TVERDX18pCi0gICAgdmFfc3RhcnQocHZhciwgZm10KTsKLSNlbHNlCi0gICAgY2hhciAqZm10OwotICAgIHZhX3N0YXJ0KHB2YXIpOwotICAgIGZtdCA9IHZhX2FyZyhwdmFyLCBjaGFyICopOwotI2VuZGlmCi0KLSAgICBsb2dpdChMT0dfV0FSTklORywgZm10LCBwdmFyKTsKLSAgICB2YV9lbmQocHZhcik7Ci19Ci0KLS8qCi0gKiBub3RpY2UgLSBsb2cgYSBub3RpY2UtbGV2ZWwgbWVzc2FnZS4KLSAqLwotdm9pZAotbm90aWNlIF9fVigoY2hhciAqZm10LCAuLi4pKQotewotICAgIHZhX2xpc3QgcHZhcjsKLQotI2lmIGRlZmluZWQoX19TVERDX18pCi0gICAgdmFfc3RhcnQocHZhciwgZm10KTsKLSNlbHNlCi0gICAgY2hhciAqZm10OwotICAgIHZhX3N0YXJ0KHB2YXIpOwotICAgIGZtdCA9IHZhX2FyZyhwdmFyLCBjaGFyICopOwotI2VuZGlmCi0KLSAgICBsb2dpdChMT0dfTk9USUNFLCBmbXQsIHB2YXIpOwotICAgIHZhX2VuZChwdmFyKTsKLX0KLQotLyoKLSAqIGluZm8gLSBsb2cgYW4gaW5mb3JtYXRpb25hbCBtZXNzYWdlLgotICovCi12b2lkCi1pbmZvIF9fVigoY2hhciAqZm10LCAuLi4pKQotewotICAgIHZhX2xpc3QgcHZhcjsKLQotI2lmIGRlZmluZWQoX19TVERDX18pCi0gICAgdmFfc3RhcnQocHZhciwgZm10KTsKLSNlbHNlCi0gICAgY2hhciAqZm10OwotICAgIHZhX3N0YXJ0KHB2YXIpOwotICAgIGZtdCA9IHZhX2FyZyhwdmFyLCBjaGFyICopOwotI2VuZGlmCi0KLSAgICBsb2dpdChMT0dfSU5GTywgZm10LCBwdmFyKTsKLSAgICB2YV9lbmQocHZhcik7Ci19Ci0KLS8qCi0gKiBkYmdsb2cgLSBsb2cgYSBkZWJ1ZyBtZXNzYWdlLgotICovCi12b2lkCi1kYmdsb2cgX19WKChjaGFyICpmbXQsIC4uLikpCi17Ci0gICAgdmFfbGlzdCBwdmFyOwotCi0jaWYgZGVmaW5lZChfX1NURENfXykKLSAgICB2YV9zdGFydChwdmFyLCBmbXQpOwotI2Vsc2UKLSAgICBjaGFyICpmbXQ7Ci0gICAgdmFfc3RhcnQocHZhcik7Ci0gICAgZm10ID0gdmFfYXJnKHB2YXIsIGNoYXIgKik7Ci0jZW5kaWYKLQotICAgIGxvZ2l0KExPR19ERUJVRywgZm10LCBwdmFyKTsKLSAgICB2YV9lbmQocHZhcik7Ci19Ci0KLS8qCi0gKiBkdW1wX3BhY2tldCAtIHByaW50IG91dCBhIHBhY2tldCBpbiByZWFkYWJsZSBmb3JtIGlmIGl0IGlzIGludGVyZXN0aW5nLgotICogQXNzdW1lcyBsZW4gPj0gUFBQX0hEUkxFTi4KLSAqLwotdm9pZAotZHVtcF9wYWNrZXQoY29uc3QgY2hhciAqdGFnLCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGVuKQotewotICAgIGludCBwcm90bzsKLQotICAgIGlmICghZGVidWcpCi0JcmV0dXJuOwotCi0gICAgLyoKLSAgICAgKiBkb24ndCBwcmludCBMQ1AgZWNobyByZXF1ZXN0L3JlcGx5IHBhY2tldHMgaWYgZGVidWcgPD0gMQotICAgICAqIGFuZCB0aGUgbGluayBpcyB1cC4KLSAgICAgKi8KLSAgICBwcm90byA9IChwWzJdIDw8IDgpICsgcFszXTsKLSAgICBpZiAoZGVidWcgPD0gMSAmJiB1bnN1Y2Nlc3MgPT0gMCAmJiBwcm90byA9PSBQUFBfTENQCi0JJiYgbGVuID49IFBQUF9IRFJMRU4gKyBIRUFERVJMRU4pIHsKLQl1bnNpZ25lZCBjaGFyICpsY3AgPSBwICsgUFBQX0hEUkxFTjsKLQlpbnQgbCA9IChsY3BbMl0gPDwgOCkgKyBsY3BbM107Ci0KLQlpZiAoKGxjcFswXSA9PSBFQ0hPUkVRIHx8IGxjcFswXSA9PSBFQ0hPUkVQKQotCSAgICAmJiBsID49IEhFQURFUkxFTiAmJiBsIDw9IGxlbiAtIFBQUF9IRFJMRU4pCi0JICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBkYmdsb2coIiVzICVQIiwgdGFnLCBwLCBsZW4pOwotfQotCi0vKgotICogY29tcGxldGVfcmVhZCAtIHJlYWQgYSBmdWxsIGBjb3VudCcgYnl0ZXMgZnJvbSBmZCwKLSAqIHVubGVzcyBlbmQtb2YtZmlsZSBvciBhbiBlcnJvciBvdGhlciB0aGFuIEVJTlRSIGlzIGVuY291bnRlcmVkLgotICovCi1zc2l6ZV90Ci1jb21wbGV0ZV9yZWFkKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc2l6ZV90IGRvbmU7Ci0Jc3NpemVfdCBuYjsKLQljaGFyICpwdHIgPSBidWY7Ci0KLQlmb3IgKGRvbmUgPSAwOyBkb25lIDwgY291bnQ7ICkgewotCQluYiA9IHJlYWQoZmQsIHB0ciwgY291bnQgLSBkb25lKTsKLQkJaWYgKG5iIDwgMCkgewotCQkJaWYgKGVycm5vID09IEVJTlRSKQotCQkJCWNvbnRpbnVlOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmIChuYiA9PSAwKQotCQkJYnJlYWs7Ci0JCWRvbmUgKz0gbmI7Ci0JCXB0ciArPSBuYjsKLQl9Ci0JcmV0dXJuIGRvbmU7Ci19Ci0KLS8qIFByb2NlZHVyZXMgZm9yIGxvY2tpbmcgdGhlIHNlcmlhbCBkZXZpY2UgdXNpbmcgYSBsb2NrIGZpbGUuICovCi0jaWZuZGVmIExPQ0tfRElSCi0jaWZkZWYgX19saW51eF9fCi0jZGVmaW5lIExPQ0tfRElSCSIvdmFyL2xvY2siCi0jZWxzZQotI2lmZGVmIFNWUjQKLSNkZWZpbmUgTE9DS19ESVIJIi92YXIvc3Bvb2wvbG9ja3MiCi0jZWxzZQotI2RlZmluZSBMT0NLX0RJUgkiL3Zhci9zcG9vbC9sb2NrIgotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZiAvKiBMT0NLX0RJUiAqLwotCi1zdGF0aWMgY2hhciBsb2NrX2ZpbGVbTUFYUEFUSExFTl07Ci0KLS8qCi0gKiBsb2NrIC0gY3JlYXRlIGEgbG9jayBmaWxlIGZvciB0aGUgbmFtZWQgZGV2aWNlCi0gKi8KLWludAotbG9jayhkZXYpCi0gICAgY2hhciAqZGV2OwotewotI2lmZGVmIExPQ0tMSUIKLSAgICBpbnQgcmVzdWx0OwotCi0gICAgcmVzdWx0ID0gbWtsb2NrIChkZXYsICh2b2lkICopIDApOwotICAgIGlmIChyZXN1bHQgPT0gMCkgewotCXN0cmxjcHkobG9ja19maWxlLCBkZXYsIHNpemVvZihsb2NrX2ZpbGUpKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0ID4gMCkKLSAgICAgICAgbm90aWNlKCJEZXZpY2UgJXMgaXMgbG9ja2VkIGJ5IHBpZCAlZCIsIGRldiwgcmVzdWx0KTsKLSAgICBlbHNlCi0JZXJyb3IoIkNhbid0IGNyZWF0ZSBsb2NrIGZpbGUgJXMiLCBsb2NrX2ZpbGUpOwotICAgIHJldHVybiAtMTsKLQotI2Vsc2UgLyogTE9DS0xJQiAqLwotCi0gICAgY2hhciBsb2NrX2J1ZmZlclsxMl07Ci0gICAgaW50IGZkLCBwaWQsIG47Ci0KLSNpZmRlZiBTVlI0Ci0gICAgc3RydWN0IHN0YXQgc2J1ZjsKLQotICAgIGlmIChzdGF0KGRldiwgJnNidWYpIDwgMCkgewotCWVycm9yKCJDYW4ndCBnZXQgZGV2aWNlIG51bWJlciBmb3IgJXM6ICVtIiwgZGV2KTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmICgoc2J1Zi5zdF9tb2RlICYgU19JRk1UKSAhPSBTX0lGQ0hSKSB7Ci0JZXJyb3IoIkNhbid0IGxvY2sgJXM6IG5vdCBhIGNoYXJhY3RlciBkZXZpY2UiLCBkZXYpOwotCXJldHVybiAtMTsKLSAgICB9Ci0gICAgc2xwcmludGYobG9ja19maWxlLCBzaXplb2YobG9ja19maWxlKSwgIiVzL0xLLiUwM2QuJTAzZC4lMDNkIiwKLQkgICAgIExPQ0tfRElSLCBtYWpvcihzYnVmLnN0X2RldiksCi0JICAgICBtYWpvcihzYnVmLnN0X3JkZXYpLCBtaW5vcihzYnVmLnN0X3JkZXYpKTsKLSNlbHNlCi0gICAgY2hhciAqcDsKLSAgICBjaGFyIGxvY2tkZXZbTUFYUEFUSExFTl07Ci0KLSAgICBpZiAoKHAgPSBzdHJzdHIoZGV2LCAiZGV2LyIpKSAhPSBOVUxMKSB7Ci0JZGV2ID0gcCArIDQ7Ci0Jc3RybmNweShsb2NrZGV2LCBkZXYsIE1BWFBBVEhMRU4tMSk7Ci0JbG9ja2RldltNQVhQQVRITEVOLTFdID0gMDsKLQl3aGlsZSAoKHAgPSBzdHJyY2hyKGxvY2tkZXYsICcvJykpICE9IE5VTEwpIHsKLQkgICAgKnAgPSAnXyc7Ci0JfQotCWRldiA9IGxvY2tkZXY7Ci0gICAgfSBlbHNlCi0JaWYgKChwID0gc3RycmNocihkZXYsICcvJykpICE9IE5VTEwpCi0JICAgIGRldiA9IHAgKyAxOwotCi0gICAgc2xwcmludGYobG9ja19maWxlLCBzaXplb2YobG9ja19maWxlKSwgIiVzL0xDSy4uJXMiLCBMT0NLX0RJUiwgZGV2KTsKLSNlbmRpZgotCi0gICAgd2hpbGUgKChmZCA9IG9wZW4obG9ja19maWxlLCBPX0VYQ0wgfCBPX0NSRUFUIHwgT19SRFdSLCAwNjQ0KSkgPCAwKSB7Ci0JaWYgKGVycm5vICE9IEVFWElTVCkgewotCSAgICBlcnJvcigiQ2FuJ3QgY3JlYXRlIGxvY2sgZmlsZSAlczogJW0iLCBsb2NrX2ZpbGUpOwotCSAgICBicmVhazsKLQl9Ci0KLQkvKiBSZWFkIHRoZSBsb2NrIGZpbGUgdG8gZmluZCBvdXQgd2hvIGhhcyB0aGUgZGV2aWNlIGxvY2tlZC4gKi8KLQlmZCA9IG9wZW4obG9ja19maWxlLCBPX1JET05MWSwgMCk7Ci0JaWYgKGZkIDwgMCkgewotCSAgICBpZiAoZXJybm8gPT0gRU5PRU5UKSAvKiBUaGlzIGlzIGp1c3QgYSB0aW1pbmcgcHJvYmxlbS4gKi8KLQkJY29udGludWU7Ci0JICAgIGVycm9yKCJDYW4ndCBvcGVuIGV4aXN0aW5nIGxvY2sgZmlsZSAlczogJW0iLCBsb2NrX2ZpbGUpOwotCSAgICBicmVhazsKLQl9Ci0jaWZuZGVmIExPQ0tfQklOQVJZCi0JbiA9IHJlYWQoZmQsIGxvY2tfYnVmZmVyLCAxMSk7Ci0jZWxzZQotCW4gPSByZWFkKGZkLCAmcGlkLCBzaXplb2YocGlkKSk7Ci0jZW5kaWYgLyogTE9DS19CSU5BUlkgKi8KLQljbG9zZShmZCk7Ci0JZmQgPSAtMTsKLQlpZiAobiA8PSAwKSB7Ci0JICAgIGVycm9yKCJDYW4ndCByZWFkIHBpZCBmcm9tIGxvY2sgZmlsZSAlcyIsIGxvY2tfZmlsZSk7Ci0JICAgIGJyZWFrOwotCX0KLQotCS8qIFNlZSBpZiB0aGUgcHJvY2VzcyBzdGlsbCBleGlzdHMuICovCi0jaWZuZGVmIExPQ0tfQklOQVJZCi0JbG9ja19idWZmZXJbbl0gPSAwOwotCXBpZCA9IGF0b2kobG9ja19idWZmZXIpOwotI2VuZGlmIC8qIExPQ0tfQklOQVJZICovCi0JaWYgKHBpZCA9PSBnZXRwaWQoKSkKLQkgICAgcmV0dXJuIDE7CQkvKiBzb21lYm9keSBlbHNlIGxvY2tlZCBpdCBmb3IgdXMgKi8KLQlpZiAocGlkID09IDAKLQkgICAgfHwgKGtpbGwocGlkLCAwKSA9PSAtMSAmJiBlcnJubyA9PSBFU1JDSCkpIHsKLQkgICAgaWYgKHVubGluayAobG9ja19maWxlKSA9PSAwKSB7Ci0JCW5vdGljZSgiUmVtb3ZlZCBzdGFsZSBsb2NrIG9uICVzIChwaWQgJWQpIiwgZGV2LCBwaWQpOwotCQljb250aW51ZTsKLQkgICAgfQotCSAgICB3YXJuKCJDb3VsZG4ndCByZW1vdmUgc3RhbGUgbG9jayBvbiAlcyIsIGRldik7Ci0JfSBlbHNlCi0JICAgIG5vdGljZSgiRGV2aWNlICVzIGlzIGxvY2tlZCBieSBwaWQgJWQiLCBkZXYsIHBpZCk7Ci0JYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKGZkIDwgMCkgewotCWxvY2tfZmlsZVswXSA9IDA7Ci0JcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHBpZCA9IGdldHBpZCgpOwotI2lmbmRlZiBMT0NLX0JJTkFSWQotICAgIHNscHJpbnRmKGxvY2tfYnVmZmVyLCBzaXplb2YobG9ja19idWZmZXIpLCAiJTEwZFxuIiwgcGlkKTsKLSAgICB3cml0ZSAoZmQsIGxvY2tfYnVmZmVyLCAxMSk7Ci0jZWxzZQotICAgIHdyaXRlKGZkLCAmcGlkLCBzaXplb2YgKHBpZCkpOwotI2VuZGlmCi0gICAgY2xvc2UoZmQpOwotICAgIHJldHVybiAwOwotCi0jZW5kaWYKLX0KLQotLyoKLSAqIHJlbG9jayAtIGNhbGxlZCB0byB1cGRhdGUgb3VyIGxvY2tmaWxlIHdoZW4gd2UgYXJlIGFib3V0IHRvIGRldGFjaCwKLSAqIHRodXMgY2hhbmdpbmcgb3VyIHBpZCAod2UgZm9yaywgdGhlIGNoaWxkIGNhcnJpZXMgb24sIGFuZCB0aGUgcGFyZW50IGRpZXMpLgotICogTm90ZSB0aGF0IHRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBwYXJlbnQsIHdpdGggcGlkIGVxdWFsIHRvIHRoZSBwaWQKLSAqIG9mIHRoZSBjaGlsZC4gIFRoaXMgYXZvaWRzIGEgcG90ZW50aWFsIHJhY2Ugd2hpY2ggd291bGQgZXhpc3QgaWYKLSAqIHdlIGhhZCB0aGUgY2hpbGQgcmV3cml0ZSB0aGUgbG9ja2ZpbGUgKHRoZSBwYXJlbnQgbWlnaHQgZGllIGZpcnN0LAotICogYW5kIGFub3RoZXIgcHJvY2VzcyBjb3VsZCB0aGluayB0aGUgbG9jayB3YXMgc3RhbGUgaWYgaXQgY2hlY2tlZAotICogYmV0d2VlbiB3aGVuIHRoZSBwYXJlbnQgZGllZCBhbmQgdGhlIGNoaWxkIHJld3JvdGUgdGhlIGxvY2tmaWxlKS4KLSAqLwotaW50Ci1yZWxvY2socGlkKQotICAgIGludCBwaWQ7Ci17Ci0jaWZkZWYgTE9DS0xJQgotICAgIC8qIFhYWCBpcyB0aGVyZSBhIHdheSB0byBkbyB0aGlzPyAqLwotICAgIHJldHVybiAtMTsKLSNlbHNlIC8qIExPQ0tMSUIgKi8KLQotICAgIGludCBmZDsKLSAgICBjaGFyIGxvY2tfYnVmZmVyWzEyXTsKLQotICAgIGlmIChsb2NrX2ZpbGVbMF0gPT0gMCkKLQlyZXR1cm4gLTE7Ci0gICAgZmQgPSBvcGVuKGxvY2tfZmlsZSwgT19XUk9OTFksIDApOwotICAgIGlmIChmZCA8IDApIHsKLQllcnJvcigiQ291bGRuJ3QgcmVvcGVuIGxvY2sgZmlsZSAlczogJW0iLCBsb2NrX2ZpbGUpOwotCWxvY2tfZmlsZVswXSA9IDA7Ci0JcmV0dXJuIC0xOwotICAgIH0KLQotI2lmbmRlZiBMT0NLX0JJTkFSWQotICAgIHNscHJpbnRmKGxvY2tfYnVmZmVyLCBzaXplb2YobG9ja19idWZmZXIpLCAiJTEwZFxuIiwgcGlkKTsKLSAgICB3cml0ZSAoZmQsIGxvY2tfYnVmZmVyLCAxMSk7Ci0jZWxzZQotICAgIHdyaXRlKGZkLCAmcGlkLCBzaXplb2YocGlkKSk7Ci0jZW5kaWYgLyogTE9DS19CSU5BUlkgKi8KLSAgICBjbG9zZShmZCk7Ci0gICAgcmV0dXJuIDA7Ci0KLSNlbmRpZiAvKiBMT0NLTElCICovCi19Ci0KLS8qCi0gKiB1bmxvY2sgLSByZW1vdmUgb3VyIGxvY2tmaWxlCi0gKi8KLXZvaWQKLXVubG9jaygpCi17Ci0gICAgaWYgKGxvY2tfZmlsZVswXSkgewotI2lmZGVmIExPQ0tMSUIKLQkodm9pZCkgcm1sb2NrKGxvY2tfZmlsZSwgKHZvaWQgKikgMCk7Ci0jZWxzZQotCXVubGluayhsb2NrX2ZpbGUpOwotI2VuZGlmCi0JbG9ja19maWxlWzBdID0gMDsKLSAgICB9Ci19Ci0K